Dúvida. Porque sai isso?!

3 respostas
S

Boa noite, tenho uma dúvida básica de uma questão de um mock(Dan). Porque à resposta é AAA?

class A{void m1(A a}{System.out.println("A")}};
class B extends A{void m1(B b){System.out.println("B")}};
class C extends B{void m1(C c){System.out.println("C")}};
class D{
        public static void main(String args[]){
              A a1 = new A; A b1 = new B(); A c1 = new C(); C c4 = new C();
              a1.m1(c4); b1.m1(c4); c1.m1(c4);
        }
}

3 Respostas

M

Corrigindo alguns erros de digitação nesse código ele imprime realmente AAA.
Acredito que seja pelo seguinte:

Você está tendo aí uma sobrecarga de métodos e não a subscrição de métodos.

E pelo que pude observar ele sempre chama o método correspondente ao tipo da variável de referência e não ao objeto.

Ex.: se você fizer essa chamada

B b1=new B();

B b2=new C();

b1.m1(c4);

b2.m1(c4);

a saída será BB.

Já no caso de subscrição de métodos o método chamado seria referente ao tipo do objeto.

Ex:

class A{

void f(){

System.out.println(“A”);

}}
class B extends A{

void f(){

System.out.println(B);  //método subscrito e não sobrecarregado

}

public static void main(String args[]){

A a=new B();

a.f();

}

}

saída será B.

Caso eu tenhafalado besteira, peço que me corrijam.

analyser

Desculpe acho que falei besteria, bem pelo o que vi no Código não deveria dar AAA se der gostaria de saber o motivo tambem

Abraços

R

Acho que o Marcos disse tudo. Como não há sobrescrita, não acontece como com polimorfismo e o método chamado é aquele do tipo da variável. Pelo mesmo motivo, o exemplo que o marcos deu vai exibir “BB”. Se os métodos m1 das classes B e C recebessem um parametro do tipo A, aí sim a saída seria “ABC”, pois estaria ocorrendo sobrescrita dos métodos e, através de polimorfismo, os métodos dos objetos é que seriam chamados (ao invés dos métodos do tipo da variável).

Criado 4 de julho de 2007
Ultima resposta 4 de jul. de 2007
Respostas 3
Participantes 4