首页 新闻 会员 周边

关于父类的引用指向子类的对象的问题

0
悬赏园豆:100 [已解决问题] 解决于 2019-10-25 16:26

Animal a = new Dog();我创建的对象a是Animal类型的还是Dog类型的?

a.eat();我调用的是Animal的方法还是Dog的?

在什么情况下使用父类引用指向子类对象

进击的狗健的主页 进击的狗健 | 初学一级 | 园豆:69
提问于:2019-10-25 15:17
< >
分享
最佳答案
0

a的真实对象是Dog。
如果dog对eat方法overrider了的话,a.eat()调用的是dog的eat(),如果没有则是animal的eat();

栗子:
动物园{
开饭啦(animal[] animals){
foreach(var animal in animals){
animal.eat(new{water,meat});
}
}
}
动物园.开饭啦(new animal[]{new pig(),new dog(),new tigger()});

收获园豆:90
czd890 | 专家六级 |园豆:14412 | 2019-10-25 15:26

这种方式略有不同哈。
dog{
public new void eat(){};
}

czd890 | 园豆:14412 (专家六级) | 2019-10-25 15:34

我这样理解:有很多个子类,通过父类引用指向子类的对象,子类就调用了父类的方法,不用重写,比较简洁方便是嘛

进击的狗健 | 园豆:69 (初学一级) | 2019-10-25 15:37

@进击的狗健:
Animal a = new Dog();我创建的对象a是Animal类型的还是Dog类型的?
a的真实对象类型是Dog, 可以通过a.gettype()== typeof(Dog),你看是不是true来判定。

czd890 | 园豆:14412 (专家六级) | 2019-10-25 16:13

@czd890: 好了 是Dog类型的,我用的是getClass方法和instanceof方法判断出来的,因为我不理解你说的gettype()这个,这是方法吗 。再次感谢

进击的狗健 | 园豆:69 (初学一级) | 2019-10-25 16:25

@进击的狗健: java里面是getclass,.net里面是gettype

czd890 | 园豆:14412 (专家六级) | 2019-10-25 16:52

@czd890: 怪不得我说怎么我打的时候显示没有这个方法,我理解了为什么要这样创建对象了

进击的狗健 | 园豆:69 (初学一级) | 2019-10-25 16:54
其他回答(3)
0

Animal a = new Dog();我创建的对象a是Animal类型的还是Dog类型的?
答:Animal类型

a.eat();我调用的是Animal的方法还是Dog的?
答:你自己试试好了

在什么情况下使用父类引用指向子类对象
答:这就是面向对象编程的精华之一,如果你想创建扩展性好的程序,针对抽象编程是一个好办法,详情看参见设计模式相关的书或 https://www.oodesign.com/

随便看一本设计模式的书,看透了你就知道这么写的好处了,推荐《headfrist 设计模式》,这本书比较简单

收获园豆:10
会长 | 园豆:12401 (专家六级) | 2019-10-25 15:46

好的 谢谢了 我刚入门

支持(0) 反对(0) 进击的狗健 | 园豆:69 (初学一级) | 2019-10-25 15:50

试过了,调用的是Dog的,当Dog继承之后不重写的话,是不会调用Animal的方法的。为什么楼上说a是Dog类型的,怎么验证一下a的类型,有什么方法吗

支持(0) 反对(0) 进击的狗健 | 园豆:69 (初学一级) | 2019-10-25 16:07

@进击的狗健: 可以用过GetType函数查看对象的Type

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2019-10-25 17:59
0

有以下情况:
一:Dog只继承Animal 此时调用Animal类的eat方法
二:Animal的eat使用virtual关键字 Dog继承Animal并使用override重写eat方法 此时调用Dog中的eat方法
三:Animal的eat使用virtual关键字 Dog继承Animal并使用new关键字 此时调用Animal中的eat方法
四:Dog只继承Animal(Animal中的eat方法没使用任何修饰符) Dog继承Animal 并使用new关键字 此时调用Animal中的eat方法

初夏的阳光丶 | 园豆:641 (小虾三级) | 2019-10-25 15:55
0

new Dog();

解释一下new,很多人会忽略 其含义:为类分配堆内存,并且返回对象引用(地址)。

Animal a :这是描述一个引用;那么既然用Animal描述a,那么限定a的操作将是Animal的成员。

花飘水流兮 | 园豆:13560 (专家六级) | 2019-10-25 15:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册