黑马程序员技术交流社区
标题:
求教
[打印本页]
作者:
姚伟涛
时间:
2012-4-17 10:14
标题:
求教
class Person{ //定义父类
private void print(){
System.out.println("Person");
}
public void fun(){
this.print(); //调用父类中的print方法
}
}
class Student extends Person{ //定义子类
void print(){
System.out.println("Student");
}
}
class OverrideDemo04{
public static void main(String args[]){
Student s = new Student();
s.fun();
s.print();
}
}
复制代码
以上代码,执行的结果如下:
Person
Student
可见Student类中的print方法成功覆写,然后调用继承自Person类的fun方法时,能成功访问到Person类中的private方法。
想请问:
Student类的实例对象s,为何能通过fun方法访问到父类中的private方法?
当s调用fun方法的时候,fun方法的定义里面的this关键字不是应该等同于s么?
作者:
韩新凯
时间:
2012-4-17 12:15
1.Student类中的print方法成功覆写是不对的,父类的私有方法是不能被继承的。所以不存在覆写成功一说。s.print();调用的只是子类的方法和父类无关,如果把子类的print();方法注释掉你会发现出错了。
2.Student类只继承了父类的fun()方法。当通过子类的引用调用fun()方法是,因为会运行里面的this.priint();这时其实是父类在调用自己的print()方法。是子类间接调用的,直接调用是不会实现的。
作者:
罗旭维
时间:
2012-4-17 12:25
继承的主要作用就是代码复用,当你继承一个类的时候你就继承了父类的所以方法(代码),
每个方法对应一块代码,在定义的时候就已经固定了,子类覆盖了pint方法,子类代码里pint对应的那块代码就被替换,但没覆盖fun方法,所以fun方法对应的字节码没变,你调用fun方法的时候运行的还是父类里的那块fun的字节码。
作者:
张文建
时间:
2012-4-17 12:50
fun是父类的公有函数,所以子类能继承。另一方面,类的内部是透明的,即类的内部函数或属性之间没有权限的限制,可以相互访问,所以fun可以访问到私有的print方法,
如果类里面还定义了其他的私有的属性,fun同样可以访问。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2