25
23/03/2016 1 INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOS Departamento de Informática – PUC-Rio Ivan Mathias Filho [email protected] 2 © LES/PUC-Rio Programa – Capítulo 4 Tipos Enumerados Generalização e Herança Visibilidade Chamada de Construtores A Classe Object

INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-04.pdf · • Antes da edição JSE5 (JDK 1.5) a linguagem Java não oferecia suporte direto à construção

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");

}}