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?