Alguem poderia dar um exemplo sobre isso (Livro Kathy)

“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.”

págs 59 e 60

Abraços

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();
    }
}

O que vai aparecer no console?

Acho que é isso:

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:

((PessoaFisica)fulano).D();

acho que é isso…

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 =)

Vai aparecer:

Método de Y

Correto…
Pois é. Acertei essa e as outras 10 questões da provinha e me chamaram para trabalhar na empresa.
Que ridículo… :lol:

[quote=Fernando Generoso da Rosa]Vai aparecer:

Método de X[/quote]

??? :shock:

[quote=Fernando Generoso da Rosa]Vai aparecer:

Método de X[/quote]

Corrigiu senão fica feio neh :?

Caraca, que susto.

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:

hauhuhuha ele confiou tanto na resposta que ele mesmo mudou a resposta :stuck_out_tongue:

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.