Dúvida O.O - Chamada de métodos por variáveis de instancia

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.

Jovem,

Creio que você entendeu o conceito mas irei fazer um resumo para fixar a ideia.

public class Animal {
	public void imprimir(){
		System.out.println("Animal");
	}
}
public class Cao extends Animal{
	public void imprimir(){
		System.out.println("Cao");
	}
	
	public void som(){
		System.out.println("AU au au");
	}
}

No exemplo acima a classe Cao herda o metodo imprimir de Animal, mas como pode observar o metodo imprimir eu o sobrescrevi na classe Cao.

Utilizando o polimorfismo teremos o seguinte comportamento.

Animal animal = new Cao();
animal.imprimir();

No exemplo acima será impresso a mensagem “Cao”.

Em tempo de compilação o compilador enxerga apenas os metodos que estão implementados na referencia por exemplo imprimir não seria possivel chamar o som no exemplo acima . Mas quando este código for executado a JVM irá executar o metodo imprimir do Objeto Cao.

Não sei se fui claro mas caso continuem com dúvida me avisa.

Posso te mandar materiais referente a POO.

abs,

entendi sim cara, valeu mesmo!