JAVA語言基礎-面向對象(this和super)

  • 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");
	}
}
相關文章
相關標籤/搜索