Questão FC266133
Qual o resultado da impressão ao executamos a classe Homem?
Linguagens de Programação
IDECAN · 2019
Dadas as seguintes classes, todas no mesmo pacote:
public class Mamifero {
protected void andar(){
System.out.print("Mamífero andando ");
ouvir();
}
protected void ver(){
System.out.print("Mamífero vendo ");
}
protected void ouvir(){
System.out.print("Mamífero ouvindo ");
ver();
}
}
public class Primata extends Mamifero{
protected void andar(){
System.out.print("Primata andando ");
ouvir();
}
}
public class Homem extends Primata{
protected void ver(){
System.out.print("Homem vendo ");
}
public static void main(String args[]){
Mamifero m = new Homem();
m.andar();
}
}
Qual o resultado da impressão ao executamos a classe Homem?
- Mamífero andando Mamífero ouvindo Mamífero vendo
- Primata andando Mamífero ouvindo Homem vendo
- Uma exception será lançada: MethodNotFoundException
- Mamífero andando Mamífero ouvindo Homem vendo
- Primata andando Mamífero ouvindo Mamífero vendo
Mostrar resposta e comentário
Gabarito
B
Comentário do professor
O resultado é: Primata andando Mamífero ouvindo Homem vendo.
Em main criamos Mamifero m = new Homem(), ou seja, há polimorfismo: a referência é do tipo pai, o objeto é do tipo filho. Ao chamar m.andar(), a JVM faz despacho dinâmico e procura a implementação mais específica disponível na hierarquia.
Como Homem não sobrescreve andar(), é usado o andar de Primata, que imprime "Primata andando " e invoca ouvir(). Ouvir() não foi sobrescrito em Primata nem em Homem, então executa a versão de Mamífero, que imprime "Mamífero ouvindo " e chama ver().
Por fim, ver() foi sobrescrito em Homem, portanto imprime "Homem vendo ". A concatenação desses prints produz a saída indicada.
Conteúdo do catálogo FC Concursos · Atualizado em