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.