Upload
nguyennga
View
217
Download
0
Embed Size (px)
Citation preview
23/03/2016
1
INF1636 – PROGRAMAÇÃO ORIENTADA A
OBJETOS
Departamento de Informática – PUC-Rio
Ivan Mathias [email protected]
2© LES/PUC-Rio
Programa – Capítulo 4
• Tipos Enumerados
• Generalização e Herança
• Visibilidade
• Chamada de Construtores
• A Classe Object
23/03/2016
2
3© LES/PUC-Rio
Programa – Capítulo 4
• Tipos Enumerados
• Generalização e Herança
• Visibilidade
• Chamada de Construtores
• A Classe Object
4© LES/PUC-Rio
Tipos Enumerados – C++
• Tipos enumerados são usados para criar novos tipos dedados, que podem assumir apenas uma gama restrita devalores não-numéricos (enumeradores);
• Os valores (enumeradores) associados a um enumeradosão identificadores definidos pelo programador.
typedef enum {amarelo,vermelho,azul,verde,preto
} Cor;
int main(void) {Cor c=vermelho;int x=c;printf("valor de c: %d valor de x: %d\n",c,x);return 0;
}
23/03/2016
3
5© LES/PUC-Rio
Tipos Enumerados – Motivação
• Antes da edição JSE5 (JDK 1.5) a linguagem Java nãooferecia suporte direto à construção de tipos enumerados;
• A construção desses tipos era simulada através do uso declasses, como no exemplo a seguir:
public class Cor{
static final int amarelo=0;static final int vermelho=1;static final int azul=2;static final int verde=3;static final int preto=4;
}
int vareta=Cor.amarelo;
6© LES/PUC-Rio
Simulação de Enumerados – Desvantagens
• O uso de variáveis estáticas inteiras tem pelo menosduas desvantagens:
– A variável vareta continuará a ser uma variável inteira.Logo, valores fora do domínio, como 10, poderão seratribuídos a ela;
– A associação entre os nomes das variáveis e os valores dasconstantes só está representada na definição da classe,dificultando, assim, o entendimento do código escrito.
23/03/2016
4
7© LES/PUC-Rio
Tipos Enumerados – Características
• Os tipos enumerados resolvem estes problemas daseguinte maneira:
– Os valores dos tipos enumerados são referenciados pelosseus nomes e não por valores inteiros;
– Apenas valores pertencentes ao domínio de um enumeradopoderão ser usados nos comandos de atribuição.
8© LES/PUC-Rio
Tipos Enumerados – Exemplo
• O tipo Cor, visto anteriormente, pode ser definido daseguinte maneira, utilizando o construtor de enumerados,introduzido no JDK 1.5:
public enum Cor{
amarelo,vermelho,azul,verde,preto;}
Cor vareta=Cor.amarelo;
• A atribuição de um valor enumerado a uma variável dotipo Cor tem a seguinte forma:
23/03/2016
5
9© LES/PUC-Rio
Tipos Enumerados – Vantagens
• As constantes que representam os valores enumeradosnão são compiladas para as classes que as usam;
• Cada constante de um enumerado é deixada como umareferência simbólica que será ligada em tempo deexecução, do mesmo modo que as referências paramétodos e variáveis de instância;
• Desse modo, a retirada de uma constante que é usadapor uma outra classe qualquer será sinalizada com umamensagem de erro pela biblioteca de tempo de execuçãoassim que a constante retirada for usada.
10© LES/PUC-Rio
Tipos Enumerados – switch...case
• O comando switch...case foi alterado para poder serusado com os tipos enumerados. O exemplo a seguirmostra como isso é feito:
Cor vareta=Cor.amarelo;
int pontos;
switch(vareta){
case amarelo: pontos=5;break;case azul: pontos=15;break;case preto: pontos=50;break;case verde: pontos=20;break;case vermelho: pontos=10;
}
23/03/2016
6
11© LES/PUC-Rio
Programa – Capítulo 4
• Tipos Enumerados
• Generalização e Herança
• Visibilidade
• Chamada de Construtores
• A Classe Object
12© LES/PUC-Rio
• Muito antes do alvorecer da ciência os seres humanos jánomeavam as espécies;
• Isso os permitia obter sucesso nas suas atividades decaça e coleta;
• A Taxonomia, palavra de origem grega cujo significadoé “estudo das classificações”, surgiu no século XVII;
• Ela ganhou força no século seguinte, graça ao trabalhodo naturalista sueco Carl Linnaeus, que inventou umsistema para organizar os seres vivos em grupos cadavez menores;
• Neste sistema, os membros de um grupo particularcompartilhavam determinadas características.
Taxonomia (1)
23/03/2016
7
13© LES/PUC-Rio
Taxonomia (2)
14© LES/PUC-Rio
• Posteriormente, a palavra taxonomia começou a serusada em um sentido mais abrangente, podendo seraplicada na classificação de quase tudo – objetosanimados, inanimados, lugares e eventos.
Taxonomia
23/03/2016
8
15© LES/PUC-Rio
Exemplo – Taxonomia de Polígonos
16© LES/PUC-Rio
Representação de Classes na UML
• Na UML, uma classe é graficamente representada por umretângulo dividido em três seções: nome, lista de atributose lista das operações.
23/03/2016
9
17© LES/PUC-Rio
• A generalização é atividade de identificar aspectoscomuns e não comuns entre os conceitos pertencentesa um domínio de aplicação;
• Ela nos permite definir relações entre superclasses –conceitos gerais – e subclasses – conceitos específicos;
• Tais relações formam uma taxonomia de conceitos deum certo domínio, que é ilustrada através de umahierarquia de classes.
Generalização
18© LES/PUC-Rio
Generalização em Java
• Em Java, a hierarquia de polígonos seria definida daseguinte maneira:
public class Poligono { }
public class Triangulo extends Poligono { }
public class Retangulo extends Poligono { }
public class Pentagono extends Poligono { }
public class Quadrado extends Retangulo { }
• A palavra reservada extends é usada para declarar queuma classe (ex: Triangulo) é subclasse de outra (ex:Poligono).
23/03/2016
10
19© LES/PUC-Rio
A generalização pode ser vista sob a ótica da Teoria dosConjuntos. Desse ponto de vista, o diagrama de Vennabaixo é equivalente ao diagrama de classes do slideanterior.
Teoria dos Conjuntos
20© LES/PUC-Rio
• Identificar superclasses e subclasses nos oferecem osseguintes benefícios:
– Nos permite compreender aspectos de um problema emtermos mais gerais e abstratos;
– Resulta em mais expressividade, melhoria nacompreensão e redução das redundâncias de um modelo;
– A utilização de superclasses e subclasses, juntamente como mecanismo de polimorfismo, nos permite construirsoftwares bem organizados.
Benefícios
23/03/2016
11
21© LES/PUC-Rio
• Podemos afirmar, informalmente, que toda instância deuma classe é também instância da sua superclasse;
• Isso é conhecido como a regra é-um (is-a): todoquadrado é um retângulo, e todo retângulo é umpolígono;
• Logo, podemos concluir que todas as propriedadesválidas para os objetos de uma classe também sãoválidas para os objetos das suas subclasses.
Regra “É-UM”
22© LES/PUC-Rio
• Por propriedades devemos entender:
– Atributos (variáveis);
– Operações (métodos);
– Relações (variáveis).
Propriedades de uma Classe
23/03/2016
12
23© LES/PUC-Rio
Exemplo
24© LES/PUC-Rio
• Pela regra é-um podemos afirmar o seguinte emrelação ao exemplo anterior:
– Um pagamento com cartão de crédito é uma espécie depagamento, logo, ele possui um valor e salda uma venda(propriedades herdadas de Pagamento);
– A operação getValor() é válida para as três formas depagamento existentes.
Regra “É-UM” – Exemplo
23/03/2016
13
25© LES/PUC-Rio
• Nem todas as propriedades válidas para os objetos deuma classe são válidas para os objetos da suasuperclasse;
• No exemplo anterior, o número e a validade de umcartão são propriedades exclusivas do pagamentoatravés de cartão de crédito, não sendo aplicáveis àsoutras formas de pagamento;
• Poderíamos também associar um pagamento comcartão a uma classe que representasse a operadora docartão usado;
• Tal associação seria válida apenas para os pagamentoscom cartão.
Regra “É-UM” – Comentários
26© LES/PUC-Rio
Exemplo – Pagamento com Cartão
23/03/2016
14
27© LES/PUC-Rio
• Em todos os exemplos de generalização apresentados atéagora foi usada apenas a herança simples;
• Herança simples significa que uma classe só pode serdescendente direta de uma única superclasse;
• Além da herança simples, todos os nossos exemploscontém apenas generalizações não-sobrepostas;
• Sob a ótica da Teoria dos Conjuntos, umageneralização não-sobreposta significa que, em umageneralização, a interseção entre duas classes(conjuntos) quaisquer é sempre vazia, exceto quandouma for subclasse da outra – direta ou transitivamente;
• Nesse caso, a interseção será a própria subclasse.
Herança Simples
28© LES/PUC-Rio
Generalização e Herança
• Não devemos confundir generalização com herança;
• Uma generalização é uma relação entre classes, ondeuma classe mais especializada (subclasse) é definida emtermos de uma classe mais geral (superclasse);
• A herança é o mecanismo pelo qual todos as propriedadesnão privadas de uma superclasse fazem parte do espaçode nomes de uma subclasse.
23/03/2016
15
29© LES/PUC-Rio
Programa – Capítulo 4
• Tipos Enumerados
• Generalização e Herança
• Visibilidade
• Chamada de Construtores
• A Classe Object
30© LES/PUC-Rio
Visibilidade
• Determina o nível de restrição de acesso às construçõesde um programa Java;
• Aplicável às classes, aos métodos e às variáveis;
• Tipos de visibilidade:
– pública “+”
– protegida “#”
– privada “-”
– default ou pacote “~”
23/03/2016
16
31© LES/PUC-Rio
Modificador de Acesso public
• Todas as propriedades (variáveis e métodos) públicas deuma classe são visíveis em todas as classes de umaaplicação.
package poligonos;
public class Poligono {public int numLados;
}
import poligonos.*;
public class Ex {
public static void main(String[] args){
Poligono p=new Poligono();p.numLados=4; //correto: numLados é visível
}}
32© LES/PUC-Rio
Modificador de Acesso private
• Todas as propriedades (variáveis e métodos) privadas deuma classe não são visíveis nas suas subclasses ou emquaisquer outras classes.
public class Poligono{
private int numLados;}
public class Quadrado extends Retangulo{
public Quadrado(){
numLados=4; //erro: numLados não é visível}
}
23/03/2016
17
33© LES/PUC-Rio
Modificador de Acesso protected (1)
• Todas as propriedades (variáveis e métodos) protegidasde uma classe são visíveis nas suas subclasses e nasclasses definidas no mesmo pacote.
34© LES/PUC-Rio
Modificador de Acesso protected (2)
package poligonos;
public class Poligono{
protected int numLados;}
package poligonos;
public class Quadrado extends Retangulo{
public Quadrado(){
numLados=4; //correto: numLados é visível}
}
23/03/2016
18
35© LES/PUC-Rio
Modificador de Acesso protected (3)
• Entretanto, elas se comportam como se fossem privadaspara as classes de outros pacotes.
36© LES/PUC-Rio
Modificador de Acesso protected (4)
package poligonos;
public class Poligono {
protected int numLados;}
package p1;
import poligonos.*;
public class UmaClasse{
Poligono p=new Poligono();
public UmaClasse(){
p.numLados=4; //erro: numLados não é visível}
}
23/03/2016
19
37© LES/PUC-Rio
Modificador de Acesso Default
• Todas as propriedades de uma classe (variáveis emétodos) com acesso default (sem modificador) sãovisíveis em todas as classes do pacote e invisíveis para asclasses fora do pacote.
package poligonos;
public class Poligono{int numLados;
}
package poligonos;
public class Quadrado extends Retangulo{
public Quadrado(){
numLados=4; //correto: numLados é visível}
}
38© LES/PUC-Rio
Exemplo
package poligonos;
public class Poligono {
int numLados;}
package p1;
import poligonos.*;
public class UmaClasse{
Poligono p=new Poligono();
public UmaClasse(){
p.numLados=4; //erro: numLados não é visível}
}
23/03/2016
20
39© LES/PUC-Rio
Programa – Capítulo 4
• Tipos Enumerados
• Generalização e Herança
• Visibilidade
• Chamada de Construtores
• A Classe Object
40© LES/PUC-Rio
Seqüência de Chamada dos Construtores (1)
• Quando um objeto de uma classe é criado, todos osconstrutores das classes ancestrais serão invocados,implícita ou explicitamente;
• No exemplo a seguir, uma condição de erro serásinalizada pelo runtime de Java quando um quadrado forcriado, pois o construtor default da classe Poligono nãofoi definido explicitamente.
23/03/2016
21
41© LES/PUC-Rio
Seqüência de Chamada dos Construtores (2)
public class Retangulo extends Poligono{}
public class Poligono {protected int numLados;protected double perimetro;
public Poligono(int x){
numLados=x;}
}
public class Quadrado extends Retangulo {
public Quadrado(int x){
numLados=x;}
}
42© LES/PUC-Rio
Seqüência de Chamada dos Construtores (3)
• O erro é causado pela invocação implícita do construtordefault de Retangulo, que por sua vez invocaimplicitamente o construtor default de Poligono;
• Como o construtor default de Poligono não foi definido,embora exista um construtor para Poligono, o erro ésinalizado.
23/03/2016
22
43© LES/PUC-Rio
A Palavra Reservada super (1)
• A solução é definir um construtor para Retangulo, quepor sua vez irá invocar o construtor de Poligono;
• Isso é feito através da palavra reservada super.
public class Quadrado extends Retangulo {
public Quadrado(){}public Quadrado(int x){
super(x);}
}
44© LES/PUC-Rio
A Palavra Reservada super (2)
public class Retangulo extends Poligono {public Retangulo(){}public Retangulo(int x){
super(x);}
}
public class Poligono {
protected int numLados;protected double perimetro;public Poligono(){}public Poligono(int x){
numLados=x;}
}
23/03/2016
23
45© LES/PUC-Rio
Programa – Capítulo 4
• Tipos Enumerados
• Generalização e Herança
• Visibilidade
• Chamada de Construtores
• A Classe Object
46© LES/PUC-Rio
A Classe Object
• A classe java.lang.Object é a derradeira ancestral dequalquer classe em Java; isto é, toda classe definida emJava herda implicitamente as propriedades de Object;
• Ela possui alguns métodos bastante úteis, que podem serinvocados sobre qualquer objeto;
• Por exemplo, o método equals(), definido na classeObject, nos permite implementar o conceito de igualdadede maneira um pouco mais sofistica do que o simples usodo operador relacional ==.
23/03/2016
24
47© LES/PUC-Rio
O Operador ==
• O operador relacional == compara apenas se duasvariáveis de objeto referenciam o mesmo objeto;
• No exemplo abaixo, a mensagem p1 e p2 referenciam omesmo objeto será exibida na console como resultadoda comparação de p1 com p2.
import poligonos.*;
public class Ex {public static void main(String[] args){
Quadrado p1=new Quadrado(),p2;p2=p1;if(p2==p1)
System.out.println("p1 e p2 referenciam o mesmo objeto");}
}
48© LES/PUC-Rio
O Método Object.equals()
• O método equals() implementado em Object gera omesmo resultado que o operador ==;
• Caso queiramos implementar o nosso próprio conceito deigualdade, devemos sobrescrever o método equals()
para implementá-lo;
• No exemplo a seguir, usamos o método equals() paradefinir que dois quadrados que tenham o mesmoperímetro são iguais.
23/03/2016
25
49© LES/PUC-Rio
Implementação da Igualdade (1)
package poligonos;
public class Quadrado extends Retangulo {
public Quadrado(Double p){perimetro=p;
}
public boolean equals(Quadrado q){if(this.perimetro==q.perimetro)return true;
elsereturn false;
}}
50© LES/PUC-Rio
Implementação da Igualdade (2)
• No exemplo abaixo, a mensagem p1 e p2 sãodiferentes será exibida na console como resultado dacomparação de p1 com p2.
import poligonos.*;
public class EX {public static void main(String[] args){Quadrado p1=new Quadrado(16.0),p2=new Quadrado(17.0);
if(p2.equals(p1))System.out.println("p1 e p2 são iguais");
elseSystem.out.println("p1 e p2 são diferentes");
}}