2 qq 19471875 qq_19471875 于 2016.04.18 10:17 提问

Java中子类重载的问题

比如我现在又两个具有继承关系的类:
父类:Animal
子类:Dog
在父类中有一个方法eat()
在子类中,除了继承了父类的eat()方法外,我自己还写了一个eat()的重载方法:eat(String a)

然后创建对象:
Animal a = new Dog();
为什么在创建对象a后,调用eat方法时,不能调用eat(String a)方法,而只能调用eat()方法?

8个回答

san0760
san0760   2016.04.18 10:40
已采纳

我是初学者,我说说自己的理解哈。一个是eat(),一个是eat(String a)。参数类型不一样,也就是没有覆盖。那么,animal a = new dog();已经向上转型了,dog已经是animal,所以运行的也应该是animal里面的方法,而不是dog里面的方法。但是如果另一种情况dog里面的方法也是eat()的话,那就方法覆盖了,这个时候就会运行dog里面的eat了。我说的好像不是很清楚。。。。。。

qq_19471875
qq_19471875 让我能理解的一个答案
一年多之前 回复
qq423399099
qq423399099   Ds   Rxr 2016.04.18 10:29

它表示我定义了一个Animal类型的引用,指向新建的Dog类型的对象。由于Dog是继承自它的父类Animal,所以Animal类型的引用是可以指向Dog类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,

定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;

同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;

qq_19471875
qq_19471875 我来好好理解一下
一年多之前 回复
u011471173
u011471173   2016.04.18 11:34

你可以这样理解,是将dog类型强转为animal,所以animal中有的都可以用,没有的不能用。其实是java在调用方法的时候执行了后期绑定。

CSDNXIAON
CSDNXIAON   2016.04.18 10:22

JAVA 重载问题
Java中子类父类变量访问问题
Java中子类和父类构造方法的问题
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

jek123456
jek123456   2016.04.18 10:22

a对象类型是 Animal的

qq_19471875
qq_19471875 为什么不是Dog呢
一年多之前 回复
tcytcy123
tcytcy123   2016.04.18 10:24

这个创建对象的方法叫做父类引用子类对象,也叫向上转型,在相同方法名的情况下,调用的是父类的方法。

tcytcy123
tcytcy123 回复qq_19471875:animal是对象,new Dog是创建在堆内存中的对象,取出来用的时候是栈内存中的引用,所以事实上你调用的是父类的方法,你非要调用的话 可以通过构造函数来实现
一年多之前 回复
qq_19471875
qq_19471875 那我一定要调用重载的方法呢?有什么办法吗?
一年多之前 回复
badplayerz
badplayerz   2016.04.18 10:41

Dog d = new Animal();

qinjisheng_11
qinjisheng_11   2016.04.18 11:30

这个最好的方式就是画内存布局,字看起来抽象无比

qinjisheng_11
qinjisheng_11 a是一个动物,它是看不见dog的方法的
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!