Post on 18-Dec-2014
description
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 slides3
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.
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 outraPessoa têm o mesmo estado?
O que isso significa?
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 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
marcello.thiry@gmail.com
Como funciona... 8
Endereço Valor
100 ??
101 ??
102 ??
103 ??
104 ??
105 ??
106 ??
... ...
umaPessoa
marcello.thiry@gmail.com
Como funciona... 9
Endereço Valor
100 ??
101 ??
102 ??
103 ??
104 ??
105 ??
106 ??
... ...
umaPessoa
marcello.thiry@gmail.com
Como funciona... 10
Endereço Valor
100 ??
101 ??
102 nome = “ ”......
103
...
200 ??
201 ??
... ...
umaPessoa
novo objeto Pessoa
102
marcello.thiry@gmail.com
Como funciona... 11
Endereço Valor
100 102
101 ??
102 nome = “ ”......
103
...
200 ??
201 ??
... ...
umaPessoa
novo objeto Pessoa
“Marcello”
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
marcello.thiry@gmail.com
E se...13
O que você acha que irá acontecer?
Experimente imprimir o nome de umaPessoae outraPessoa e analisar o resultado...
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?
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?
Copiar e colar?
Faz sentido?
Qual o risco?
Duplicar código é reutilizar?
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?
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 para pensar que faz sentido dizer:
Um Aluno é uma Pessoa
Legal, mas como iremos fazer isso acontecer?
marcello.thiry@gmail.com
Generalização24
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)
marcello.thiry@gmail.com
Generalização25
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
marcello.thiry@gmail.com
Generalização / Especialização26
Sentido da generalização
Sentido da especialização
marcello.thiry@gmail.com
Níveis de abstração27
Abstraçãomais alta
Abstraçãomais baixa
marcello.thiry@gmail.com
Abstração e reusabilidade28
Maiorreusabilidade
Menorreusabilidade
marcello.thiry@gmail.com
Generalização em Java29
marcello.thiry@gmail.com
Generalização em Java30
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ça33
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
marcello.thiry@gmail.com
34
A subclasse (CarroSubmarino)
herda de duas superclasses
(Carro e Submarino)
marcello.thiry@gmail.com
Herança múltipla em Java35
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
marcello.thiry@gmail.com
Considerações sobre herança múltipla36
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
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 problema
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?
marcello.thiry@gmail.com
Visibilidade e modificadores de acesso40
Notação visual
Modificadorde acesso
A parte é visível...
+ publicdentro da própria classe e para qualquer outra classe
– private somente dentro da própria classe
# protectedsomente dentro do próprio pacote e das subclasses em outros pacotes
~ packagesomente dentro da própria classe e das classes dentro do mesmo pacote
marcello.thiry@gmail.com
Visibilidade “package” em Java41
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”
marcello.thiry@gmail.com
Visibilidade “package” em Java42
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
marcello.thiry@gmail.com
Visibilidade de atributos e operações43
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
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!!
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?
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?
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?
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...
marcello.thiry@gmail.com
49
O que você acha?
Faz sentido, criamos objetos Pessoa?
Qual a utilidade?
marcello.thiry@gmail.com
Classes Concretas e Abstratas50
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?
marcello.thiry@gmail.com
Classe Abstrata em UML51
Reparou que o nome da classe ficou em itálico?
marcello.thiry@gmail.com
Classe Abstrata em Java52
A partir de agora, você não poderá instanciar
objetos Pessoa diretamente!
marcello.thiry@gmail.com
Revisando a classe abstrata53
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!!)
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
marcello.thiry@gmail.com
Professor na hierarquia de herança55
marcello.thiry@gmail.com
Vamos analisar um pouco mais...56
Veja o que você não entendeu e
pergunte...
marcello.thiry@gmail.com
Valor inicial57
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 valor do salário bruto a cada triênio
Professores com Doutorado ganham 10% a mais sobre o valor calculado do triênio
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 Funcionario62
...
...
marcello.thiry@gmail.com
A classe Funcionario63
...
... Alguma ideia para implementar?
Lembra do getIdade()?
marcello.thiry@gmail.com
64Mas, você não pensou em simplesmente copiar o código, certo?
Certo!?
marcello.thiry@gmail.com
A classe Professor65
...
...
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)
marcello.thiry@gmail.com
Redefinição de operações (override)67
A redefinição deve manter a mesma assinatura da operação original
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!
marcello.thiry@gmail.com
Restringindo a redefinição em Java69
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”
marcello.thiry@gmail.com
Restringindo a redefinição em Java70
No nosso exemplo, se a operação getTrienio() da superclasse Funcionario for declarada como final, você não poderá redefini-la na subclasse Professor
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
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?
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
marcello.thiry@gmail.com
Constantes em Java74
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
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
marcello.thiry@gmail.com
Declarando um tipo “enum”76
Você deve utilizar enum sempre que você precisar representar um conjunto fixo de constantes
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
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
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 abstratas83
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?
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?
marcello.thiry@gmail.com
85Como 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
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?
marcello.thiry@gmail.com
A ideia aqui é garantir
que todas as subclasses
de “Figura” sejam
obrigadas a fornecer
um método para
“desenhar()”
marcello.thiry@gmail.com
marcello.thiry@gmail.com
Classes e operações abstratas89
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
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
92Poli=Muitas
Morfhos=Formas
marcello.thiry@gmail.com
Polimorfismo93
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
marcello.thiry@gmail.com
Polimorfismo94
Diferente objetos “Retangulo” e “Circulo” podem ser acessados através da interface da classe “Figura”
r2
c2
r3
r1
desenhar()
FiguraPrograma usuário
Executa “desenhar()”
Executa “desenhar()”
c1
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 tipoao longo da execução doprograma
marcello.thiry@gmail.com
96Este 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.
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”!!
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 existe em “Retangulo”
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 inclusão!
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”
marcello.thiry@gmail.com
Ligação tardia104
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)
marcello.thiry@gmail.com
Ligação tardia em Java105
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”
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!
marcello.thiry@gmail.com
Existem diferentes tipos de polimorfismo107
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
marcello.thiry@gmail.com
Tipos de polimorfismo108
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)
marcello.thiry@gmail.com
Polimorfismo paramétrico109
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
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”
marcello.thiry@gmail.com
111
Template de classe na UMLParâmetro “Tipo” passado no momento da declaração de variáveis “Pilha”
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 diferentes!
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.Object118
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
marcello.thiry@gmail.com
A superclasse java.lang.Object119
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
marcello.thiry@gmail.com
Criamos um vetor de objetos genéricos
(qualquer objeto criado a partir de qualquer
classe pode ser colocado neste vetor)
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 Figuras...
marcello.thiry@gmail.com
A classe java.util.ArrayList123
marcello.thiry@gmail.com
Outras classes paramétricas em Java124
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
...
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
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?
marcello.thiry@gmail.com
127
Outro exemplo...
marcello.thiry@gmail.com
Coerção128
Conversão entre tipos diferentes, realizada automaticamente pelo compilador
marcello.thiry@gmail.com
Coerção129
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
marcello.thiry@gmail.com
Coerção e Typecasting130
Coerção
Conversão implícita realizada pelo compilador
Typecasting
Conversão explícita realizada pelo programador
(tipo) variável
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
marcello.thiry@gmail.com
Revendo o conceito de Interface132
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
marcello.thiry@gmail.com
Revendo o conceito de Interface133
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)
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()”
marcello.thiry@gmail.com
Revendo a implementação de “Retangulo”
Contratoaceito
Note que você não “herda” uma
Interface, mas você a “implementa”
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
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 Classe
marcello.thiry@gmail.com
Note que as classes
“Retangulo” e “Circulo” não
compartilham uma
estrutura comum (elas são
independentes uma da
outra)
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 Interfaces142
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
marcello.thiry@gmail.com
Considerações sobre Interfaces143
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)
marcello.thiry@gmail.com
Considerações sobre Interfaces144
Reduz a dependência (acoplamento) entre classes, aumentando sua reusabilidade
Oferece uma alternativa simplificada para a implementação de herança múltipla
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.
marcello.thiry@gmail.com
Exceções em Java146
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/
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
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
Chamamétodo
Chamamétodo
Chamamétodo
http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
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 ocorreuDispara (throws)
exceção
Propagaexceção
Trata (catches)a exceção
Procura portratamento implementado
Procura portratamento implementado
http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
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 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
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
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
marcello.thiry@gmail.com
Tratamento de exceções154
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
marcello.thiry@gmail.com
try...catch155
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
marcello.thiry@gmail.com
try...catch156
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
marcello.thiry@gmail.com
try...catch157
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 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
marcello.thiry@gmail.com
Combinando try...catch...finally159
Este bloco é executado
mesmo quando uma exceção ocorrer!!
marcello.thiry@gmail.com
Capturando todos os 3 tipos de exceção160
marcello.thiry@gmail.com
Capturando todos os 3 tipos de exceção161
Operação disponibilizada pelas classes de Exceção
marcello.thiry@gmail.com
Conhecendo as classes de exceção162
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
marcello.thiry@gmail.com
Experimente...163
marcello.thiry@gmail.com
A cláusula throws164
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
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, obrigatoriamente:
capturar (catch) a exceção Exception; ou
disparar (throw) uma exceção Exception
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 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
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
marcello.thiry@gmail.com
172
marcello.thiry@gmail.com
173Dos “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 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
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
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
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ências186
Grady Booch; Robert A. Maksimchuck; Michael W. Engle; BobbiJ. Young; Jim Conallen; Kelli A. Houston. Object-oriented analysisand 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 ModelingLanguage v2.5, 2012. http://www.omg.org/spec/UML/2.5/Beta1/PDF/
marcello.thiry@gmail.com
Referências187
Luca Cardelli; Peter Wegner. On understanding types, data abstraction and polymorphism. Computing Surveys, 17(4):471-522, December 1985.
marcello.thiry@gmail.com
marcello.thiry@gmail.com