知乎上看到一問題很好,拿了與你們分享,原地址: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(); } }