- A:this和super都表明什麼
- this:表明當前對象的引用,誰來調用我,我就表明誰
- super:表明當前對象父類的引用
- B:this和super的使用區別
- a:調用成員變量
- this.成員變量 調用本類的成員變量,也能夠調用父類的成員變量
- super.成員變量 調用父類的成員變量
- b:調用構造方法
- this(...) 調用本類的構造方法
- super(...) 調用父類的構造方法
- c:調用成員方法
- this.成員方法 調用本類的成員方法,也能夠調用父類的方法
- super.成員方法 調用父類的成員方法
class Father {
int num1 = 10;
int num2 = 30;
}
class Son extends Father {
int num2 = 20;
public void print() {
System.out.println(this.num1); //this既能夠調用本類的,也能夠調用父類的(本類沒有的狀況下)
System.out.println(this.num2); //就近原則,子類有就不用父類的了
System.out.println(super.num2);
}
}
class Test2_Extends {
public static void main(String[] args) {
Zi z = new Zi();
}
/*
1,jvm調用了main方法,main進棧
2,遇到Zi z = new Zi();會先將Fu.class和Zi.class分別加載進內存,再建立對象,當Fu.class加載進內存
父類的靜態代碼塊會隨着Fu.class一塊兒加載,當Zi.class加載進內存,子類的靜態代碼塊會隨着Zi.class一塊兒加載
第一個輸出,靜態代碼塊Fu,第二個輸出靜態代碼塊Zi
3,走Zi類的構造方法,由於java中是分層初始化的,先初始化父類,再初始化子類,因此先走的父類構造,可是在執行
父類構造時,發現父類有構造代碼塊,構造代碼塊是優先於構造方法執行的因此
第三個輸出構造代碼塊Fu,第四個輸出構造方法Fu
4,Fu類初始化結束,子類初始化,第五個輸出的是構造代碼塊Zi,構造方法Zi
*/
}
class Fu {
static {
System.out.println("靜態代碼塊Fu");
}
{
System.out.println("構造代碼塊Fu");
}
public Fu() {
System.out.println("構造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("靜態代碼塊Zi");
}
{
System.out.println("構造代碼塊Zi");
}
public Zi() {
System.out.println("構造方法Zi");
}
}