首页
学习
活动
专区
圈层
工具
发布

类继承
EN

Stack Overflow用户
提问于 2011-03-06 02:37:42
回答 7查看 124关注 0票数 2

我想知道为什么父对象不能分配给子对象的技术原因。例如:

代码语言:javascript
复制
Class Animal{}

Class Dog : Public Animal{}

Animal a = new Dog()是可能的,但是为什么呢?

不能使用Dog g = new Animal()

我知道,根据上面的关系“狗”是“动物而不是动物”是“狗”。但它背后的技术原因是什么呢?为什么我们不能分配它?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-06 02:43:42

因为狗会叫。一般来说,动物不会这样做。

代码语言:javascript
复制
Dog g = new Animal();
g.bark();

g怎么会知道叫呢?作业有没有神奇地把动物变成一只狗?如果它是一只鹦鹉呢?我们怎样才能把鹦鹉变成狗?或者,如果赋值没有转换任何东西,那么鹦鹉怎么会知道如何叫呢?(请注意,这是一只挪威蓝鹦鹉,它并不知道如何做任何事情。)

票数 3
EN

Stack Overflow用户

发布于 2011-03-06 02:41:43

这既有逻辑上的原因,也有技术上的原因-- Animal的实例并不具有Dog的所有方法和字段。例如:

代码语言:javascript
复制
class Animal {
    public int legs;
}
class Dog extends Animal {
    public int fangs;
}

Dog dog = new Animal();
dog.fangs = 5;

但您使用的是没有fangsAnimal,因此它将失败。

不过,您通常可以向下转换:

代码语言:javascript
复制
 public doSomethingDoggish(Animal animal) {
     ((Dog) animal).bark();
 }

但是,如果您没有在那里传递Dog的实例,它将在运行时失败。

票数 2
EN

Stack Overflow用户

发布于 2011-03-06 02:43:06

因为这样你就可以写

代码语言:javascript
复制
Animal animal = new Rabbit();
Dog d = animal;
d.bark(); // but it's a Rabbit
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5205930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档