问题描述
- Java中子类重载的问题
-
比如我现在又两个具有继承关系的类:
父类:Animal
子类:Dog
在父类中有一个方法eat()
在子类中,除了继承了父类的eat()方法外,我自己还写了一个eat()的重载方法:eat(String a)然后创建对象:
Animal a = new Dog();
为什么在创建对象a后,调用eat方法时,不能调用eat(String a)方法,而只能调用eat()方法?
解决方案
我是初学者,我说说自己的理解哈。一个是eat(),一个是eat(String a)。参数类型不一样,也就是没有覆盖。那么,animal a = new dog();已经向上转型了,dog已经是animal,所以运行的也应该是animal里面的方法,而不是dog里面的方法。但是如果另一种情况dog里面的方法也是eat()的话,那就方法覆盖了,这个时候就会运行dog里面的eat了。我说的好像不是很清楚。。。。。。
解决方案二:
它表示我定义了一个Animal类型的引用,指向新建的Dog类型的对象。由于Dog是继承自它的父类Animal,所以Animal类型的引用是可以指向Dog类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,
定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;
同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
解决方案三:
你可以这样理解,是将dog类型强转为animal,所以animal中有的都可以用,没有的不能用。其实是java在调用方法的时候执行了后期绑定。
解决方案四:
JAVA 重载问题
Java中子类父类变量访问问题
Java中子类和父类构造方法的问题
解决方案五:
a对象类型是 Animal的
解决方案六:
这个创建对象的方法叫做父类引用子类对象,也叫向上转型,在相同方法名的情况下,调用的是父类的方法。
解决方案七:
Dog d = new Animal();
解决方案八:
这个最好的方式就是画内存布局,字看起来抽象无比