黑马程序员技术交流社区
标题:
关于继承的
[打印本页]
作者:
403383221
时间:
2012-11-15 21:57
标题:
关于继承的
如果子类重写了父类的方法,那么在主函数中生成一个父类的对象,用这个对象调用被重写的那个方法,执行的是子类的方法还是父类的,为什么?
作者:
王玮
时间:
2012-11-15 22:02
多态中成员函数特点:Fu f = newZi();
编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,没有则编译失败。简单总结就是编译看左,运行看右(是否重写父类的方法)。
成员变量的 特点:无论编译和运行,都参考左边(引用型变量所属的类),
静态成员函数的特点:无论编译和运行,都参考左边。
多说几句:
编译时期吧 就看它 你调用的方法在不在那个类中;而在运行时期,其实是虚拟机的“动态绑定”在起作用,即在多态的情况下,虚拟机可以找到所运行对象的真正类型。注意:动态绑定针对的只是对象的方法。属性还是父类的。
在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以“找到”子类,而对象的属性 还是父类的属性。
而静态成员函数也是静态绑定的。
作者:
陈莹
时间:
2012-11-15 22:04
执行子类中的方法,其实这就是多态的表现了。你所说的情况就是:父类引用指向子类对象,这个引用调用的是子类的方法,而不是父类A的方法;并且这个引用只能调用子类中继承或者重写了父类的方法,而不能调用子类新定义的方法。
毕老师曾经举例子说假如毕老师的方法有教书,看电影,毕老师的父亲只能教书,那么假如毕老师的父亲假装成毕老师,那他父亲也只能教书,而不会看电影。
不知道我说的您明白不?
作者:
种生祥
时间:
2012-11-15 22:06
父类的对象调用的是父类方法
如果是父类引用的话比如:Fu f = new Zi();
编译看左边,运行看右边
作者:
张综
时间:
2012-11-15 22:11
执行的是子类的方法。这时候。也就会出现多态里的动态绑定一说。因为你是父类引用指向子类对象,所以,当你重写父类的方法时,引用指向的就是这个重写的方法。在这里有一点要注意,那就是,父类引用指向子类对象的时候,受到引用类型的限制,所以,你不能调用不是重写父类的子类方法。也就是子类独有的方法。在这里关键是理解父类引用指向子类对象这句话。建议楼主可以去找下内存图看下。有利于理解这句话。
作者:
崔维友
时间:
2012-11-15 22:14
涉及到多态时,参考楼上。我这里仅仅是演示下继承:
class Father
{
public void show()
{
System.out.println("在父类中");
}
}
class Child extends Father
{
public void show () //重写父类方法
{
System.out.println("在子类中");
}
}
class ExtendsTest
{
public static void main(String[] args)
{
Father f=new Father();
f.show();
Child c=new Child();
c.show();
}
}
复制代码
java.PNG
(2.43 KB, 下载次数: 36)
下载附件
2012-11-15 22:14 上传
作者:
李涛兴
时间:
2012-11-15 22:56
你描述的问题确实有点不严谨哦,你这样问的话,应该是多态的问题了,用父类的引用去调用子类的方法嘛。
不管是继承还是多态这种情况都是执行子类的方法, 你都知道方法被重写了,怎么就不明白子类继承父类的问题呢,子类继承父类后,沿袭了父类的所有功能,
只有一种父类的方法被静态修饰后,才不会去执行子类中覆写的功能,而是去执行父类自己的功能。
再者就是当子类中存在自己特有的方法时,用父类引用指向子类对象的话,那么编译都失败的。
作者:
程宏志
时间:
2012-11-15 23:21
给你一句总结的话:在继承中,一:父类的引用指向子类的对象;二:在调用方法时,受限于父类,如果父类中存在就调用父类的方法(这个方法是没有被覆盖的),如果没有那就会在子类中寻找(被覆盖了就在子类中寻找)。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2