• Nenhum resultado encontrado

73Todos os direitos reservados a 3Way Networks

No documento Linguagem Java COMPLETA (páginas 73-75)

Linguagem de Programação Java

Seja um Profissional Aprendendo com Profissionais

www.3way.com.br 64

public final class Gerente { // Código da classe aqui }

Muitas classes na API Java são declaradas final para certificar que seu comportamento não seja herdado e possivelmente modificado. Exemplos são as classes Integer, Double, Math e String.

7.4 Polimorfismo

Um mesmo método pode apresentar várias formas, de acordo com seu contexto. O polimorfismo é importante pois permite que a semântica de uma interface seja efetivamente separada da implementação que a representa.

O termo polimorfismo é originário do grego e significa muitas formas (poli = muitas, morphos = formas). (ver wikipedia).

Entendeu? Não! Então tenha calma, vamos explicar!

Na prática, se temos uma hierarquia de classe como na figura abaixo:

Figura 7.3 – Polimorfismo e Herança

então podemos fazer a seguinte declarações: Animal cao = new Cachorro(); Animal bichano = new Gato();

ou seja, uma variável de referência de uma classe mais genérica (superclasse) pode receber referência de objetos de classes mais especializadas (subclasses). Sendo assim, podemos também declarar:

Animal bicho;

bicho = new Cachorro();

bicho.fazerRuido(); //ruído é o latir de cachorro bicho = new Gato();

bicho.fazerRuido(); //ruído é o miar do gato

O método fazerRuido(), definido como uma característica da classe Animal, foi sobreposto pelas versões do método nas subclasses Cachorro e Gato, embora possuam a mesma assinatura (mesmo nome, número de parâmetros e tipos dos parâmetros), eles apresentam resultados com formas diferentes.

Polimorfismo permite que referências de tipos de classes mais abstratas

(genéricas) representem o comportamento das

classes concretas que referenciam.

//atribuindo valor a variável referência Carro carro1 = new Carro();

carro1.ano = "2001"; carro1.modelo= "fusca"; carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização //criando novo alias

Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância

Cada objeto criado deverá ter sua própria instância de variáveis (atributos) definidas pela classe. Os métodos definem o comportamento de um objeto. Isto é importante, pois denota que um método pertence a cada objeto da classe. Porém não devemos confundir isto com a implementação do método, que é compartilhada por todas as instâncias da classe.

2.3.1 Invocação de Métodos

Objetos se comunicam pela troca de mensagens, isto significa que um objeto pode ter que mostrar um comportamento particular invocando uma operação apropriada que foi definida no objeto. Em Java, isto é feito pela

chamada de um método em um objeto usando o operador binário "." (ponto),

devendo especificar a mensagem completa: o objeto que é o recebedor da mensagem, o método a ser invocado e os argumentos para o método (se houver). O método invocado no recebedor pode também enviar informações de volta ao objeto chamador através de um valor de retorno. O método chamado deve ser um que esteja definido pelo objeto.

Os valores das variáveis em um objeto constituem

o seu estado. Dois objetos distintos têm

o mesmo estado se suas variáveis membro têm os

mesmos valores.

7.4.1 Coleções Heterogêneas de Objetos

Em nosso estudo sobre arrays, vimos que ele é uma estrutura de dados que armazena diversos elementos do mesmo tipo de dados, desde tipos primitivos bem como referências para outros objetos. Agora imagine-se formando um petshop a partir da hierarquia de classes apresentada na Figura 7.3, onde temos definidos, além das classes Cachorro e Gato, as classes Canario e Coelho. Sem polimorfismo, essa tarefa nos levaria a definir uma estrutura de array para cada tipo de animal em nossa loja, exemplo:

//coleção de Cachorros

Cachorro [] caes = new Cachorro[3]; caes[0] = new Cachorro("Raja"); caes[1] = new Cachorro("Lilica"); caes[2] = new Cachorro("Lupi"); //coleçao de Coelhos

Coelho [] peludos = new Coelho[3]; peludos[0]=new Coelho("Fred"); peludos[1]=new Coelho("Fofão");

O recurso do polimorfismo nos permite criar um único array para nossa coleção de animais, veja:

//cria coleção

Animal[] bichos = new Animal[10]; //atribui referencia a coleção bichos[0] = new Cachorro("Raja"); bichos[1] = new Gato("Garfield"); bichos[2] = new Canario("Piupiu"); bichos[3] = new Coelho("Pernalonga"); bichos[4] = new Coelho("Lilica"); bichos[5] = new Gato("Frajola");

Uma vez que toda classe em Java estende a classe Object, é possível manipular coleções genéricas para todos os tipos de dados, inclusive de valores de tipos primitivos (neste caso devemos fazer uso das classes empacotadoras):

Object[] primitivos = new Object[3]; primitivos[0] = new Integer(10); primitivos[1] = new Double(2.2); primitivos[2] = new Character("C"); 7.4.2 Determinando a Classe de um Objeto

Um dos problemas que enfrentaremos ao lidar com referências genéricas para objetos de subclasses, é que não sabemos mais a qual classe pertence a referência armazenada. Reveja nosso exemplo da coleção de animais, a qual classe pertence a referência de objeto armazenada em bichos[4]? Tudo bem você olhou o código- fonte e descobriu que é do tipo Coelho, mas nem sempre isso é possível. Então como determinar a classe de um

objeto?

Existem duas maneiras de se descobrir a qual classe determinado objeto pertence:

1. Obtendo-se o nome da classe: Utiliza-se o método getClass() que retorna a classe do objeto (onde Class é a classe em si) que possui o método chamado getName() que retorna o nome da classe.

Por exemplo:

String name = bichos[4].getClass().getName();

2. Testar se um objeto qualquer foi instanciado de uma determinada classe: Utiliza-se a palavra-chave

instanceof. Esta palavra-chave possui dois operadores: a referência para o objeto à esquerda e o nome da classe à

Linguagem de Programação Java

Seja um Profissional Aprendendo com Profissionais

www.3way.com.br 12

//atribuindo valor a variável referência Carro carro1 = new Carro();

carro1.ano = "2001"; carro1.modelo= "fusca"; carro1.cor = "prata";

Figura 2.4 – Layout Memória após inicialização //criando novo alias

Carro carro2 = carro1;

Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto

2.3 Membros de Instância

Cada objeto criado deverá ter sua própria instância de variáveis (atributos) definidas pela classe. Os métodos definem o comportamento de um objeto. Isto é importante, pois denota que um método pertence a cada objeto da classe. Porém não devemos confundir isto com a implementação do método, que é compartilhada por todas as instâncias da classe.

2.3.1 Invocação de Métodos

Objetos se comunicam pela troca de mensagens, isto significa que um objeto pode ter que mostrar um comportamento particular invocando uma operação apropriada que foi definida no objeto. Em Java, isto é feito pela

chamada de um método em um objeto usando o operador binário "." (ponto),

devendo especificar a mensagem completa: o objeto que é o recebedor da mensagem, o método a ser invocado e os argumentos para o método (se houver). O método invocado no recebedor pode também enviar informações de volta ao objeto chamador através de um valor de retorno. O método chamado deve ser um que esteja definido pelo objeto.

Os valores das variáveis em um objeto constituem

o seu estado. Dois objetos distintos têm

o mesmo estado se suas variáveis membro têm os

mesmos valores.

75

No documento Linguagem Java COMPLETA (páginas 73-75)

Documentos relacionados