Prof. Marcello Thiry <marcello.thiry@gmail.com>
PROGRAMAÇÃO ORIENTADA
A OBJETOS
Unidade 1 (parte 2)
3º período
marcello.thiry@gmail.com
2
marcello.thiry@gmail.com
Legenda usada nos slides
3
Conceito-chave: definição fundamental no contexto da Orientação a Obje...
marcello.thiry@gmail.com
Você lembra...
4
marcello.thiry@gmail.com
E se criarmos outro objeto...
5
umaPessoa e outraPessoa apontam para o mesmo
objeto?
umaPessoa e ...
marcello.thiry@gmail.com
O que você pensou?
6
E se fizermos
marcello.thiry@gmail.com
Revisando...
7
 umaPessoa e outraPessoa são objetos diferentes
 Apontam para áreas de memória d...
marcello.thiry@gmail.com
Como funciona...
8
Endereço Valor
100 ??
101 ??
102 ??
103 ??
104 ??
105 ??
106 ??
... ...
umaPes...
marcello.thiry@gmail.com
Como funciona...
9
Endereço Valor
100 ??
101 ??
102 ??
103 ??
104 ??
105 ??
106 ??
... ...
umaPes...
marcello.thiry@gmail.com
Como funciona...
10
Endereço Valor
100 ??
101 ??
102 nome = “”
...
...
103
...
200 ??
201 ??
... ...
marcello.thiry@gmail.com
Como funciona...
11
Endereço Valor
100 102
101 ??
102 nome = “”
...
...
103
...
200 ??
201 ??
......
marcello.thiry@gmail.com
Como funciona...
12
Endereço Valor
100 102
101 201
102 nome = “Marcello”
...
...
103
...
200 ??
2...
marcello.thiry@gmail.com
E se...
13
O que você acha que irá acontecer?
Experimente imprimir o nome de umaPessoa
e outraPes...
marcello.thiry@gmail.com
Vamos colocar a mão na massa!!!
14
 A partir das atividades
anteriores, exercite o que
acabamos ...
marcello.thiry@gmail.com
E se tivéssemos algo como...
15
Alguma ideia para implementar esta operação?
marcello.thiry@gmail.com
Aguarde um
pouco mais,
chegaremos
lá...
16
marcello.thiry@gmail.com
Antes, vamos voltar a alguns conceitos-chave...
17
 O que você entende por reutilização?
 Copia...
marcello.thiry@gmail.com
Como você trabalha reutilização?
18
 Como você trabalha com sub-rotinas?
 Procedimentos
 Funçõ...
marcello.thiry@gmail.com
Vamos analisar...
19
marcello.thiry@gmail.com
Vamos analisar...
20
Você sentiu
também!?
marcello.thiry@gmail.com
Duplicação de código...
21
marcello.thiry@gmail.com
Ficou melhor?
22
Mas, falta
alguma coisa?
marcello.thiry@gmail.com
Voltando a análise....
23
 Como um Aluno saberá fazer o que uma Pessoa já faz?
 Você já parou p...
marcello.thiry@gmail.com
Generalização
24
 Relacionamento que indica Herança
 O sentido do relacionamento é da classe
ma...
marcello.thiry@gmail.com
Generalização
25
 A subclasse herda todos os atributos e operações da
superclasse
 Cada objeto ...
marcello.thiry@gmail.com
Generalização / Especialização
26
Sentido da
generalização
Sentido da
especialização
marcello.thiry@gmail.com
Níveis de abstração
27
Abstração
mais alta
Abstração
mais baixa
marcello.thiry@gmail.com
Abstração e reusabilidade
28
Maior
reusabilidade
Menor
reusabilidade
marcello.thiry@gmail.com
Generalização em Java
29
marcello.thiry@gmail.com
Generalização em Java
30
marcello.thiry@gmail.com
Hora de reutilizar...
31
Caiu a ficha?
marcello.thiry@gmail.com
O que essa
figura tem a
ver com herança?
32
marcello.thiry@gmail.com
Revendo os tipos de herança
33
 Herança simples
 A subclasse herda suas características e compo...
marcello.thiry@gmail.com
34
A subclasse
(CarroSubmarino)
herda de duas
superclasses
(Carro e Submarino)
marcello.thiry@gmail.com
Herança múltipla em Java
35
 A linguagem Java implementa somente herança simples
 É possível ut...
marcello.thiry@gmail.com
Considerações sobre herança múltipla
36
 A subclasse precisa ter uma relação “é um” com todas
as...
marcello.thiry@gmail.com
37
“Problema do
diamante”
Você percebe a
ambiguidade?
marcello.thiry@gmail.com
38Linguagens OO que
implementam herança
múltipla devem
fornecer soluções
para mitigar
este proble...
marcello.thiry@gmail.com
Você já perguntou sobre...
39
 ... o significado dos modificadores de visibilidade
“–” e “+” nas...
marcello.thiry@gmail.com
Visibilidade e modificadores de acesso
40
Notação
visual
Modificador
de acesso
A parte é visível....
marcello.thiry@gmail.com
Visibilidade “package” em Java
41
 Para representar a visibilidade “package”, você não deve
espe...
marcello.thiry@gmail.com
Visibilidade “package” em Java
42
 Para cada arquivo “.java” deve haver, pelo menos, uma
classe ...
marcello.thiry@gmail.com
Visibilidade de atributos e operações
43
Modificador na ClasseAlfa ClasseAlfa ClasseBeta SubAlfa ...
marcello.thiry@gmail.com
Na prática, adotaremos...
44
 As classes serão públicas
 Uma única classe em cada arquivo “.jav...
marcello.thiry@gmail.com
Continuando com a análise...
45
 Imagine que você foi contratado para desenvolver um
sistema aca...
marcello.thiry@gmail.com
Continuando com a análise...
46
 Você pensou primeiro em Pessoa ou em Aluno,
Professor, Funcioná...
marcello.thiry@gmail.com
Continuando com a análise...
47
 Tipicamente, ao analisar os requisitos para desenvolver
um sist...
marcello.thiry@gmail.com
48
 As similaridades entre as entidades podem ser
abstraídas numa superclasse comum
 Por exempl...
marcello.thiry@gmail.com
49
O que você acha?
Faz sentido, criamos
objetos Pessoa?
Qual a utilidade?
marcello.thiry@gmail.com
Classes Concretas e Abstratas
50
 Classe Concreta é uma classe que pode ser
instanciada diretame...
marcello.thiry@gmail.com
Classe Abstrata em UML
51
Reparou que o
nome da classe
ficou em itálico?
marcello.thiry@gmail.com
Classe Abstrata em Java
52
A partir de agora, você
não poderá instanciar
objetos Pessoa diretamen...
marcello.thiry@gmail.com
Revisando a classe abstrata
53
 Classe que não terá objetos instanciados
 Quando não faz sentid...
marcello.thiry@gmail.com
E se adicionarmos Professor...
54
 Podemos dizer que um Professor é uma Pessoa?
 Claro, mas pod...
marcello.thiry@gmail.com
Professor na hierarquia de herança
55
marcello.thiry@gmail.com
Vamos analisar um pouco mais...
56
Veja o que você
não entendeu e
pergunte...
marcello.thiry@gmail.com
Valor inicial
57
marcello.thiry@gmail.com
?!?!?!?!
58
Não tínhamos
herdado isso
de Funcionario?
marcello.thiry@gmail.com
Redefinição de operações (override)
59
Considere o seguinte:
 Funcionários ganham 3% sobre o val...
marcello.thiry@gmail.com
Redefinição de operações (override)
60
Na classe Professor...
e...
marcello.thiry@gmail.com
Redefinição de operações (override)
61
Permite chamar a
implementação (método)
da superclasse
marcello.thiry@gmail.com
A classe Funcionario
62
...
...
marcello.thiry@gmail.com
A classe Funcionario
63
...
... Alguma ideia para
implementar?
Lembra do getIdade()?
marcello.thiry@gmail.com
64
Mas, você não
pensou em
simplesmente
copiar o código,
certo?
Certo!?
marcello.thiry@gmail.com
A classe Professor
65
...
...
marcello.thiry@gmail.com
Redefinição de operações (override)
66
 Uma subclasse pode:
 Adicionar atributos, operações e r...
marcello.thiry@gmail.com
Redefinição de operações (override)
67
 A redefinição deve manter a mesma assinatura da operação...
marcello.thiry@gmail.com
Abre o olho!!!
68
 Entrar no ambiente Sophia
 Baixar atividade 04
 Ler (antes de perguntar!!) ...
marcello.thiry@gmail.com
Restringindo a redefinição em Java
69
 Por default, qualquer operação de uma classe X pode
ser r...
marcello.thiry@gmail.com
Restringindo a redefinição em Java
70
 No nosso exemplo, se a operação getTrienio() da
superclas...
marcello.thiry@gmail.com
Modificador “final”
71
 Resumindo, quando você utiliza o modificador “final”, a
operação não pod...
marcello.thiry@gmail.com
Modificador “final”
72
 O modificador “final” também se aplica a atributos
 Nossa política esta...
marcello.thiry@gmail.com
Modificador “final”
73
 Mas, quando utilizado em atributos, o modificador
“final” permite a defi...
marcello.thiry@gmail.com
Constantes em Java
74
 O modificador “final” pode ser usado para definir
constantes em Java
 Ma...
marcello.thiry@gmail.com
Tipo “enum”
75
 A variável ou atributo deve ser igual a um dos valores
que foram predefinidos pa...
marcello.thiry@gmail.com
Declarando um tipo “enum”
76
 Você deve utilizar enum sempre que você precisar
representar um co...
marcello.thiry@gmail.com
Como utilizar o tipo “enum”
77
...
...
marcello.thiry@gmail.com
Construtor para o tipo “enum”
78
 O construtor para um tipo enum deve ser privado ou
package
 E...
marcello.thiry@gmail.com
Tipo “enum”
79
...
marcello.thiry@gmail.com
Tipo “enum”
80
...
marcello.thiry@gmail.com
Como utilizar o tipo “enum”
81
...
...
marcello.thiry@gmail.com
82Rapidinha!
Revise a
implementação
anterior, utilizando
o tipo “enum”
marcello.thiry@gmail.com
Operações abstratas
83
 Nós já vimos o conceito de classe abstrata
 Não é possível instanciar o...
marcello.thiry@gmail.com
Uma operação abstrata é ...
84
 uma operação que não possui um método
 A implementação da opera...
marcello.thiry@gmail.com
85
Como você
implementaria a
operação
“desenhar()”
 Note que a classe Figura é abstrata (represe...
marcello.thiry@gmail.com
86
O que deve ser
desenhado?
Tudo bem, eu não sei
o que desenhar. Mas,
ainda não entendi por
que ...
marcello.thiry@gmail.com
A ideia aqui é garantir
que todas as subclasses
de “Figura” sejam
obrigadas a fornecer
um método ...
marcello.thiry@gmail.com
marcello.thiry@gmail.com
Classes e operações abstratas
89
 Nem toda classe abstrata precisa ter uma operação
abstrata
 E...
marcello.thiry@gmail.com
Operações abstratas
são tipicamente
utilizadas com o
princípio de
polimorfismo!
marcello.thiry@gmail.com
91
Poli... o quê????
marcello.thiry@gmail.com
92
Poli=Muitas
Morfhos=Formas
marcello.thiry@gmail.com
Polimorfismo
93
 Princípio pelo qual entidades de tipos diferentes podem
ser acessadas através d...
marcello.thiry@gmail.com
Polimorfismo
94
 Diferente objetos “Retangulo” e “Circulo” podem ser
acessados através da interf...
marcello.thiry@gmail.com
95
“fig” aponta para um
objeto “Retangulo”
“fig” agora aponta
para um objeto “Circulo”
Note que o...
marcello.thiry@gmail.com
96
Este tipo de polimorfismo
é conhecido como
“polimorfismo de inclusão”
O “Polimorfismo de Inclu...
marcello.thiry@gmail.com
A variável “fig” está limitada
pela interface da classe
“Figura”. Logo, você só poderá
acessar as...
marcello.thiry@gmail.com
Você entendeu porque a
operação “setAltura”
não foi reconhecida
pelo compilador?
ERRO!
marcello.thiry@gmail.com
E agora...
Compila?
Typecasting
(conversão
de tipo)
O compilador reconhece
a operação porque ela
...
marcello.thiry@gmail.com
Você saberia explicar
o motivo do erro de
compilação?
marcello.thiry@gmail.com
Pronto! Agora
compila, mas...
O erro agora será em
tempo de execução!!
Você entende o porquê?
marcello.thiry@gmail.com
E se...
Agora compila e não
há erro na execução!
Mas, perdemos a transparência
do polimorfismo de...
marcello.thiry@gmail.com
Ligação1 (biding)
103
 Ligação prematura (early binding) ou ligação estática
(static binding)
 ...
marcello.thiry@gmail.com
Ligação tardia
104
 O polimorfismo só pode ser aplicado se a linguagem de
programação orientada ...
marcello.thiry@gmail.com
Ligação tardia em Java
105
 Em Java, a ligação tardia é o comportamento padrão
 Exceções:
 Mét...
marcello.thiry@gmail.com
Vamos trabalhar um pouco...
106
 Entrar no ambiente Sophia
 Baixar atividade 05
 Ler (você já ...
marcello.thiry@gmail.com
Existem diferentes tipos de polimorfismo
107
Inclusão
Polimorfismo
Ad-hoc
(aparente)
Coerção
Para...
marcello.thiry@gmail.com
Tipos de polimorfismo
108
 Polimorfismo universal ou verdadeiro
 Quando uma operação ou tipo tr...
marcello.thiry@gmail.com
Polimorfismo paramétrico
109
 Classes paramétricas
 Permitem que operações e classes operem sob...
marcello.thiry@gmail.com
110
Template de classe na UML
Objetos desta classe podem ser
declarados para diferentes tipos
(Ti...
marcello.thiry@gmail.com
111
Template de classe na UML
Parâmetro “Tipo” passado
no momento da declaração
de variáveis “Pil...
marcello.thiry@gmail.com
...
Em Java, templates são
denominados tipos genéricos:
Generics
marcello.thiry@gmail.com
...
<TipoItem> pode assumir
qualquer tipo, mas o
comportamento será sempre
o de uma Pilha!
marcello.thiry@gmail.com
...
Construtores
Você pode implementar
vários construtores, mas
eles precisam ter
assinaturas dif...
marcello.thiry@gmail.com
Chama o construtor
que aceita um “int”
como parâmetro
marcello.thiry@gmail.com
Operador ternário
(condicional)
marcello.thiry@gmail.com
O que é isso?
marcello.thiry@gmail.com
A superclasse java.lang.Object
118
 Base da hierarquia de classes do Java
 Qualquer classe Java...
marcello.thiry@gmail.com
A superclasse java.lang.Object
119
 Você pode redefinir (override) os métodos das
operações de O...
marcello.thiry@gmail.com
Criamos um vetor de objetos genéricos
(qualquer objeto criado a partir de qualquer
classe pode se...
marcello.thiry@gmail.com
Forçamos então uma conversão
(typecasting) para o tipo
passado como parâmetro
marcello.thiry@gmail.com
Tiro
curto!
Complete a
implementação
da classe Pilha,
usando Generics
Teste com uma pilha de Figu...
marcello.thiry@gmail.com
A classe java.util.ArrayList
123
marcello.thiry@gmail.com
Outras classes paramétricas em Java
124
 java.util.Vector<E>
 http://docs.oracle.com/javase/7/d...
marcello.thiry@gmail.com
Sobrecarga (overload)
125
 Permite diferentes versões de uma mesma operação
que aparenta funcion...
marcello.thiry@gmail.com
Sobrecarga (overload)
126
 Bastante utilizado para construtores
 Permite instanciar um objeto d...
marcello.thiry@gmail.com
127
Outro exemplo...
marcello.thiry@gmail.com
Coerção
128
 Conversão entre tipos diferentes, realizada
automaticamente pelo compilador
marcello.thiry@gmail.com
Coerção
129
 Conversões implícitas do Java:
 byte para short, int, long ou double
 short para ...
marcello.thiry@gmail.com
Coerção e Typecasting
130
 Coerção
 Conversão implícita realizada pelo compilador
 Typecasting...
marcello.thiry@gmail.com
Revendo o conceito de Interface
 Nós já vimos um conceito de Interface
 A interface define o co...
marcello.thiry@gmail.com
Revendo o conceito de Interface
132
 Até agora, a interface estava definida na própria classe
 ...
marcello.thiry@gmail.com
Revendo o conceito de Interface
133
 Uma Interface é similar a uma classe abstrata, onde
todas a...
marcello.thiry@gmail.com
134
Transformando Figura em uma Interface
Nos exemplos anteriores, a classe Figura havia sido def...
marcello.thiry@gmail.com
Revendo a
implementação
de “Retangulo”
Contrato
aceito
Note que você não
“herda” uma
Interface, m...
marcello.thiry@gmail.com
Não seria necessário, pois
não há herança
Mas, a partir do Java 6,
@Override passou a ser
utiliza...
marcello.thiry@gmail.com
Notação UML
Circular (lollipop)
Relacionamento
“Realization”
marcello.thiry@gmail.com
Notação UML
Circular (lollipop)
Tradução para
“Realization”: a
Interface é
implementada
pela Clas...
marcello.thiry@gmail.com
Note que as classes
“Retangulo” e “Circulo” não
compartilham uma
estrutura comum (elas são
indepe...
marcello.thiry@gmail.com
E você pode ainda aplicar o
polimorfismo de inclusão!!!
marcello.thiry@gmail.com
Notação UML para mostrar
que a classe “Desenho”
utiliza a interface “Figura”
marcello.thiry@gmail.com
Considerações sobre Interfaces
142
 Não têm construtores, uma vez que não podem ser
instanciadas...
marcello.thiry@gmail.com
Considerações sobre Interfaces
143
 Classes que realizam (implementam) uma mesma
interface não p...
marcello.thiry@gmail.com
Considerações sobre Interfaces
144
 Reduz a dependência (acoplamento) entre classes,
aumentando ...
marcello.thiry@gmail.com
Exceção (Exception)
145
 É um evento que ocorre durante a execução de um
programa e que interrom...
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...
marcello.thiry@gmail.com
Exceções em Java
 Depois que um método dispara (throws) uma exceção,
o ambiente de execução tent...
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 oco...
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 oco...
marcello.thiry@gmail.com
150
Java define
3 tipos de
exceção
Checked
Unchecked
Checked Exception
Error
RuntimeException
marcello.thiry@gmail.com
Checked exception
 Condições excepcionais que uma aplicação bem escrita
deveria antecipar
 A ap...
marcello.thiry@gmail.com
Error (unchecked exception)
 Condições excepcionais que são "externas" a uma
aplicação que não p...
marcello.thiry@gmail.com
Runtime exception (unchecked exception)
 Condições excepcionais que são "internas" a uma
aplicaç...
marcello.thiry@gmail.com
Tratamento de exceções
154
 Permite que a execução do programa continue mesmo
após a ocorrência ...
marcello.thiry@gmail.com
try...catch
155
1. O código controlado pela cláusula try é
executado
2. Se ocorrer uma exceção, o...
marcello.thiry@gmail.com
try...catch
156
 Você pode adicionar quantas cláusulas
catch forem necessárias
 Permite tratame...
marcello.thiry@gmail.com
try...catch
157
Você pode considerar
mais de uma exceção
em uma mesma
cláusula catch
marcello.thiry@gmail.com
try...finally
1. O código controlado pela cláusula try é
executado
2. Se ocorrer uma exceção, o c...
marcello.thiry@gmail.com
Combinando try...catch...finally
159
Este bloco é
executado
mesmo quando uma
exceção ocorrer!!
marcello.thiry@gmail.com
Capturando todos os 3 tipos de exceção
160
marcello.thiry@gmail.com
Capturando todos os 3 tipos de exceção
161
Operação
disponibilizada
pelas classes
de Exceção
marcello.thiry@gmail.com
Conhecendo as classes de exceção
162
 Classe Throwable
 http://docs.oracle.com/javase/7/docs/ap...
marcello.thiry@gmail.com
Experimente...
163
marcello.thiry@gmail.com
A cláusula throws
164
 Permite especificar exceções que podem ser disparadas
ou propagadas dentr...
marcello.thiry@gmail.com
165
Forçando uma Exceção
marcello.thiry@gmail.com
Forçando uma Exceção
Informa ao compilador que o método da operação
“geraExcecao()” deve, obrigat...
marcello.thiry@gmail.com
167
No exemplo anterior, devemos chamar a
operação de modo seguro...
marcello.thiry@gmail.com
168
Outra opção seria capturarmos a exceção no
próprio método da operação...
marcello.thiry@gmail.com
169
Ou ainda, simplesmente capturar e propagar a
exceção para o próximo método...
marcello.thiry@gmail.com
try-com-recursos (try-with-resources)
170
 Cláusula try (Java 7+) que declara um ou mais recurso...
marcello.thiry@gmail.com
Criando sua própria classe de exceção
 Você pode ainda criar suas próprias exceções
 Verifique ...
marcello.thiry@gmail.com
172
marcello.thiry@gmail.com
173
Dos “clones”,
você acha
que eu tinha
esquecido?
marcello.thiry@gmail.com
Vamos aprender
a clonar objetos!
Se você não entendeu
este slide, procure pela
ovelha Dolly na web
marcello.thiry@gmail.com
Formas para copiar objetos...
Shallow Copy Deep Copy
Lazy Copy
Precisa ser
agora?!
marcello.thiry@gmail.com
Shallow copy
 Para copiar o objeto A, o objeto B irá copiar todos os
atributos de A
 Se o valor...
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...
marcello.thiry@gmail.com
Lazy copy
 Combinação das estratégias Shallow e Deep copy
 Inicialmente, objetos são copiados v...
marcello.thiry@gmail.com
...
...
marcello.thiry@gmail.com
...
...
Implementar a
interface “Cloneable”
Suportar a exceção
“CloneNotSupportedException”
marcello.thiry@gmail.com
...
...
Não esquecer de chamar o
clone() da superclasse:
garantir o efeito cascata
marcello.thiry@gmail.com
...
...
Deep copy
marcello.thiry@gmail.com
...
...
marcello.thiry@gmail.com
...
...
marcello.thiry@gmail.com
Usando a operação “clone”
marcello.thiry@gmail.com
Referências
186
 Grady Booch; Robert A. Maksimchuck; Michael W. Engle; Bobbi
J. Young; Jim Conal...
marcello.thiry@gmail.com
Referências
187
 Luca Cardelli; Peter Wegner. On understanding types, data abstraction and
polym...
marcello.thiry@gmail.com
marcello.thiry@gmail.com
of 188

POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4)

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.
Published on: Mar 4, 2016
Published in: Education      
Source: www.slideshare.net


Transcripts - POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4)

  • 1. Prof. Marcello Thiry <marcello.thiry@gmail.com> PROGRAMAÇÃO ORIENTADA A OBJETOS Unidade 1 (parte 2) 3º período
  • 2. marcello.thiry@gmail.com 2
  • 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.
  • 4. marcello.thiry@gmail.com Você lembra... 4
  • 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?
  • 6. marcello.thiry@gmail.com O que você pensou? 6 E se fizermos
  • 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
  • 8. marcello.thiry@gmail.com Como funciona... 8 Endereço Valor 100 ?? 101 ?? 102 ?? 103 ?? 104 ?? 105 ?? 106 ?? ... ... umaPessoa
  • 9. marcello.thiry@gmail.com Como funciona... 9 Endereço Valor 100 ?? 101 ?? 102 ?? 103 ?? 104 ?? 105 ?? 106 ?? ... ... umaPessoa
  • 10. marcello.thiry@gmail.com Como funciona... 10 Endereço Valor 100 ?? 101 ?? 102 nome = “” ... ... 103 ... 200 ?? 201 ?? ... ... umaPessoa novo objeto Pessoa 102
  • 11. marcello.thiry@gmail.com Como funciona... 11 Endereço Valor 100 102 101 ?? 102 nome = “” ... ... 103 ... 200 ?? 201 ?? ... ... umaPessoa novo objeto Pessoa “Marcello”
  • 12. marcello.thiry@gmail.com Como funciona... 12 Endereço Valor 100 102 101 201 102 nome = “Marcello” ... ... 103 ... 200 ?? 201 nome = “João” ... ... ... ... umaPessoa outraPessoa
  • 13. marcello.thiry@gmail.com E se... 13 O que você acha que irá acontecer? Experimente imprimir o nome de umaPessoa e outraPessoa e analisar o resultado...
  • 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?
  • 15. marcello.thiry@gmail.com E se tivéssemos algo como... 15 Alguma ideia para implementar esta operação?
  • 16. marcello.thiry@gmail.com Aguarde um pouco mais, chegaremos lá... 16
  • 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?
  • 19. marcello.thiry@gmail.com Vamos analisar... 19
  • 20. marcello.thiry@gmail.com Vamos analisar... 20 Você sentiu também!?
  • 21. marcello.thiry@gmail.com Duplicação de código... 21
  • 22. marcello.thiry@gmail.com Ficou melhor? 22 Mas, falta alguma coisa?
  • 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
  • 26. marcello.thiry@gmail.com Generalização / Especialização 26 Sentido da generalização Sentido da especialização
  • 27. marcello.thiry@gmail.com Níveis de abstração 27 Abstração mais alta Abstração mais baixa
  • 28. marcello.thiry@gmail.com Abstração e reusabilidade 28 Maior reusabilidade Menor reusabilidade
  • 29. marcello.thiry@gmail.com Generalização em Java 29
  • 30. marcello.thiry@gmail.com Generalização em Java 30
  • 31. marcello.thiry@gmail.com Hora de reutilizar... 31 Caiu a ficha?
  • 32. marcello.thiry@gmail.com O que essa figura tem a ver com herança? 32
  • 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
  • 34. marcello.thiry@gmail.com 34 A subclasse (CarroSubmarino) herda de duas superclasses (Carro e Submarino)
  • 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
  • 37. marcello.thiry@gmail.com 37 “Problema do diamante” Você percebe a ambiguidade?
  • 38. marcello.thiry@gmail.com 38Linguagens OO que implementam herança múltipla devem fornecer soluções para mitigar este problema
  • 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
  • 43. marcello.thiry@gmail.com Visibilidade de atributos e operações 43 Modificador na ClasseAlfa ClasseAlfa ClasseBeta SubAlfa Gama public S S S S protected S S S N sem modificador S S N N private S N N N
  • 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...
  • 49. marcello.thiry@gmail.com 49 O que você acha? Faz sentido, criamos objetos Pessoa? Qual a utilidade?
  • 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?
  • 51. marcello.thiry@gmail.com Classe Abstrata em UML 51 Reparou que o nome da classe ficou em itálico?
  • 52. marcello.thiry@gmail.com Classe Abstrata em Java 52 A partir de agora, você não poderá instanciar objetos Pessoa diretamente!
  • 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
  • 55. marcello.thiry@gmail.com Professor na hierarquia de herança 55
  • 56. marcello.thiry@gmail.com Vamos analisar um pouco mais... 56 Veja o que você não entendeu e pergunte...
  • 57. marcello.thiry@gmail.com Valor inicial 57
  • 58. marcello.thiry@gmail.com ?!?!?!?! 58 Não tínhamos herdado isso de Funcionario?
  • 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
  • 60. marcello.thiry@gmail.com Redefinição de operações (override) 60 Na classe Professor... e...
  • 61. marcello.thiry@gmail.com Redefinição de operações (override) 61 Permite chamar a implementação (método) da superclasse
  • 62. marcello.thiry@gmail.com A classe Funcionario 62 ... ...
  • 63. marcello.thiry@gmail.com A classe Funcionario 63 ... ... Alguma ideia para implementar? Lembra do getIdade()?
  • 64. marcello.thiry@gmail.com 64 Mas, você não pensou em simplesmente copiar o código, certo? Certo!?
  • 65. marcello.thiry@gmail.com A classe Professor 65 ... ...
  • 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)
  • 67. marcello.thiry@gmail.com Redefinição de operações (override) 67  A redefinição deve manter a mesma assinatura da operação original
  • 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
  • 71. marcello.thiry@gmail.com Modificador “final” 71  Resumindo, quando você utiliza o modificador “final”, a operação não poderá ser redefinida pelas subclasses  Mas, este modificador também se aplica a atributos
  • 72. marcello.thiry@gmail.com Modificador “final” 72  O modificador “final” também se aplica a atributos  Nossa política estabelece que todos os atributos sejam privados, lembra?
  • 73. marcello.thiry@gmail.com Modificador “final” 73  Mas, quando utilizado em atributos, o modificador “final” permite a definição de constantes  Tipicamente, constantes em Java são descritas em caixa alta
  • 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
  • 76. marcello.thiry@gmail.com Declarando um tipo “enum” 76  Você deve utilizar enum sempre que você precisar representar um conjunto fixo de constantes
  • 77. marcello.thiry@gmail.com Como utilizar o tipo “enum” 77 ... ...
  • 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
  • 79. marcello.thiry@gmail.com Tipo “enum” 79 ...
  • 80. marcello.thiry@gmail.com Tipo “enum” 80 ...
  • 81. marcello.thiry@gmail.com Como utilizar o tipo “enum” 81 ... ...
  • 82. marcello.thiry@gmail.com 82Rapidinha! Revise a implementação anterior, utilizando o tipo “enum”
  • 83. marcello.thiry@gmail.com Operações abstratas 83  Nós já vimos o conceito de classe abstrata  Não é possível instanciar objetos de uma classe abstrata  Mas, e operações abstratas...  Alguma ideia?
  • 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?
  • 85. marcello.thiry@gmail.com 85 Como você implementaria a operação “desenhar()”  Note que a classe Figura é abstrata (representada em itálico na UML)  Da mesma forma, uma operação abstrata também é representada em itálico na UML
  • 86. marcello.thiry@gmail.com 86 O que deve ser desenhado? Tudo bem, eu não sei o que desenhar. Mas, ainda não entendi por que eu preciso desta classe?
  • 87. marcello.thiry@gmail.com A ideia aqui é garantir que todas as subclasses de “Figura” sejam obrigadas a fornecer um método para “desenhar()”
  • 88. marcello.thiry@gmail.com
  • 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
  • 90. marcello.thiry@gmail.com Operações abstratas são tipicamente utilizadas com o princípio de polimorfismo!
  • 91. marcello.thiry@gmail.com 91 Poli... o quê????
  • 92. marcello.thiry@gmail.com 92 Poli=Muitas Morfhos=Formas
  • 93. marcello.thiry@gmail.com Polimorfismo 93  Princípio pelo qual entidades de tipos diferentes podem ser acessadas através de uma única interface1 1. http://www.stroustrup.com/glossary.html#Gpolymorphism
  • 94. marcello.thiry@gmail.com Polimorfismo 94  Diferente objetos “Retangulo” e “Circulo” podem ser acessados através da interface da classe “Figura” r2 c2 r3 r1 desenhar() Figura Programa usuário Executa “desenhar()” Executa “desenhar()” c1
  • 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.
  • 97. marcello.thiry@gmail.com A variável “fig” está limitada pela interface da classe “Figura”. Logo, você só poderá acessar as operações disponíveis em “Figura”!!
  • 98. marcello.thiry@gmail.com Você entendeu porque a operação “setAltura” não foi reconhecida pelo compilador? ERRO!
  • 99. marcello.thiry@gmail.com E agora... Compila? Typecasting (conversão de tipo) O compilador reconhece a operação porque ela existe em “Retangulo”
  • 100. marcello.thiry@gmail.com Você saberia explicar o motivo do erro de compilação?
  • 101. marcello.thiry@gmail.com Pronto! Agora compila, mas... O erro agora será em tempo de execução!! Você entende o porquê?
  • 102. marcello.thiry@gmail.com E se... Agora compila e não há erro na execução! Mas, perdemos a transparência do polimorfismo de inclusão!
  • 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”
  • 111. marcello.thiry@gmail.com 111 Template de classe na UML Parâmetro “Tipo” passado no momento da declaração de variáveis “Pilha”
  • 112. marcello.thiry@gmail.com ... Em Java, templates são denominados tipos genéricos: Generics
  • 113. marcello.thiry@gmail.com ... <TipoItem> pode assumir qualquer tipo, mas o comportamento será sempre o de uma Pilha!
  • 114. marcello.thiry@gmail.com ... Construtores Você pode implementar vários construtores, mas eles precisam ter assinaturas diferentes!
  • 115. marcello.thiry@gmail.com Chama o construtor que aceita um “int” como parâmetro
  • 116. marcello.thiry@gmail.com Operador ternário (condicional)
  • 117. marcello.thiry@gmail.com O que é isso?
  • 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
  • 120. marcello.thiry@gmail.com Criamos um vetor de objetos genéricos (qualquer objeto criado a partir de qualquer classe pode ser colocado neste vetor)
  • 121. marcello.thiry@gmail.com Forçamos então uma conversão (typecasting) para o tipo passado como parâmetro
  • 122. marcello.thiry@gmail.com Tiro curto! Complete a implementação da classe Pilha, usando Generics Teste com uma pilha de Figuras...
  • 123. marcello.thiry@gmail.com A classe java.util.ArrayList 123
  • 124. marcello.thiry@gmail.com Outras classes paramétricas em Java 124  java.util.Vector<E>  http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html  java.util.HashMap<K,V>  http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html  java.util.Stack<E>  http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html  ...
  • 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?
  • 127. marcello.thiry@gmail.com 127 Outro exemplo...
  • 128. marcello.thiry@gmail.com Coerção 128  Conversão entre tipos diferentes, realizada automaticamente pelo compilador
  • 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
  • 130. marcello.thiry@gmail.com Coerção e Typecasting 130  Coerção  Conversão implícita realizada pelo compilador  Typecasting  Conversão explícita realizada pelo programador  (tipo) variável
  • 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)
  • 134. marcello.thiry@gmail.com 134 Transformando Figura em uma Interface Nos exemplos anteriores, a classe Figura havia sido definida como uma classe abstrata que tinha apenas a operação abstrata “desenhar()”
  • 135. marcello.thiry@gmail.com Revendo a implementação de “Retangulo” Contrato aceito Note que você não “herda” uma Interface, mas você a “implementa”
  • 136. marcello.thiry@gmail.com Não seria necessário, pois não há herança Mas, a partir do Java 6, @Override passou a ser utilizado para indicar também implementação
  • 137. marcello.thiry@gmail.com Notação UML Circular (lollipop) Relacionamento “Realization”
  • 138. marcello.thiry@gmail.com Notação UML Circular (lollipop) Tradução para “Realization”: a Interface é implementada pela Classe
  • 139. marcello.thiry@gmail.com Note que as classes “Retangulo” e “Circulo” não compartilham uma estrutura comum (elas são independentes uma da outra)
  • 140. marcello.thiry@gmail.com E você pode ainda aplicar o polimorfismo de inclusão!!!
  • 141. marcello.thiry@gmail.com Notação UML para mostrar que a classe “Desenho” utiliza a interface “Figura”
  • 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)
  • 144. marcello.thiry@gmail.com Considerações sobre Interfaces 144  Reduz a dependência (acoplamento) entre classes, aumentando sua reusabilidade  Oferece uma alternativa simplificada para a implementação de herança múltipla
  • 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
  • 150. marcello.thiry@gmail.com 150 Java define 3 tipos de exceção Checked Unchecked Checked Exception Error RuntimeException
  • 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
  • 157. marcello.thiry@gmail.com try...catch 157 Você pode considerar mais de uma exceção em uma mesma cláusula catch
  • 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
  • 159. marcello.thiry@gmail.com Combinando try...catch...finally 159 Este bloco é executado mesmo quando uma exceção ocorrer!!
  • 160. marcello.thiry@gmail.com Capturando todos os 3 tipos de exceção 160
  • 161. marcello.thiry@gmail.com Capturando todos os 3 tipos de exceção 161 Operação disponibilizada pelas classes de Exceção
  • 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
  • 163. marcello.thiry@gmail.com Experimente... 163
  • 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
  • 165. marcello.thiry@gmail.com 165 Forçando uma Exceção
  • 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
  • 167. marcello.thiry@gmail.com 167 No exemplo anterior, devemos chamar a operação de modo seguro...
  • 168. marcello.thiry@gmail.com 168 Outra opção seria capturarmos a exceção no próprio método da operação...
  • 169. marcello.thiry@gmail.com 169 Ou ainda, simplesmente capturar e propagar a exceção para o próximo método...
  • 170. marcello.thiry@gmail.com try-com-recursos (try-with-resources) 170  Cláusula try (Java 7+) que declara um ou mais recursos  Um recurso é um objeto que deve ser fechado depois que o programa não precisar mais dele  Garante que cada recurso é fechado ao final da cláusula
  • 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
  • 172. marcello.thiry@gmail.com 172
  • 173. marcello.thiry@gmail.com 173 Dos “clones”, você acha que eu tinha esquecido?
  • 174. marcello.thiry@gmail.com Vamos aprender a clonar objetos! Se você não entendeu este slide, procure pela ovelha Dolly na web
  • 175. marcello.thiry@gmail.com Formas para copiar objetos... Shallow Copy Deep Copy Lazy Copy Precisa ser agora?!
  • 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
  • 179. marcello.thiry@gmail.com ... ...
  • 180. marcello.thiry@gmail.com ... ... Implementar a interface “Cloneable” Suportar a exceção “CloneNotSupportedException”
  • 181. marcello.thiry@gmail.com ... ... Não esquecer de chamar o clone() da superclasse: garantir o efeito cascata
  • 182. marcello.thiry@gmail.com ... ... Deep copy
  • 183. marcello.thiry@gmail.com ... ...
  • 184. marcello.thiry@gmail.com ... ...
  • 185. marcello.thiry@gmail.com Usando a operação “clone”
  • 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/
  • 187. marcello.thiry@gmail.com Referências 187  Luca Cardelli; Peter Wegner. On understanding types, data abstraction and polymorphism. Computing Surveys, 17(4):471-522, December 1985.
  • 188. marcello.thiry@gmail.com marcello.thiry@gmail.com