Material utilizado na disciplina de Programação Orientada a Objetos (animações e outros efeitos foram perdidos no carregamento). Ciência da Computação (3o período). Universidade do Vale do Itajaí - Campus Kobrasol.
3. marcello.thiry@gmail.com
Legenda usada nos slides
3
Conceito-chave: definição fundamental no contexto da Orientação a Objetos (OO).
Importante: informações complementares, mas relevantes para o entendimento
da OO.
Atenção: você deve ficar atento para não cair em armadilhas ou falhas de
entendimento.
5. marcello.thiry@gmail.com
E se criarmos outro objeto...
5
umaPessoa e outraPessoa apontam para o mesmo
objeto?
umaPessoa e outraPessoa têm o mesmo estado?
O que isso significa?
7. marcello.thiry@gmail.com
Revisando...
7
umaPessoa e outraPessoa são objetos diferentes
Apontam para áreas de memória diferentes
umaPessoa e outraPessoa podem ter o mesmo estado
num determinado momento
Duas variáveis com o mesmo valor não são a mesma
variável
14. marcello.thiry@gmail.com
Vamos colocar a mão na massa!!!
14
A partir das atividades
anteriores, exercite o que
acabamos de discutir e
tente explicar o resultado
Depois, altere o nome de
umaPessoa e imprima
novamente:
o que aconteceu?
17. marcello.thiry@gmail.com
Antes, vamos voltar a alguns conceitos-chave...
17
O que você entende por reutilização?
Copiar e colar?
Faz sentido?
Qual o risco?
Duplicar código é reutilizar?
18. marcello.thiry@gmail.com
Como você trabalha reutilização?
18
Como você trabalha com sub-rotinas?
Procedimentos
Funções
Parâmetros
E agora, classes e objetos!!!
Lembra da
abstração?
23. marcello.thiry@gmail.com
Voltando a análise....
23
Como um Aluno saberá fazer o que uma Pessoa já faz?
Você já parou para pensar que faz sentido dizer:
Um Aluno é uma Pessoa
Legal, mas como iremos fazer isso acontecer?
24. marcello.thiry@gmail.com
Generalização
24
Relacionamento que indica Herança
O sentido do relacionamento é da classe
mais especializada (subclasse) para a
mais genérica (superclasse)
Aluno é a subclasse (mais especializada)
Pessoa é a superclasse (mais genérica)
25. marcello.thiry@gmail.com
Generalização
25
A subclasse herda todos os atributos e operações da
superclasse
Cada objeto (instância) da subclasse é também uma
instância indireta da superclasse
A superclasse tem um nível de abstração maior do que a
subclasse
33. marcello.thiry@gmail.com
Revendo os tipos de herança
33
Herança simples
A subclasse herda suas características e comportamento de
uma única superclasse
Herança múltipla
A subclasse herda suas características e comportamento de
duas ou mais superclasses
35. marcello.thiry@gmail.com
Herança múltipla em Java
35
A linguagem Java implementa somente herança simples
É possível utilizar Interfaces e Composição para simular
parcialmente aspectos da herança múltipla
Voltaremos a discutir Interfaces e Composição em aulas futuras
Algumas linguagens OO, como C++ e Common Lisp (CLOS) implementam herança múltipla
36. marcello.thiry@gmail.com
Considerações sobre herança múltipla
36
A subclasse precisa ter uma relação “é um” com todas
as suas superclasses
Deve-se utilizar com cuidado para evitar que o modelo
fique confuso e de difícil manutenção
39. marcello.thiry@gmail.com
Você já perguntou sobre...
39
... o significado dos modificadores de visibilidade
“–” e “+” nas classes modeladas com UML?
... a utilidade dos modificadores de acesso
“private” e “public” em Java?
40. marcello.thiry@gmail.com
Visibilidade e modificadores de acesso
40
Notação
visual
Modificador
de acesso
A parte é visível...
+ public
dentro da própria classe e para qualquer
outra classe
– private somente dentro da própria classe
# protected
somente dentro do próprio pacote e das
subclasses em outros pacotes
~ package
somente dentro da própria classe e das
classes dentro do mesmo pacote
41. marcello.thiry@gmail.com
Visibilidade “package” em Java
41
Para representar a visibilidade “package”, você não deve
especificar um modificador de acesso
Quando não é especificado um modificador de acesso, o
Java assume que a visibilidade é do tipo “package”
42. marcello.thiry@gmail.com
Visibilidade “package” em Java
42
Para cada arquivo “.java” deve haver, pelo menos, uma
classe “public” com o mesmo nome do arquivo
As demais classes declaradas no mesmo arquivo devem
ser “package”
Ou seja, não devem especificar um modificador de acesso
44. marcello.thiry@gmail.com
Na prática, adotaremos...
44
As classes serão públicas
Uma única classe em cada arquivo “.java”
Logo, o nome da classe e do arquivo deve ser o mesmo
Atributos serão sempre privados
Operações podem ser “públicas”, “privadas” ou
“protegidas”
Exceções devem ser tratadas com parcimônia!!
45. marcello.thiry@gmail.com
Continuando com a análise...
45
Imagine que você foi contratado para desenvolver um
sistema acadêmico (matrícula, notas, diários, planos de
ensino) para uma universidade
Quais as principais entidades envolvidas?
46. marcello.thiry@gmail.com
Continuando com a análise...
46
Você pensou primeiro em Pessoa ou em Aluno,
Professor, Funcionário, Turma, Disciplina, etc.?
Aluno, Professor e Funcionário são entidades do
mundo real que são percebidas pelos usuários
Não parece fazer sentido criar um objeto Pessoa. Ele
seria genérico demais e sem muita utilidade...
Você concorda?
47. marcello.thiry@gmail.com
Continuando com a análise...
47
Tipicamente, ao analisar os requisitos para desenvolver
um sistema, percebemos primeiro entidades do
domínio de negócio
Entretanto, muitas vezes, estas entidades possuem
similaridades entre si...
Lembra do conceito de classe?
48. marcello.thiry@gmail.com
48
As similaridades entre as entidades podem ser
abstraídas numa superclasse comum
Por exemplo, as classes Aluno, Professor e Funcionário
poderiam compartilhar a superclasse Pessoa
Tente modelar estas classes antes de prosseguir...
Continuando com a análise...
50. marcello.thiry@gmail.com
Classes Concretas e Abstratas
50
Classe Concreta é uma classe que pode ser
instanciada diretamente
Classe Abstrata é uma classe que NÃO pode ser
instanciada diretamente
No nosso exemplo anterior, como você definiria cada
classe?
53. marcello.thiry@gmail.com
Revisando a classe abstrata
53
Classe que não terá objetos instanciados
Quando não faz sentido criar objetos (ex: “Pessoa”)
Pode ser uma classe completa, incluindo atributos,
operações e métodos
Oferece a base para uma hierarquia de classes
Oferece um conjunto de operações e métodos comuns a
todas as subclasses (base para reutilização!!)
54. marcello.thiry@gmail.com
E se adicionarmos Professor...
54
Podemos dizer que um Professor é uma Pessoa?
Claro, mas podemos afirmar também que:
Um Professor é um Funcionário
59. marcello.thiry@gmail.com
Redefinição de operações (override)
59
Considere o seguinte:
Funcionários ganham 3% sobre o valor do
salário bruto a cada triênio
Professores com Doutorado ganham 10% a
mais sobre o valor calculado do triênio
66. marcello.thiry@gmail.com
Redefinição de operações (override)
66
Uma subclasse pode:
Adicionar atributos, operações e relacionamentos
Redefinir operações herdadas (com cuidado!)
A redefinição (ou overriding) ocorre quando um operação
cuja assinatura já tenha sido especificada recebe um novo
método (ou seja, uma nova implementação) em uma classe
derivada (subclasse)
68. marcello.thiry@gmail.com
Abre o olho!!!
68
Entrar no ambiente Sophia
Baixar atividade 04
Ler (antes de perguntar!!) com
atenção as orientações e segui-las
passo a passo
Depois, vocês irão apresentar os
resultados e discutir suas dúvidas!
69. marcello.thiry@gmail.com
Restringindo a redefinição em Java
69
Por default, qualquer operação de uma classe X pode
ser redefinida em quaisquer subclasses de X
Entretanto, a redefinição de uma operação pode ser evitada
com o uso do modificador “final”
70. marcello.thiry@gmail.com
Restringindo a redefinição em Java
70
No nosso exemplo, se a operação getTrienio() da
superclasse Funcionario for declarada como final, você
não poderá redefini-la na subclasse Professor
74. marcello.thiry@gmail.com
Constantes em Java
74
O modificador “final” pode ser usado para definir
constantes em Java
Mas, Iremos dar preferência para definir constantes
com o tipo enum
Tipo especial de classe que permite definir uma variável ou
atributo como um conjunto de constantes predefinidas
75. marcello.thiry@gmail.com
Tipo “enum”
75
A variável ou atributo deve ser igual a um dos valores
que foram predefinidos para ela
Uma vez que elas são constantes, os nomes dos
atributos de um enum devem estar em CAIXA ALTA
78. marcello.thiry@gmail.com
Construtor para o tipo “enum”
78
O construtor para um tipo enum deve ser privado ou
package
Este construtor cria automaticamente as constantes que
são definidas no início do corpo enum
Você não pode invocar diretamente um construtor
enum
84. marcello.thiry@gmail.com
Uma operação abstrata é ...
84
uma operação que não possui um método
A implementação da operação (método) é delegada para as
subclasses
Mas, qual é a vantagem de ter uma operação sem
método?
89. marcello.thiry@gmail.com
Classes e operações abstratas
89
Nem toda classe abstrata precisa ter uma operação
abstrata
Ex: classe “Pessoa”
Toda classe que tem, pelo menos, uma operação
abstrata, deve ser abstrata
95. marcello.thiry@gmail.com
95
“fig” aponta para um
objeto “Retangulo”
“fig” agora aponta
para um objeto “Circulo”
Note que o objeto “fig”
assumiu mais de um tipo
ao longo da execução do
programa
96. marcello.thiry@gmail.com
96
Este tipo de polimorfismo
é conhecido como
“polimorfismo de inclusão”
O “Polimorfismo de Inclusão” é obtido a partir do relacionamento de
generalização/especialização (herança).
Uma variável declarada como sendo do tipo da superclasse pode então
assumir (referenciar) qualquer objeto que tenha sido criado a partir de
suas subclasses.
103. marcello.thiry@gmail.com
Ligação1 (biding)
103
Ligação prematura (early binding) ou ligação estática
(static binding)
Quando o método a ser invocado é definido durante a
compilação do programa
Ligação tardia (late binding) ou ligação dinâmica
(dynamic binding)
Quando o método a ser invocado é definido somente em tempo
de execução do programa
1. Existem autores que utilizam o termo “acomplamento” como tradução de “biding”
104. marcello.thiry@gmail.com
Ligação tardia
104
O polimorfismo só pode ser aplicado se a linguagem de
programação orientada a objetos suportar este
mecanismo
Além de conhecida também como ligação dinâmica, pode
ser ainda denominada ligação em tempo de execução
(runtime biding)
105. marcello.thiry@gmail.com
Ligação tardia em Java
105
Em Java, a ligação tardia é o comportamento padrão
Exceções:
Métodos “final” não podem ser redefinidos e o
polimorfismo não se aplica
Métodos “private” são implicitamente declarados como
“final”
106. marcello.thiry@gmail.com
Vamos trabalhar um pouco...
106
Entrar no ambiente Sophia
Baixar atividade 05
Ler (você já conhece as regras!!)
com atenção as orientações e
segui-las passo a passo
Depois, vocês irão apresentar os
resultados e discutir suas dúvidas!
107. marcello.thiry@gmail.com
Existem diferentes tipos de polimorfismo
107
Inclusão
Polimorfismo
Ad-hoc
(aparente)
Coerção
Paramétrico
Sobrecarga (overload)
Universal
(verdadeiro)
(Cardelli e Wegner, 1985) http://lucacardelli.name/papers/onunderstanding.a4.pdf
108. marcello.thiry@gmail.com
Tipos de polimorfismo
108
Polimorfismo universal ou verdadeiro
Quando uma operação ou tipo trabalha uniformemente
para uma gama de tipos definidos na linguagem
Polimorfismo ad-hoc ou aparente
Quando uma operação ou tipo parece trabalhar para alguns
tipos diferentes e pode se comportar de formas diferentes
para cada tipo (ex: printf do C)
109. marcello.thiry@gmail.com
Polimorfismo paramétrico
109
Classes paramétricas
Permitem que operações e classes operem sobre dados de
diferentes tipos, sem que elas precisem ser reescritas para
cada um dos tipos desejados
Uma operação polimórfica tem um parâmetro de tipo
implícito ou explícito, o qual determina o tipo de
argumento para cada aplicação daquela operação
110. marcello.thiry@gmail.com
110
Template de classe na UML
Objetos desta classe podem ser
declarados para diferentes tipos
(TipoItem) de modo uniforme: o
comportamento será sempre o
mesmo
Parâmetro “Tipo” passado
no momento da declaração
de variáveis “Pilha”
118. marcello.thiry@gmail.com
A superclasse java.lang.Object
118
Base da hierarquia de classes do Java
Qualquer classe Java é uma subclasse (direta ou indireta) da
classe Object
Portanto, qualquer classe que você utiliza ou implementa, herda
atributos e operações da classe Object
http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html
119. marcello.thiry@gmail.com
A superclasse java.lang.Object
119
Você pode redefinir (override) os métodos das
operações de Object
Lembre-se então que qualquer objeto instanciado será
também um objeto Object
Voltaremos a discutir
a classe Object em
aulas futuras
125. marcello.thiry@gmail.com
Sobrecarga (overload)
125
Permite diferentes versões de uma mesma operação
que aparenta funcionar com diferentes tipos
Os tipos não precisam possuir estrutura comum
A assinatura de cada versão da operação deve ser diferente
As versões das operações não têm relacionamento entre si
Classificada como polimorfismo ad-hoc (aparente) ou
não verdadeiro
126. marcello.thiry@gmail.com
Sobrecarga (overload)
126
Bastante utilizado para construtores
Permite instanciar um objeto de várias formas
Oportunidade para diferentes inicializações
Mas, pode ser utilizado com qualquer operação
Pode reduzir a legibilidade do código
Você lembra dos dois construtores que
implementamos para a classe Pilha?
129. marcello.thiry@gmail.com
Coerção
129
Conversões implícitas do Java:
byte para short, int, long ou double
short para int, long, float ou double
char para int, long, float ou double
int para long, float ou double
long para float ou double
float para double
131. marcello.thiry@gmail.com
Revendo o conceito de Interface
Nós já vimos um conceito de Interface
A interface define o conjunto de operações visíveis
(públicas) de uma classe
Define quais operações podem ser invocadas nos objetos de uma
determinada classe
Este conceito também é chamado de “protocolo”
131
132. marcello.thiry@gmail.com
Revendo o conceito de Interface
132
Até agora, a interface estava definida na própria classe
Porém, passaremos a considerar Interface como um
mecanismo a parte
Uma Interface é uma especificação de comportamento (ou
contrato) que implementadores concordam em
implementar
133. marcello.thiry@gmail.com
Revendo o conceito de Interface
133
Uma Interface é similar a uma classe abstrata, onde
todas as operações são também abstratas:
Não pode ser instanciada, pois não possui implementação
própria
Funciona como um contrato
A classe que implementa a Interface deve garantir que todas as
operações da Interface tenham um método (o contrato deve ser
respeitado)
142. marcello.thiry@gmail.com
Considerações sobre Interfaces
142
Não têm construtores, uma vez que não podem ser
instanciadas
Uma mesma interface pode estender uma ou mais
interfaces
Uma mesma classe pode realizar (implementar) várias
interfaces
143. marcello.thiry@gmail.com
Considerações sobre Interfaces
143
Classes que realizam (implementam) uma mesma
interface não precisam compartilhar uma estrutura
comum
Uma interface especifica, usualmente, uma parte
limitada do comportamento de uma classe
A realização (implementação) de uma ou mais classes
não exclui a possibilidade de generalização (herança)
145. marcello.thiry@gmail.com
Exceção (Exception)
145
É um evento que ocorre durante a execução de um
programa e que interrompe o fluxo normal de
instruções
Divisão por zero
Operação matemática inválida
Tentativa de acesso a uma posição inválida em um vetor
Tentativa de acesso a um objeto que não foi criado
etc.
146. marcello.thiry@gmail.com
Exceções em Java
146
Quando um erro ocorre dentro de um método, o
próprio método cria um objeto e o entrega para o
ambiente de execução
Este comportamento é denominado disparar (“throwing”)
uma exceção
O objeto criado é chamado de objeto de exceção e contem
informação sobre o erro, incluindo seu tipo e o estado do
programa quando o erro ocorreu
http://docs.oracle.com/javase/tutorial/essential/exceptions/
147. marcello.thiry@gmail.com
Exceções em Java
Depois que um método dispara (throws) uma exceção,
o ambiente de execução tenta encontrar algum
tratamento para tratá-la
A sequência de possíveis tratamentos para manipular a
exceção é a pilha dos métodos que foram chamados para
chegar até o método onde o erro ocorreu
147
148. marcello.thiry@gmail.com
148
main
Método com tratamento de exceção
Método sem tratamento de exceção
Método onde o erro ocorreu
Chama
método
Chama
método
Chama
método
http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
149. marcello.thiry@gmail.com
149
main
Método com tratamento de exceção
Método sem tratamento de exceção
Método onde o erro ocorreu
Dispara (throws)
exceção
Propaga
exceção
Trata (catches)
a exceção
Procura por
tratamento
implementado
Procura por
tratamento
implementado
http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
151. marcello.thiry@gmail.com
Checked exception
Condições excepcionais que uma aplicação bem escrita
deveria antecipar
A aplicação deve implementar ações para se recuperar
destas condições (ex: usuário solicita a abertura de um
arquivo inexistente)
Portanto, o tratamento de exceções é obrigatório para este
tipo de exceção
151
152. marcello.thiry@gmail.com
Error (unchecked exception)
Condições excepcionais que são "externas" a uma
aplicação que não podem ser antecipadas
Tipicamente, a aplicação não tem como se recuperar destas
condições (ex: uma falha de hardware)
É possível implementar um tratamento para a exceção
152
153. marcello.thiry@gmail.com
Runtime exception (unchecked exception)
Condições excepcionais que são "internas" a uma
aplicação que não podem ser antecipadas
Tipicamente, a aplicação não tem como se recuperar destas
condições (ex: defeitos de programação)
É possível implementar um tratamento para a exceção, mas
o correto seria eliminar o defeito que causou a exceção
153
154. marcello.thiry@gmail.com
Tratamento de exceções
154
Permite que a execução do programa continue mesmo
após a ocorrência de um erro
Aumenta a robustez do programa
Separa o código que define comportamento "normal"
(esperado) do código que realiza tratamento de
exceções
155. marcello.thiry@gmail.com
try...catch
155
1. O código controlado pela cláusula try é
executado
2. Se ocorrer uma exceção, o controle é
desviado para o código dentro da cláusula
catch
3. Se a exceção ocorrida estiver sendo
considerada pela cláusula catch, o código
de tratamento da exceção é executado
(caso contrário, a exceção é repassada ao
ambiente de execução)
4. Se não ocorrer uma exceção, o tratamento
da exceção (catch) não é executado
156. marcello.thiry@gmail.com
try...catch
156
Você pode adicionar quantas cláusulas
catch forem necessárias
Permite tratamento específico para cada
tipo de exceção considerado
objExcecao é o objeto de exceção
criado quando a exceção ocorre
Ele possui várias informações sobre a
exceção
158. marcello.thiry@gmail.com
try...finally
1. O código controlado pela cláusula try é
executado
2. Se ocorrer uma exceção, o controle é
desviado para o código dentro da cláusula
finally que é executado
3. Se não ocorrer uma exceção, após o último
comando dentro da cláusula try, o código
dentro da cláusula finally é executado (ou
seja, o código dentro da cláusula finally é
sempre executado)
158
162. marcello.thiry@gmail.com
Conhecendo as classes de exceção
162
Classe Throwable
http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html
Classe Exception
http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html
Classe RuntimeException
http://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html
Classe Error
http://docs.oracle.com/javase/7/docs/api/java/lang/Error.html
164. marcello.thiry@gmail.com
A cláusula throws
164
Permite especificar exceções que podem ser disparadas
ou propagadas dentro de um determinado método
Você pode forçar (disparar) uma exceção dentro de um
método, usando a cláusula throw
Você pode não desejar tratar a exceção no método atual e
apenas propagá-la para o próximo método
O próximo método pode tratar a exceção ou continuar
propagando
166. marcello.thiry@gmail.com
Forçando uma Exceção
Informa ao compilador que o método da operação
“geraExcecao()” deve, obrigatoriamente:
capturar (catch) a exceção Exception; ou
disparar (throw) uma exceção Exception
171. marcello.thiry@gmail.com
Criando sua própria classe de exceção
Você pode ainda criar suas próprias exceções
Verifique se a plataforma Java já não oferece uma exceção
que atenda às suas necessidades
... ou alguma exceção já criada por outros programadores e
fornecedores
Verifique se a nova exceção será realmente útil
Utilize a palavra Exception ao final do nome da classe criada
(boas práticas de codificação Java)
171
176. marcello.thiry@gmail.com
Shallow copy
Para copiar o objeto A, o objeto B irá copiar todos os
atributos de A
Se o valor do atributo é um objeto, B copiará o endereço de
memória deste objeto (A e B apontarão para o mesmo
objeto)
Se o valor do atributo é um tipo primitivo, B copiará o valor
do tipo primitivo
177. marcello.thiry@gmail.com
Deep copy
Para copiar o objeto A, o objeto B irá copiar todos os
atributos de A
Se o valor do atributo é um objeto, B copiará os dados deste
objeto (A e B não compartilharão objetos)
A contrapartida em relação a uma shallow copy é o desempenho
inferior
Se o valor do atributo é um tipo primitivo, B copiará o valor
do tipo primitivo
178. marcello.thiry@gmail.com
Lazy copy
Combinação das estratégias Shallow e Deep copy
Inicialmente, objetos são copiados via shallow copy
Um contador é mantido para conhecer a quantidade de objetos
copiados
Quando o programa tiver que modificar um objeto, ele
verifica antes se aquele objeto compartilha dados
Se for o caso, uma deep copy é realizada e um novo objeto é
criado antes dele ser modificado
186. marcello.thiry@gmail.com
Referências
186
Grady Booch; Robert A. Maksimchuck; Michael W. Engle; Bobbi
J. Young; Jim Conallen; Kelli A. Houston. Object-oriented analysis
and design with applications. 3rd ed. Addison-Wesley, 2007.
Ricardo Pereira e Silva. UML 2 em Modelagem Orientada a
Objetos. Visual Books, 2007.
Paul J. Deitel; Harvey M. Deitel. Java - Como Programar. 8ª ed.,
Prentice Hall, 2010.
OMG (Object Management Group), OMG Unified Modeling
Language v2.5, 2012.
http://www.omg.org/spec/UML/2.5/Beta1/PDF/