Dúvidas métodos subscritos

7 respostas
S

Primeiro post :lol:

class Vaca {
    public void berrar() {
        System.out.println("muuu");
    }
}

class Ovelha extends Vaca{
    public void berrar(){
        System.out.println("meee");
    }
    void anda(){
        System.out.println("Andando...");
    }
}

public class Apple {
    public static void main(String[] args) {
            Vaca nova2 = new Ovelha();      
          
    }
}

O livro, SCJP 5, diz que na linha 18 tem uma referência Vaca, mas é um objeto Ovelha. Eu pensei: Como é que é???

Se eu fizer nova2.berrar(), ele irá imprimir “meee”. Não seria “muuu”?
Se eu fizer nova2.andar(), irá dar erro. Se é um objeto ovelha eu não poderia também usar o método andar?

Alguém me explica esse dois fenômenos?

7 Respostas

fiaux

Se Ovelha extends Vaca, ou seja, se é uma especialização de Vaca, isso que dizer que é um/é uma, ou seja, Ovelha é uma Vaca (absurdo no mundo real). A classe vai herdar os atributos e métodos, e você pode dar override nos métodos. Se você não der override, em tempo de execução será chamado o método da super classe, no caso Vaca.

dlt

Tive uma dúvida muito parecida há um tempo atrás e o pessoal do guj me explicou timtim por timtim.
Então ao invés de tentar de explicar eu vou apontar o link.

http://www.guj.com.br/posts/list/82053.java

Lá tem mais referências sobre o assunto.

Rafael_Nunes

Em relação a impressão de ‘meee’ e não ‘muuu’, isso em Java é conhecido como late-binding. Ou seja, a execução do método é feita em run-time de acordo com a instância que há em memória. Apesar da referência nova2 ser do tipo Vaca, a instância em memória é do tipo Ovelha, logo, a execução do método é da instância, e não da referência.

Em relação ao método anda, a referência nova2 é do tipo Vaca, logo, apesar da instância em memória ser do tipo Ovelha, a referência só ‘enxerga’ o que é comum entre Vaca e Ovelha, no caso o método berrar.

Dá uma lida melhor sobre Herança e Polimorfismo.

Obs1: Em C# acontece o contrário, conhecido como early-binding, ou seja, a execução do método é definido pela referência, não pela instância, mas você pode simular isso com ‘virtual’.

Obs2: Uma Ovelha extende uma Vaca e é executada por uma Maçã. Alguém aqui está abusando dos alucinógenos.

Obs3: Não tem uma Obs3.

PadrE

dlt:
Tive uma dúvida muito parecida há um tempo atrás e o pessoal do guj me explicou timtim por timtim.
Então ao invés de tentar de explicar eu vou apontar o link.

http://www.guj.com.br/posts/list/82053.java

Lá tem mais referências sobre o assunto.

Matô !!!

S

Rafael Nunes:

Nossa cara valeu mesmo!
Era isso que queria saber.


Obs2: Uma Ovelha extende uma Vaca e é executada por uma Maçã. Alguém aqui está abusando dos alucinógenos.

Eu pensei que vocês nem iam dar bola… :lol:

rmala_ti

Bom dia!
É o seguinte, vc tem que considerar alguns conceitos quando trata-se de métodos sobrescritos e herança:

1- a chamada ao método sobrescrito é totalmente dependente do tipo da variável de referência

nova2.berrar() Neste exemplo nova2 é do tipo da classe Vaca que possui o método berrar(), então você pode chamar este método

nova2.andar() Neste caso a classe Vaca não possui o método andar(), então você não poderá chamá-lo, baseado unicamente no tipo da variável de referência que é da classe Vaca. rs

2- a chamada a métodos sobrescritos tem uma chamada a um método virtual pela JVM, que neste momento decidirá de qual classe será o método verdadeiro a ser executado, baseado no tipo real do objeto, que neste caso é Ovelha.

nova2.berrar() Neste caso, o método virtual, selecionará o método berrar() da classe Ovelha, já que esta classe sobrescreveu este método.
Se a classe Ovelha não tivesse sobrescrito, e simplesmente herdado, o método a ser chamado seria o método berrar() da classe Vaca.

Espero ter contribuído.
Abraço.

rmala_ti

Nossa isso é realmente confuso!

Pensar em duas linguagens, isso sim é usar alucinógenos.

Huahuahaua,

Abraço

Criado 14 de maio de 2008
Ultima resposta 15 de mai. de 2008
Respostas 7
Participantes 6