进一步了解this和super

知乎上看到一问题很好,拿了与大家分享,原地址: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();
    }
}
posted on 2017-02-22 11:00  代码ok  阅读(178)  评论(0编辑  收藏  举报