为了账号安全,请及时绑定邮箱和手机立即绑定

关于方法覆写的问题,大神请进

关于方法覆写的问题,大神请进

qq_慕尼黑7072541 2017-02-10 00:09:21
class Person{ private void print(){ System.out.println("Person -> void print()") ; } public void fun(){ this.print() ; } } class Student extends Person{ void print(){ System.out.println("Student -> public void print()") ; } } public class OverrideDemo02{ public static void main(String args[]){ new Student().fun() ; } } 运行结果为: Person -> void print() 请教下为什么。
查看完整描述

2 回答

已采纳
?
朕日理万机

TA贡献27条经验 获得超28个赞

你这不是重写,因为重写不能改写private方法。父类的private print方法在子类中是看不到的,但它却存在于子类的数据空间中。子类Student又重新定义了一个自己的print方法而已。

你把父类的print方法前的private去掉,就变成真正的重写了,结果也会变成Student -> public void print()

查看完整回答
反对 回复 2017-02-10
  • qq_慕尼黑7072541
    qq_慕尼黑7072541
    我想问的是为什么会输出父类的方法结果。
  • 朕日理万机
    朕日理万机
    因为没有重写父类的print,所以执行的就是原来父类的方法。fun()方法会去找父类里面那个叫print的方法,这个方法在哪里是确定的,但是该怎么执行,取决于调用它的子类是怎么重写的,如果重写了,就按子类方法来。现在的情况是,父类的print是私有的,子类看不到,所以无法重写。但虽然看不到,但这个来自于父类的print却是存在的,就像被藏起来了。这块被藏起来的东西可以通过fun来访问到。 所以你现在的子类,有一个自己的print方法,有一个继承自父类的fun方法,和一个被藏起来的父类print方法。fun是父类定义的所以一定会去调用那个父类方法。 如果你把父类的print方法改成public,那么子类就成功重写了父类方法,这样一来子类里就只有一个print方法,调用fun方法,仍然找到父类的print,但是这个print被重写了,行为被改变了,就按子类定义的行为来。 还有另一个办法输出子类方法的结果,就是你改写fun方法,仍然是调用this.print(); 这样看起来虽然好像没有改一样,但是这个时候子类调用fun的时候,就知道自己该去找子类的这个fun方法,而不是父类的。
  • qq_慕尼黑7072541
    qq_慕尼黑7072541
    谢谢,大神,懂了。
点击展开后面1
?
ziom

TA贡献948条经验 获得超1109个赞

楼上说的对

查看完整回答
1 反对 回复 2017-02-10
  • 2 回答
  • 0 关注
  • 1401 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信