Pessoal, em polomorfismo/herança fiquei confuso sobre variáveis de referência e queria saber se compreendi direito
Dei uma lida em Java Como Programar (8ed) e estou lendo o livro da Kathy para certificação SCJP 1.5
primeiramente, o livro da kathy diz assim:
Invocações de métodos permitidas pelo compilador são baseadas somente no tipo de referência declarado, independentemente do tipo do objeto
entao se temos, por exemplo:
PlayerPiece player = new PlayerPiece();
a primeira PlayerPiece, logo antes do ‘player’, é o tipo da referência
a segunda PlayerPiece, logo depois do ‘new’, é o tipo do objeto
agora analisando um caso de polimorfismo, exemplo tirado do livro Java Como Programar:
Classe abstrata Funcionario tem o método abstrato beneficios();
Duas classes herdam a classe Funcionario: FuncionarioHora e FuncionarioComissao, cada uma sobrescrevendo seu próprio método beneficios
Dai vem o trecho de codigo (modifiquei pra colocar somente informaçao relevante pra minha duvida) :
[code]HourlyEmployee hourlyEmployee = new HourlyEmployee(); // FuncionarioHora
ComissionEmployee comissionEmployee = new ComissionEmployee(); //FuncionarioComissao
Employee[] employees = new Employee[2]; //Employee seria o que chamei de Funcionario. a classe abstrata com o metodo beneficios();
employees[0] = hourlyEmployee;
employees[1] = comissionEmployee;
System.out.println(“Employees processed polymorphically:\n”);
for(Employee currentEmployee : employees)
{
System.out.printf(“earned $%,.2f\n\n”,currentEmployee.beneficios() ); //acessa o metodo beneficios de cada subclasse de Employee (funcionario).
}[/code]
agora, finalmente, a dúvida:
no trecho employees[0] = hourlyEmployee;
o tipo da referência é Employee, e o tipo do objeto é hourlyEmployee
De acordo com a frase que escrevi aqui do lirvo da Kathy, o que define se o método pode ser acessado é o tipo da referencia, no caso Employee.
Então, a razão de poder acessar o método é devido ao fato da referência ser tipo Employee, uma classe que possui o método beneficios(), mesmo que abstrato?
E o método real a ser chamado é definido pelo tipo do objeto entao?
Desde já agradeço!
Abraço.