• Nenhum resultado encontrado

77Todos os direitos reservados a 3Way Networks

No documento Linguagem Java COMPLETA (páginas 77-79)

Linguagem de Programação Java

Seja um Profissional Aprendendo com Profissionais

www.3way.com.br 68

7.4.4 Operações Polimórficas por Sobreposição de Métodos

Atentemos novamente para a hierarquia de classes da Figura 7.3, a classe Animal define o comportamento

fazerRuido(), é óbvio que animais diferentes como Cachorro e Gato produzem sons diferentes, o que é comum é o

fato de que ambos produzem algum tipo de som (ou ruído). É desejável que características específicas possam ser implementadas para cada subclasse.

Esta característica de sobreposição nos permite implementar um mesmo comportamento e especializá-lo na subclasse. Veja exemplo:

public class Carnivoro { String ruido;

public Carnivoro(String ruido){ this.ruido = ruido;

}

void fazerRuido(){

System.out.println("nao faço ruidos ainda"); }

void comer(){

System.out.println("preferencia por proteina animal"); }

void andar(){

System.out.println("ando com quatro patas"); }

}

Listagem 7.9 – Superclasse Carnivoro

Definindo uma subclasse Cachorro, que redefine método fazerRuido() (linha 6):

public class Cachorro extends Carnivoro { public Cachorro() {

super("Auuuu,auuu,auuu"); }

void fazerRuido(){

System.out.println("Latir="+ ruido); }

}

Listagem 7.10 – Subclasse Cachorro, especialização de Carnivoro

Definindo uma subclasse Gato, que redefine método fazerRuido() (linha 6):

public class Gato extends Carnivoro { public Gato() {

super("Miauuuu,miauuu,miauuu"); }

void fazerRuido(){

System.out.println("Miar ="+ ruido); }

}

Listagem 7.11 – Subclasse Gato, especialização de Carnivoro

Em Java os métodos da superclasse podem ser

redefinidos nas subclasses, dizemos que o

método está sendo sobreposto (override) nas

//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. Para testarmos essa característica polimórfica de Java vamos escrever a seguinte classe:

public class TestaCarnivoro {

public static void main(String[] args) {

Carnivoro bicho = new Carnivoro("sem ruido"); bicho.fazerRuido(); // (1) qualquer carnivoro bicho = new Cachorro();

//tem que latir

bicho.fazerRuido();// (2) bicho = new Gato();

//tem que miar

bicho.fazerRuido();// (3) }

}

Listagem 7.12 – Testando polimórfismo

O método fazerRuido() agora é especifico para cada subclasse (Cachorro e Gato) da superclasse (Carnivoro), mas que método será chamado, o da superclasse ou da subclasse?

bicho.fazerRuido();

Quando o método é chamado a referência de objeto bicho estará chamando a versão mais específica do método para o tipo de objeto sendo referenciado por bicho.

1. Na Listagem 7.12, linha 4, será invocado o método fazerRuido() de Carnivoro (listagem 7.9 linha 6); 2. Na listagem 7.12, linha 7, será invocado o método fazerRuido() para Cachorro (listagem 7.10 linha 6); 3. Na listagem 7.12 linha 10, será invocado o método fazerRuido() para Gato (listagem 7.11 linha 6);

Podemos dizer que a JVM tenta localizar a assinatura do método sendo invocado pelas classes mais especializadas, as que estão nos níveis mais baixo da hierarquia de classes. Se não encontrar uma versão do método nessa classe, começará a retroceder, subir, na hierarquia até encontrar algo que atenda.

A JVM determina o método a ser invocado em tempo de execução usando um recurso denominado de

ligação tardia, isso significa que durante o processo de compilação não é feita qualquer ligação entre a chamada

por uma referência e método a ser invocado, exceto se o método for marcado pelos modificador static ou final.

7.4.4.1 Invocando Métodos Sobrepostos

É muito útil, pois o objetivo real da sobrescrita não é substituir a versão de método da superclasse, mas estendê-lo.

public class Funcionario { String nome;

double salario; Date aniversario;

String valoresCampos() { return "Nome: " + nome +

"\nSalario: " + salario; }

}

Listagem 7.14 – Superclasse Funcionário

Podemos invocar métodos da superclasse, sobrescritos da subclasse, usando a referência super.

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.

79

No documento Linguagem Java COMPLETA (páginas 77-79)

Documentos relacionados