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

© 姚伟涛 中级黑马   /  2012-4-17 10:14  /  1692 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Person{                //定义父类
  2.         private void print(){
  3.                 System.out.println("Person");
  4.         }
  5.         public void fun(){
  6.                 this.print();                //调用父类中的print方法
  7.         }
  8. }

  9. class Student extends Person{                //定义子类
  10.         void print(){
  11.                 System.out.println("Student");
  12.         }
  13. }

  14. class OverrideDemo04{
  15.         public static void main(String args[]){
  16.                 Student s = new Student();
  17.                 s.fun();
  18.                 s.print();
  19.         }
  20. }
复制代码
以上代码,执行的结果如下:
Person
Student

可见Student类中的print方法成功覆写,然后调用继承自Person类的fun方法时,能成功访问到Person类中的private方法。

想请问:
Student类的实例对象s,为何能通过fun方法访问到父类中的private方法?

当s调用fun方法的时候,fun方法的定义里面的this关键字不是应该等同于s么?

评分

参与人数 1技术分 +1 收起 理由
蒙武辉 + 1

查看全部评分

4 个回复

倒序浏览
1.Student类中的print方法成功覆写是不对的,父类的私有方法是不能被继承的。所以不存在覆写成功一说。s.print();调用的只是子类的方法和父类无关,如果把子类的print();方法注释掉你会发现出错了。
2.Student类只继承了父类的fun()方法。当通过子类的引用调用fun()方法是,因为会运行里面的this.priint();这时其实是父类在调用自己的print()方法。是子类间接调用的,直接调用是不会实现的。

评分

参与人数 1技术分 +1 收起 理由
蒙武辉 + 1

查看全部评分

回复 使用道具 举报
继承的主要作用就是代码复用,当你继承一个类的时候你就继承了父类的所以方法(代码),
每个方法对应一块代码,在定义的时候就已经固定了,子类覆盖了pint方法,子类代码里pint对应的那块代码就被替换,但没覆盖fun方法,所以fun方法对应的字节码没变,你调用fun方法的时候运行的还是父类里的那块fun的字节码。

评分

参与人数 1技术分 +1 收起 理由
蒙武辉 + 1

查看全部评分

回复 使用道具 举报
fun是父类的公有函数,所以子类能继承。另一方面,类的内部是透明的,即类的内部函数或属性之间没有权限的限制,可以相互访问,所以fun可以访问到私有的print方法,
如果类里面还定义了其他的私有的属性,fun同样可以访问。

评分

参与人数 1技术分 +1 收起 理由
蒙武辉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马