public interface Interface {
public void Funcao();
}
public class Base implements Interface
{
public void Funcao() {
System.out.println("Base.Funcao");
}
}
public class Test extends Base
{
public void Funcao() {
System.out.println("Test.Funcao");
}
public static void main( String[] args )
{
Test obj = new Test();
Interface i = obj;
Base b = (Base) i;
obj.Funcao();
i.Funcao();
b.Funcao();
}
}
…imprime isto:
“Test.Funcao”
“Test.Funcao”
“Test.Funcao”
Eu imaginava que a linha b.Funcao() deveria imprimir a frase “Base.Funcao”.
Então eu tenho duas questões:
(a) Por que ela não imprime isso ?
(b) O que é necessário fazer para que o método ‘Base.Funcao’ seja executado ?
Você está confundindo Java com C#. Se fosse em C#, ocorreria exatamente isso.
Mas em Java, o método que será chamado depende da classe do objeto, não de como você chama o método.
Por exemplo, como o objeto “obj” foi criado como “new Test”, sempre será chamado o método definido na classe Test, não importando de que maneira você acesse esse objeto (ou pela interface, ou pela base).
Bom exemplo. Mostra claramente como o polimorfismo funciona.
Perceba que, so existe 1 objeto criado na real: Teste “new Teste()”;
Nao importa como vc o referencia, se com referencia da propria classe, da interface ou superclasse.
Em tempo de execução, a VM sabe que é sempre um objeto Teste.
Para que “Base.funcao” seja executado, é necessario que vc CRIE um objeto Base “new Base()”;
Imagine que o professor da primeira série do primário vire para um aluno e diga:
Mariazinha, aponte para um bichinho. --> Bicho b;
Ela, muito dengosa, aponta para um gato. --> b = new Gato();
Então o professor, vira para outro aluno e pergunta:
Joãozinho, que barulho faz o bicho que Mariazinha aponta? --> b.barulho();
Joãozinho, muito serelepe, responde.
Miau!
Então, o professor fala:
Marizinha, escolha outro bichinho.
Maria olha no quadro e pega um cachorrinho. --> b = new Cachorro();
Novamente ele pergunta para o Joãozinho:
E agora, qual é o barulho que o bichinho faz? --> b.barulho();
E o Joãozinho responde:
Auau!
A hierarquia dessa encrenca é:
[code]
//Todos sabemos que os bichinhos fazem barulho
public abstract class Bicho {
public abstract void barulho();
}
//Gato é um bicho
public class Gato extends Bicho {
public void barulho() { System.out.println(“Miau!”); }
}
//Cachorro também.
public class Gato extends Bicho {
public void barulho() { System.out.println(“Auau!”); }
}[/code]
Toda variável em java só aponta para um objeto real, tal como a Mariazinha fez. Esse objeto tem que ser do tipo da variável. Por exemplo, uma variável Bicho nunca poderia apontar para um Carro.
O polimorfismo nada mais é do que permitir que usemos um nome mais genérico, e trabalhemos de forma genérica, com objetos mais específicos.