進一步瞭解this和super

知乎上看到一問題很好,拿了與你們分享,原地址:https://www.zhihu.com/question/31548104函數

問:this

JAVA 中this 和super與覆寫衝突的問題?

實例一:

輸出爲
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();
    }
}
相關文章
相關標籤/搜索