A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 403383221 中级黑马   /  2012-11-15 21:57  /  1956 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果子类重写了父类的方法,那么在主函数中生成一个父类的对象,用这个对象调用被重写的那个方法,执行的是子类的方法还是父类的,为什么?

点评

你的问题说的不是很清楚  发表于 2012-11-15 22:46

7 个回复

倒序浏览
多态中成员函数特点:Fu f = newZi();
编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,没有则编译失败。简单总结就是编译看左,运行看右(是否重写父类的方法)。
成员变量的 特点:无论编译和运行,都参考左边(引用型变量所属的类),
静态成员函数的特点:无论编译和运行,都参考左边。
多说几句:
编译时期吧 就看它 你调用的方法在不在那个类中;而在运行时期,其实是虚拟机的“动态绑定”在起作用,即在多态的情况下,虚拟机可以找到所运行对象的真正类型。注意:动态绑定针对的只是对象的方法。属性还是父类的。
在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以“找到”子类,而对象的属性 还是父类的属性。
而静态成员函数也是静态绑定的。


回复 使用道具 举报
执行子类中的方法,其实这就是多态的表现了。你所说的情况就是:父类引用指向子类对象,这个引用调用的是子类的方法,而不是父类A的方法;并且这个引用只能调用子类中继承或者重写了父类的方法,而不能调用子类新定义的方法。
毕老师曾经举例子说假如毕老师的方法有教书,看电影,毕老师的父亲只能教书,那么假如毕老师的父亲假装成毕老师,那他父亲也只能教书,而不会看电影。
不知道我说的您明白不?
回复 使用道具 举报
父类的对象调用的是父类方法
如果是父类引用的话比如:Fu f = new Zi();
编译看左边,运行看右边
回复 使用道具 举报
执行的是子类的方法。这时候。也就会出现多态里的动态绑定一说。因为你是父类引用指向子类对象,所以,当你重写父类的方法时,引用指向的就是这个重写的方法。在这里有一点要注意,那就是,父类引用指向子类对象的时候,受到引用类型的限制,所以,你不能调用不是重写父类的子类方法。也就是子类独有的方法。在这里关键是理解父类引用指向子类对象这句话。建议楼主可以去找下内存图看下。有利于理解这句话。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
涉及到多态时,参考楼上。我这里仅仅是演示下继承:
  1. class Father
  2. {
  3.         public void show()
  4.         {
  5.                 System.out.println("在父类中");
  6.         }
  7. }
  8. class Child extends Father
  9. {
  10.         public void show () //重写父类方法
  11.         {
  12.                 System.out.println("在子类中");
  13.         }
  14. }

  15. class ExtendsTest
  16. {
  17.         public static void main(String[] args)
  18.         {
  19.                 Father f=new Father();
  20.                 f.show();
  21.                 Child c=new Child();
  22.                 c.show();
  23.         }
  24. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
你描述的问题确实有点不严谨哦,你这样问的话,应该是多态的问题了,用父类的引用去调用子类的方法嘛。
不管是继承还是多态这种情况都是执行子类的方法, 你都知道方法被重写了,怎么就不明白子类继承父类的问题呢,子类继承父类后,沿袭了父类的所有功能,
只有一种父类的方法被静态修饰后,才不会去执行子类中覆写的功能,而是去执行父类自己的功能。
再者就是当子类中存在自己特有的方法时,用父类引用指向子类对象的话,那么编译都失败的。
回复 使用道具 举报
给你一句总结的话:在继承中,一:父类的引用指向子类的对象;二:在调用方法时,受限于父类,如果父类中存在就调用父类的方法(这个方法是没有被覆盖的),如果没有那就会在子类中寻找(被覆盖了就在子类中寻找)。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马