1. 閒話不說,拋出問題:
代碼及運行結果如下:
Base.java
package xiaoyu.test;
class Base {
String a = "Base1";
private String showMe() {
return "Base2";
}
public void print() {
System.out.println(this.showMe() + " " + this.a + " " + this + " " + super.toString());
}
}
Sub.java
package xiaoyu.test;
public class Sub extends Base {
String a = "Sub";
public static void main(String[] args) {
Sub sub = new Sub();
sub.print();
}
}
運行結果:
2. 運行結果分析
先明確基礎知識:
- 繼承:首先,Public 類型的 Sub 類繼承了 Base 類,也就擁有了 Base 類的所有變量和方法,但是如果Sub類能直接訪問的必須是 Public 類型的變量和方法,如果Sub類想要訪問 Base 類的私有變量和方法,則必須藉助公有接口(方法)。
- this關鍵字:兩個用途:一是引用隱式參數,二是調用該類其他的構造器。
- super關鍵字:兩個用途:一是調用父類的方法,二是調用父類的構造器。
運行結果分析:
首先,由於 Sub 類沒有重寫父類的print() 方法,所以這裏調用的print()方法是從父類中繼承的,所以這裏實質上執行的是父類的方法。那麼,問題來了:
- 既然是正在執行父類的方法,那麼this關鍵字打印出來的爲何是子類 Sub 的一個實例對象?如果this是子類Sub的一個引用對象的話,this 是沒有權限調用父類的私有方法showMe()的。
- super.toString() 的打印結果爲何是Sub類的一個實例?