知乎上看到一问题很好,拿了与你们分享,原地址:https://www.zhihu.com/question/31548104。函数
问:this
输出为
child
Grandfather
child
father
从示例1能够知道
this老是指向调用该方法的对象,而super老是用于调用处方法所处的类的直接父类spa
而实例二中
输出为
Child
Father
仅仅是将父类print改成private让子类没法覆写,为什么子类对象使用this就能调用到父类的print函数?
仍是说示例一的推论有误?code
问题一出下面一片评论各类答案,我比较赞同http://zhihu.com/question/31548104/answer/83225999这位答主的说法,他提到了编译期绑定和动态绑定的观念。对象
另外建议阅读http://zhihu.com/question/31548104/answer/52766366的答案,根据编译后的字节码进行解答,讲的比较底层。blog
下面是我根据他们的回答作的一些总结:继承
有A类和B类,B类扩展自A:get
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(); } }