Uma boa sobre?

compila? roda? imprime o que?

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

bom, nao ha nenhum overriden no codigo, apenas overload

e como uma classe PAI pode receber uma filha, acho que vai sair:
“AAA”

O código compila sim. :smiley:
Acho que o resultado é “AAA”, como o Maximiliano disse a classe pai pode extender a filho… 8)

Falow.

Mesmo sendo iniciante vou tentar: :smiley:

Acho que imprime “ABC”, pois a classe C tem, além de seu método, os métodos herdados e como cada método recebe um parâmetro de tipo diferente será chamado o método correspondente ao tipo.

Realmente acho q é AAA,pq é a superclasse,
pq todas as demais herdam dela (ainda q indiretamente) o método
original m1,q só é modificado localmente nas classes filhas,
logo o método da superclasse é
sempre chamado primeiro.

acertou quem respondeu AAA (e overload), na verdade a questão é uma tentativa de pegadinha para que os incautos pensem que se trata de overriding quando na verdade o método m1 foi apenas overloaded e portanto é sempre a versão da referência que está sendo chamada.

Pergunto em:

c2.m1(b1)

se m1 recebe um objeto B , ele nao deveria imprimir B ja que C herda o metodo m1 () da classe B???

mas no caso, o codigo é
A c2 = new C();

isso faz um objeto do tipo A (em tempo de compilacao)
com os metodos que sofrem override em C

como C nao faz nenhum override, fica como se fosse A c2 = new A();

valeu,
tinha me esquecido desse detalhe :lol: