Interfaces e chamadas de métodos

Olá, pessoal ! O código abaixo…

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 ?

Obrigado a todos!

Luciano.

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.

Acho que eu estava mesmo pensando em C#… :-/
Eu agradeço muito as respostas !
Um abraço a todos !

Luciano.