1. 程式人生 > >面向物件——this和super

面向物件——this和super

1.this 和super代表什麼

  a. this 代表當前物件的引用

  b. super代表當前父類物件的引用

2.this 和 super 的使用區別

  a. this 可以呼叫本類的成員變數,構造方法,成員方法,也可以呼叫父類的成員變數,構造方法,成員方法(當子類中沒有該部分)

  b. super可以呼叫父類的成員變數,構造方法,成員方法

3.繼承中構造方法的關係和注意事項

  a. 子類中所有的構造方法都會預設訪問父類中的空參構造方法(系統會預設在子類的構造方法首行加入super();(如果沒有寫))

  b. 其實每一個構造方法的第一條語句都是:super();  因為object是最頂層的父類

  c. 當父類中沒有無參建構函式可以有用super(...);解決  也可以用this(...);先呼叫本類中的有參構造再從本類中的有參構造呼叫父類的有參構造

  d. super(...);和this(...);必須出現在構造方法的第一條語句上;

3.程式碼詳解

class Fu{
    public int num = 10;
    public Fu(){
        System.out.println("fu構造方法");
    }
}
class Zi extends Fu{
    public int num = 20;
    public Zi(){
        
//super(); //如果不寫系統預設給出,先呼叫父類建構函式 System.out.println("zi構造方法"); } public void show(){ int num = 30; System.out.println(num); System.out.println(this.num); //呼叫本類成員函式 System.out.println(super.num); //呼叫父類成員函式 } } class Test1_Extends {
public static void main(String[] args) { Zi z = new Zi();     z.show(); } }
/*輸出結果*/
fu構造方法
zi構造方法
30
20
10
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"); } } /*輸出結果*/
靜態程式碼塊Fu
 
 
靜態程式碼塊Zi
 
 
構造程式碼塊Fu
 
 
構造方法Fu
 
 
構造程式碼塊Zi
 
 
構造方法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