知乎上看到一问题很好,拿了与大家分享,原地址:https://www.zhihu.com/question/31548104。
问:
JAVA 中this 和super与覆写冲突的问题?
实例一:
输出为
child
Grandfather
child
father
从示例1可以知道
this总是指向调用该方法的对象,而super总是用于调用处方法所处的类的直接父类
实例二:
而实例二中
输出为
Child
Father
仅仅是将父类print改为private让子类无法覆写,为何子类对象使用this就能调用到父类的print函数?
还是说示例一的推论有误?
问题一出下面一片评论各种答案,我比较赞同http://zhihu.com/question/31548104/answer/83225999这位答主的说法,他提到了编译期绑定和动态绑定的观念。
另外建议阅读http://zhihu.com/question/31548104/answer/52766366的答案,根据编译后的字节码进行解答,讲的比较底层。
下面是我根据他们的回答做的一些总结:
有A类和B类,B类扩展自A:
class A{ //私有的方法不会被继承 private void a1(){ System.out.println("A>a1"); } public void a1(){ System.out.println("A"); /*编译时会检测调用的方法a1是否私有权限,若私有说明此方法不会被继承,也就不存在多态(子类重写此方法)的可能了,那么这里编译时会直接绑定a1为A类的a1,如果方法能被继承则说明有多态的可能,那么编译为动态绑定,当调用时根据this指向的引用实例执行方法。*/ this.a1(); } } /*B能继承到a2但继承不到a1,因为a1是父类私有的*/ class B extends A{ //这里的a1不是重写,而是B里新的一个函数,因为根本没有从A里继承到a1,所以不存在重写的说法 public void a1(){ System.out.println("B>a1"); } //可以去重写a2 public void a2(){ System.out.println("B"); //这里调用的是B的a1 this.a1(); } } public Test1{ public static void main(String[] args){ B b= new B(); b.a1(); b.a2(); } }