Classe de moldagem em java

No meu código ,há duas classes, a subclasse estende-se. superclass.In a classe i sobrepõe-se ao método da superclasse. No tempo da criação do objeto eu criei a referência superclasse ao objeto sub-classe sua multa de trabalho. Mas mais uma vez converti a referência super classe para um objeto super classe completa, mas ela chama sub classe metodn Não método super classe. Presumo que a saída esteja errada.Aqui está o meu código.
public class OverRiding {
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //Super class reference to sub class Object
        Dog dog = new Animal();
        dog.eat();
        dog.bow();

        //Completely converted into pure Dog class Object
        Dog d = (Dog) dog;
        d.eat();
        d.bow();
    }
}

classe de cães

class Dog {
    public void eat() {
        System.out.println("Dog eat Biscuits");
    }

    public void bow() {
        System.out.println("Dog bow");
    }
}

Classe Animal

class Animal extends Dog {
    public void eat() {
        System.out.println("Animal eat Food");
    }
}

e a minha produção riz[6]}

Animal eat Food
Dog bow
Animal eat Food
Dog bow
Author: Flakkenmarsh, 2013-10-10

5 answers

O teu conceito não está correcto, mano...
 class Animal extends Dog
Como pode um Animal estender um cão? . É como dizer - "cada ANIMAL é um cão". O que é errado... Então, deve ser ao contrário...

Este exemplo só o irá confundir mais..

Donno, porque é que ninguém falou nisto?..
 6
Author: TheLostMind, 2013-10-10 09:22:57
 Dog d = (Dog) dog;

Aqui d não é um objecto puro Dog. Ainda é do tipo Animal. Pure Dog object would be created via Dog d = new Dog().

 3
Author: RandomQuestion, 2013-10-10 08:51:01
   Dog dog = new Animal();
    //Completely converted into pure Dog class Object
    Dog d = (Dog) dog;

Ambos Dog e d estão a apontar para a mesma referência, uma vez que não estão a criar um Novo object. O elenco não fará efeito aqui.

Lançar e criar é completamente diferente.
 2
Author: ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, 2013-10-10 08:52:40

Neste exemplo, você só criou um objeto, e é um Animal, (que, infelizmente, é um tipo especial de Dog). Quando você chamar eat sobre este objeto, você vai sempre obter a versão definida na classe Animal, não a versão definida na classe Dog.

Isso é polimorfismo. A versão do método que é chamado depende da classe do objeto, não do tipo da variável que se refere a ele.
 1
Author: Dawood ibn Kareem, 2013-10-10 08:51:44

A tua suposição é falsa:

Completamente convertido em objecto puro de classe Canina

Quando você está lançando o seu Animal para um Dog, a sua variável d ainda é um Animal. É também um Dog, mas o tipo mais específico é Animal.

Você não está completamente convertido a sua variável para outra instância. O teu caso continua o mesmo.

Para uma prova, pode tentar este código:

Dog d = (Dog) dog;
d.getClass(); // output Animal
 1
Author: Cyril Gandon, 2013-10-10 08:54:06