Onde há exemplo de polimorfismo?

15 respostas
diegofss11

Given concrete Class B is a subclass of concrete Class A, and class A implements interface C, which two are examples of polymorphism? (Choose two)
A. use a reference variable of type B to refer to an instance of type A
B. use a reference variable of type A to refer to an instance of type B
C. use a reference variable of type C to refer to an instance of type A
D. use a reference variable of type A to refer to an instance of type C
E. use a reference variable of type C to refer to an instance of type B

Answer:CE

Eu sei e entendi o conceito de polimorfismo… mas nao entendi porque a questao C e E estão corrreta… eu marquei a B e C (Porque achei que polimorfismo há quando o pai aponta para o filho)

Me ajudem por favor!

Muito obrigado desde já!

15 Respostas

ViniGodoy

Essa questão está extremamente mal formulada. Primeiro, por que só podemos falar em polimorfismo se falarmos em chamadas de métodos. A questão não fala de nenhuma chamada, então, nessa situação simplesmente, nenhum dos casos é um exemplo de polimorfismo.

Ok, agora vamos supor que haja pelo menos um método sendo chamado. Ele deve estar descartando a B, pois B poderia ter declarado métodos diferentes de A, e não haveria polimorfismo. Como C é uma interface, qualquer método de C declarado obrigatoriamente fará polimorfismo ao ser usado com um tipo concreto.

De qualquer forma, você está certo. B também poderia conter uma redefinição de um método de A e, nesse caso, uma chamada a esse método faria polimorfismo, e isso validaria a alternativa B.

De qualquer forma, a questão também esquece que a interface C poderia não ter método nenhum e, portanto, as subclasses não fazerem qualquer tipo de polimorfismo… Existe até mesmo no java exemplos de interfaces desse tipo, como a Cloneable ou a Serializable.

De qualquer forma, as questões do exame costumam a ser mais bem formuladas que isso.

diegofss11

ViniGodoy:
Essa questão está extremamente mal formulada. Primeiro, por que só podemos falar em polimorfismo se falarmos em chamadas de métodos. A questão não fala de nenhuma chamada, então, nessa situação simplesmente, nenhum dos casos é um exemplo de polimorfismo.

Ok, agora vamos supor que haja pelo menos um método sendo chamado. Ele deve estar descartando a B, pois B poderia ter declarado métodos diferentes de A, e não haveria polimorfismo. Como C é uma interface, qualquer método de C declarado obrigatoriamente fará polimorfismo ao ser usado com um tipo concreto.

De qualquer forma, você está certo. B também poderia conter uma redefinição de um método de A e, nesse caso, uma chamada a esse método faria polimorfismo, e isso validaria a alternativa B.

De qualquer forma, a questão também esquece que a interface C poderia não ter método nenhum e, portanto, as subclasses não fazerem qualquer tipo de polimorfismo… Existe até mesmo no java exemplos de interfaces desse tipo, como a Cloneable ou a Serializable.

De qualquer forma, as questões do exame costumam a ser mais bem formuladas que isso.

Eu tirei essa questao de um mock que estou fazendo… mas infelizmente nao entendi … e pretendo fazer a prova SCJA na quarta =/

ViniGodoy

Acho que nem o autor dessa porcaria aí sabia do que estava falando.

evertonsilvagomesjav

kkkkk

Hebert_Coelho

Cara, Vc está entendendo polimorfismo a ponto de saber se perguntar IsA(ÉUM) ou HasA(TemUM)?

Se sim, fica tranquilo. Realmente essa questão aí ta bem louca.

diegofss11

jakefrog:
Cara, Vc está entendendo polimorfismo a ponto de saber se perguntar IsA(ÉUM) ou HasA(TemUM)?

Se sim, fica tranquilo. Realmente essa questão aí ta bem louca.

Eu ACHO que sim… pode fazer alguma pergunta para ver se eu estou preparado mesmo (para adquirir mais confiança :P) por favor?

Obrigado!

Hebert_Coelho

Hum… ok. Vou mandar uma básica mesmo.

public class Animal{
  public abstract void morder(System.out.println("Nhack!"));
}

public class Cachorro extends Animal{
  public void morder(){
       System.out.println("Nhock");
  }

  public void pipi(){
       System.out.println("Molhando o pneu do carro!");
  }
}

Com base no código acima podemos assumir que:
A) Animal animal = new Cachorro(); animal.morder(); Irá imprimir “Nhack!”
B) Animal animal = new Cachorro(); animal.morder(); Irá imprimir “Nhock!”
C) Animal animal = new Cachorro(); animal.pipi(); Irá imprimir(“Molhando o pneu do carro”);
D) Cachorro cachorro = new Animal(); cachorro.morder(); Irá imprimir “Nhock!”

Eu sei que tá facil, mas isso aí é apenas para se ter uma idéia.

diegofss11

jakefrog:
Hum… ok. Vou mandar uma básica mesmo.

public class Animal{
  public abstract void morder(System.out.println("Nhack!"));
}

public class Cachorro extends Animal{
  public void morder(){
       System.out.println("Nhock");
  }

  public void pipi(){
       System.out.println("Molhando o pneu do carro!");
  }
}

Com base no código acima podemos assumir que:
A) Animal animal = new Cachorro(); animal.morder(); Irá imprimir “Nhack!”
B) Animal animal = new Cachorro(); animal.morder(); Irá imprimir “Nhock!”
C) Animal animal = new Cachorro(); animal.pipi(); Irá imprimir(“Molhando o pneu do carro”);
D) Cachorro cachorro = new Animal(); cachorro.morder(); Irá imprimir “Nhock!”

Eu sei que tá facil, mas isso aí é apenas para se ter uma idéia.

considerando que a classe Animal seja abstrata… por que há um metodo abstrato

A) INCORRETA: Porque o metodo morder foi sobrescrito
B) Correta
C) Correta

D) INCORRETA: Poruqe animal NAO É UM CACHORRO, e sim CACHORRO é um animal

Acertei :stuck_out_tongue: ? Considere as justificativas tbm, por favor :smiley:

ViniGodoy

A letra C é incorreta. A partir da variável de referência Animal, não é possível acessar o método pipi() de cachorro.

diegofss11

A simmm, entendi.

ex: Como foi criado um objeto animal do tipo Animal, animal so terá acesso aos metodos pertencentes ao mesmo. Correto? Se sim, eu entendi essa parte, mas e quanto a parte do new Cachorro() ?

Hebert_Coelho

Vamos lá.

A e D tem a explicação correta. Issaeh!

Uma coisa passou errada minha e sua! Hihi.

Acabei por colocar um método abstrato dentro da classe Animal. Eu tava bolando colocar animal abstrato e quando desisti esqueci de tirar o método.

Na verdade não era para nem compilar. =P mas vamos pular essa parte! hihi

Caso não houvesse esse pequeno detalhe do método, se vc perceber na classe Animal não existe o método pipi(). Por isso a classe animal não consegue acessar o pipi().

Veja que animal não é um cachorro, com isso ele não tem acesso a esses métodos! :wink:

A certa seria só a B.

diegofss11

jakefrog:
Vamos lá.

A e D tem a explicação correta. Issaeh!

Uma coisa passou errada minha e sua! Hihi.

Acabei por colocar um método abstrato dentro da classe Animal. Eu tava bolando colocar animal abstrato e quando desisti esqueci de tirar o método.

Na verdade não era para nem compilar. =P mas vamos pular essa parte! hihi

Caso não houvesse esse pequeno detalhe do método, se vc perceber na classe Animal não existe o método pipi(). Por isso a classe animal não consegue acessar o pipi().

Veja que animal não é um cachorro, com isso ele não tem acesso a esses métodos! :wink:

A certa seria só a B.

entendi… so mais uma pergunta, sempre confundo isso…

Animal animal = new cachorro();

Animal nao tera acesso a pipi … por que nao é um cachorro … mas tenho duvida nesta parte (animal e do tipo animal que esta criando um objeto do tipo cachorro, pode explicar essa parte por favor =/ ? ) … quer dizer que esta criando um cachorro do tipo animal ?? … sei la

ViniGodoy

Todo Cachorro é um Animal. Se ele é um animal, então, uma variável do tipo Animal pode guardar um Cachorro.

Quando criamos uma variável do tipo Animal, estamos dizendo que queremos apenas enxergar a parte que é comum a todos os animais.

Ao fazermos

Animal animal = new Cachorro();

Estamos dizendo:

“O animal é um cachorro. Mas só me mostre o que o cachorro tem em comum com outros animais”.

Por isso, os métodos de animal que forem sobrescritos em cachorro se comportarão como o cachorro (afinal, nesse caso, o animal é um cachorro), mas você não poderá ver nada que seja específico de cachorro a menos que faça um cast.

((Cachorro)animal).pipi();
diegofss11

Hummm, entendi =D

Boa explicação mano, muito obrigado!

thiagobaptista

Deixa só eu dar um pitaco, que pode fazer você entender melhor esse conceito.

Quando em Java nós escrevemos esse código:

Animal bichoQualquer;

Nós não estamos criando uma instância da classe Animal.

Então, o que é esse “bichoQualquer”? Ele é uma referência a um objeto (instância) Animal.

O objeto e sua referência são diferentes! Na verdade, vivem inclusive em áreas distintas da memória da JVM. A referência vive na pilha de execução (stack), e o objeto vive no heap.

Pense na referência como uma espécie de controle remoto, que “aponta” para um objeto. Os “botões” desse controle remoto são os métodos que ele pode chamar no objeto. Nesse exemplo, o “controle remoto” bichoQualquer só tem um “botão”: o morder().

Para que esse controle remoto funcione, é preciso que ele “aponte” para um objeto. Mas onde está esse objeto? Ele ainda não foi criado! Por isso nós escrevemos:

new Cachorro();

Ao fazermos isso estamos alocando memória no heap para uma instância da classe Cachorro. Em Java nós não manipulamos as instâncias de objetos diretamente, precisamos de uma referência. E fazemos isso associando uma referência (controle remoto) a um objeto:

Animal bichoQualquer = new Cachorro();

Como a referência é diferente do objeto em si, não importa quais métodos o objeto possui, só conseguiremos chamar os métodos que existem no “controle remoto”, sacou?

Criado 2 de agosto de 2010
Ultima resposta 3 de ago. de 2010
Respostas 15
Participantes 5