我想知道为什么父对象不能分配给子对象的技术原因。例如:
Class Animal{}
Class Dog : Public Animal{}Animal a = new Dog()是可能的,但是为什么呢?
不能使用Dog g = new Animal()。
我知道,根据上面的关系“狗”是“动物而不是动物”是“狗”。但它背后的技术原因是什么呢?为什么我们不能分配它?
发布于 2011-03-06 02:43:42
因为狗会叫。一般来说,动物不会这样做。
Dog g = new Animal();
g.bark();g怎么会知道叫呢?作业有没有神奇地把动物变成一只狗?如果它是一只鹦鹉呢?我们怎样才能把鹦鹉变成狗?或者,如果赋值没有转换任何东西,那么鹦鹉怎么会知道如何叫呢?(请注意,这是一只挪威蓝鹦鹉,它并不知道如何做任何事情。)
发布于 2011-03-06 02:41:43
这既有逻辑上的原因,也有技术上的原因-- Animal的实例并不具有Dog的所有方法和字段。例如:
class Animal {
public int legs;
}
class Dog extends Animal {
public int fangs;
}
Dog dog = new Animal();
dog.fangs = 5;但您使用的是没有fangs的Animal,因此它将失败。
不过,您通常可以向下转换:
public doSomethingDoggish(Animal animal) {
((Dog) animal).bark();
}但是,如果您没有在那里传递Dog的实例,它将在运行时失败。
发布于 2011-03-06 02:43:06
因为这样你就可以写
Animal animal = new Rabbit();
Dog d = animal;
d.bark(); // but it's a Rabbithttps://stackoverflow.com/questions/5205930
复制相似问题