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 让我能理解的一个答案
2 年多之前 回复
qq423399099
qq423399099   Ds   Rxr 2016.04.18 10:29

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

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

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

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

qq_19471875
qq_19471875 我来好好理解一下
2 年多之前 回复
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呢
2 年多之前 回复
tcytcy123
tcytcy123   2016.04.18 10:24

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

tcytcy123
tcytcy123 回复qq_19471875:animal是对象,new Dog是创建在堆内存中的对象,取出来用的时候是栈内存中的引用,所以事实上你调用的是父类的方法,你非要调用的话 可以通过构造函数来实现
2 年多之前 回复
qq_19471875
qq_19471875 那我一定要调用重载的方法呢?有什么办法吗?
2 年多之前 回复
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的方法的
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
子类是否可以重载父类的方法?重载可以发生在子类中吗?
一、争议 这是网上经常被提起的两个问题,有的说不可以,理由重载是同一类中,方法名相同,参数列表不同的一组方法的定义。 但是认为可以的理由是子类可以继承父类所有的公有方法(构造器方法除外),然后在子类中定义与继承方法同名不同参数列表的方法,这也叫重载。 二、个人理解 感觉第一个问题本身的问法就存在问题。没有这一说。 重载可以发生在子类中吗?我同意 “重载是同一类中,方法名相同,参数列表不...
在Java中子类能否重载父类的构造方法?
1,首先明确一点子类不能重载父类的构造方法 2,由于在java中类的构造函数与类的名称相同,不可能子类和父类使用相同的类名称,因此子类也就不能重载父类的构造函数,但子类可以通过super来调用父类的构造函数。 3,也就是在子类的构造方法里面使用 super() 的方法来调用父类; package javaClass; /* * 编写一个java程序,设计一个汽车类Vehicle
java 子类重载父类
java 子类重载父类class SuperClass { int i = 0; SuperClass(int i) { this.i = i; } SuperClass() { } } class ChildClass extends SuperClass { int n = 0; ChildClass() { super(200); } ChildClass
Java之调用被子类重载的方法
有一种特殊的重写方法,就是当子类重写父类方法,父类表面上只是调用属于自己的、被子类重写的方法,但随着contex的执行改变,将会变成父类直接调用子类的方法。 public class Animal { private String desc; public Animal() { System.out.println("Animalgouzao"+desc); // TODO Aut
子类、父类之间实现函数重载
大家都知道C++中函数重载只能在同一个类中,因为子类中的函数会遮掩住父类中的同名函数。但是使用using 申明式可以使得父类中的同名函数在子类中可见,从而实现函数重载。实现代码如下所示: #include using namespace std; class Base { public: void fun(int data) { cout } }; class De
Java编程中在子类重载方法中调用父类中该方法时,该方法包含递归时出现的调用错误
package Test; /** * 计算最大公约数和最小公倍数 * @author Yifan * @version 1.0 */ class Divisor { /** * 求最大公约数 * @param a * @param b 所求的两个数字 * @return 返回a和b的最大公约数 */ int f(int a,int b) { int tem
Java继承中方法的覆盖和重载
在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列表。 如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。 参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。 被覆盖的方法在子类中只能通过super调用
Java多态中重载方法参数分别为父类和子类时的疑惑
问题: 代码如下: class A { public String show(D obj){ return ("A and D"); } public String show(A obj){ return ("A and A"); } } class B extends A{
子类与父类之间的方法重载、隐藏、重写与虚方法调用
由于子类对象同时“汇集了”父类和子类的所有公共方法,如果子类中某个方法与父类方法的签名一样(即方法名和方法参数都一样),那当通过子类对象访问此方法时,访问的是子类还是父类所定义的方法? 总的来说,子类方法与父类方法之间的关系可以概括为以下三种。
浅谈java集成中的final方法重写和重载问题
Question 1: 子类是否可以重写父类的final方法,答案是:不可以! 父类Person: 子类SubPerson: Question 2: 子类是否可以重载父类的final方法,答案是可以的! 父类Add  子类 SubAdd: Question 3: 重载方法中 int ,char 如何自动适配重载函数的!