“As chamadas de metodos polimorficos se aplicam somente a metodos de instancias. Voce sempre pode se referir a um objeto com um tipo de variável de referencia mais geral (uma superclasse ou interface)… Apenas métodos de instancias sobrescritas sao chamados dinamicamente com base no tipo real do objeto.”
Cara, hoje na entrevista que eu fiz, caiu uma questão abordando isso:
class X {
public void m() {
System.out.println("Método de X");
}
}
class Y extends X {
public void m() {
System.out.println("Método de Y");
}
}
public class Teste {
public static void main(String... args) {
X y = new Y();
teste(y);
}
public static void teste(X x) {
x.m();
}
}
Você tem Uma superclasse Pessoa e uma classe que extende pessoa, chamada PessoaFisica.
Em Pessoa, voce tem os métodos A, B e C.
Em Pessoa Física, Além dos métodos herdados, você tem o método D, E e F.
aí você faz instancia uma pessoa:
Pessoa fulano = new PessoaFisica();
se voce for verificar os métodos que voce tem acesso, voce verá que poderá acessar apenas os métodos A, B e C, que são os métodos herdados de pessoa, apesar de tu dar um new em pessoa fisica. Para acessar os métodos de Pessoa física, você deverá fazer um cast:
kra, isso cai muito na prova, o exemplo do TangZero é bom pra ilustrar, a jvm só segue o objeto em métodos de instância, fora isso, ela segue a referência =)
Até compilei e rodei esse trecho de código aqui, para ter certeza que eu não estava enganado.
O cara foi tão direto na resposta, que quase me convenceu que a resposta era “Método de X”.
:lol:
Basicamente ele diz que não há polimorfismo onde há static.
class A {
public void x() { println("A.x"); }
public static void y() { println("A.y"); }
}
class B extends A {
public void x() { println("B.x"); }
public static void y() { println("B.y"); }
}
class Roda {
public static void main(String[] args) {
A a = new B();
a.x();
a.y();
B b = (B) a;
b.y();
}
}
Rode este programa e veja o que ocorre. Em seguida pense um pouco e você entenderá.
EDIT: Por sinal, acessar um método estático via referência é uma péssima prática de programação (e alguns compiladores podem emitir warnings por isso). O melhor é sempre usar A.y() ou B.y() nestes casos.