[RESOLVIDO] - Polimorfismo - ativação dinâmica

4 respostas
ECO2004

Estou com uma dúvida. Coloco ela depois dos códigos…

package com.ativacao.dinamica;

public class Empregado {
	
	public Empregado(){}
	
	public void imprime(){
		
		System.out.println("Método em Empregado");
	}

}
package com.ativacao.dinamica;

public class Gerente extends Empregado {
	
	public Gerente(){}
	
	public void imprime(){
		
		System.out.println("Método em Gerente");
	}
}
package com.ativacao.dinamica;

public class Main {
	
	public static void main(String[] args) {
		
		//upcasting implícito.
		Empregado emp = new Gerente();
		emp.imprime();
	}

}

(1) Na main, crio um objeto e atribuo a sua referência à variável emp. O algorítmo de ligação dinâmica procura onde está a definição do método imprime(). Porém, foi realizado um upcast implícito ao atribuir à variável emp - do tipo Empregado - uma referência a Gerente. Gerente foi renomeado (não mudou de tipo de objeto) para Empregado. Apenas aqueles métodos de Gerente que também são Empregado estão disponíveis para acesso através de emp.

(2) O método imprime() foi redefinido em Gerente. O comportamente desse método pertence apenas à Gerente. Eu a vejo como um método exclusivo de Gerente. Assim, ele não deveria ser invocado, entretanto, o é.

A saída é Método em Gerente.

Por acaso, imprime() não é considerado um método exclusivo de Gerente, mesmo depois de ter sido sobrescrito?

4 Respostas

M

qual comportamento que vc esperava???

ECO2004

Pelo que descrevi, esperava que fosse chamado o método da superclasse.

Quando eu faço um upcast em Gerente, esse não é renomeado “temporariamente” para Funcionario? Nesse caso, somente os métodos de Gerente como Funcionarios podem ser acessados. Quando eu utilizo a variável de referência para acessar os métodos, o algorítmo de ativação não procura pela definição do método? Se o método foi definido na subclasse, ela não estará disponível, pois os seus métodos exclusivos estão “ocultos”. Na minha concepção [anterior], imprimir seria um método exclusivo de Gerente por ter sido redefinida. Porém, pensando um pouco mais, o método imprimir() é o mesmo, pois não mudei a sua assinatura. Por isso que quando o algorítmo de ativação procura pela definição do método, ele a encontra em Funcionario. Como Gerente é - temporariamente - somente um Funcionário, graças ao upcast, o método imprimir() em Gerente é chamado.

Está certo?

rmendes08

Isso se chama dynamic binding. Em tempo de compilação o compilador Java busca a definição de um método a partir do tipo da expressão que invoca o método, nesse caso, a classe Empregado.

Porém, em tempo de execução, a busca pela implementação se dá através do tipo do objeto referenciado. Essa busca começa pelas subclasses e sobe na hierarquia de tipos até achar o método ou lançar uma exceção.

Em C++ você pode usar tanto dynamic binding quanto static binding, dependendo de como você declara o método na superclasse.

ECO2004

Obrigado, pessoal!

Criado 26 de maio de 2012
Ultima resposta 27 de mai. de 2012
Respostas 4
Participantes 3