Classe de moldagem em java
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
5 answers
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?.. 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()
.
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.
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
.
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