java關鍵字---this 和super

this 和super
下面再來介紹一下this 和super 關鍵字的使用。在程序中通過使用this 和super 關鍵字,可以實現對於類內部很多內容方便的引用,也有助於理解面向對象的實現原理,更方便的理解面向對象技術的內部實現。
this 關鍵字
this 關鍵字代表自身,在程序中主要的使用用途有以下幾個方面:
★使用this 關鍵字引用成員變量
★使用this 關鍵字在自身構造方法內部引用其它構造方法
★使用this 關鍵字代表自身類的對象
★使用this 關鍵字引用成員方法

引用成員變量
在一個類的方法或構造方法內部,可以使用“this.成員變量名”這樣的格式來引用成員變量名,有些時候可以省略,有些時候不能省略。首先看一下下面的代碼:
/**
* 使用this 引用成員變量
*/
public class ReferenceVariable {
        private int a;
        public ReferenceVariable(int a){
                this.a = a;
        }
        public int getA(){
                return a;
        }
        public void setA(int a){
                this.a = a;
        } 
}
在該代碼的構造方法和setA 方法內部,都是用this.a 引用類的成員變量。因爲無論在構造方法還是setA 方法內部,都包含2 個變量名爲a 的變量,一個是參數a,另外一個是成員變量a。按照Java 語言的變量作用範圍規定,參數a 的作用範圍爲構造方法或方法內部,成員變量a 的作用範圍是類的內部,這樣在構造方法和setA 方法內部就存在了變量a 的衝突,Java 語言規定當變量作用範圍重疊時,作用域小的變量覆蓋作用域大的變量。所以在構造方法和setA方法內部,參數a 起作用。這樣需要訪問成員變量a 則必須使用this 進行引用。當然,如果變量名不發生重疊,則this 可以省略。但是爲了增強代碼的可讀性,一般將參數的名稱和成員變量的名稱保持一致,所以this 的使用頻率在規範的代碼內部應該很多。
引用構造方法

在一個類的構造方法內部,也可以使用this 關鍵字引用其它的構造方法,這樣可以降低代碼的重複,也可以使所有的構造方法保持統一,這樣方便以後的代碼修改和維護,也方便代碼的閱讀。

構造函數間調用this的時候,this(參數)必須作爲第一條語句存在。

下面是一個簡單的示例:
/**
* 使用this 關鍵字引用構造方法
*/
public class ReferenceConstructor {
        int a;
        public ReferenceConstructor(){
                this(0);
        }
        public ReferenceConstructor(int a){
                this.a = a;
        }
}
這裏在不帶參數的構造方法內部,使用this 調用了另外一個構造方法,其中0 是根據需要傳遞的參數的值,當一個類內部的構造方法比較多時,可以只書寫一個構造方法的內部功能代碼,然後其它的構造方法都通過調用該構造方法實現,這樣既保證了所有的構造是統一的,也降低了代碼的重複。
在實際使用時,需要注意的是,在構造方法內部使用this 關鍵字調用其它的構造方法時,調用的代碼只能出現在構造方法內部的第一行可執行代碼。這樣,在構造方法內部使用this 關鍵字調用構造方法最多會出現一次。
代表自身對象
在一個類的內部,也可以使用this 代表自身類的對象,或者換句話說,每個類內部都有一個隱含的成員變量,該成員變量的類型是該類的類型,該成員變量的名稱是this,實際使用this 代表自身類的對象的示例代碼如下:
/**
* 使用this 代表自身類的對象
*/
public class ReferenceObject {
        ReferenceObject instance;
        public ReferenceObject(){
                instance = this;
        }
        public void test(){
                System.out.println(this);
        }
}
在構造方法內部,將對象this 的值賦值給instance,在test 方法內部,輸出對象this 的內容,這裏的this 都代表自身類型的對象。
引用成員方法
在一個類的內部,成員方法之間的互相調用時也可以使用“this.方法名(參數)”來進行引用,只是所有這樣的引用中this 都可以省略,所以這裏就不詳細介紹了。
super 關鍵字
super 關鍵字的中文意思是超級的,使用super 關鍵字可以在子類中引用父類中的內容。主要的使用形式有以下幾種:
在子類的構造方法內部引用父類的構造方法
在子類中調用父類中的成員方法
在子類中調用父類中的成員變量
引用父類構造方法
在構造子類對象時,必須調用父類的構造方法。而爲了方便代碼的編寫,在子類的構造方法內部會自動調用父類中默認的構造方法。但是如果父類中沒有默認的構造方法時,則必須手動進行調用。
使用super 可以在子類的構造方法內部根據需要調用父類中的構造方法。
使用super 關鍵字調用父類構造方法的示例代碼如下:
//文件名:SuperClass.java
public class SuperClass {
        public SuperClass(){}
        public SuperClass(int a){}
}
//文件名:SubClass.java
public class SubClass extends SuperClass {
        public SubClass(){
                super(); //可省略
        }
        public SubClass(int a){

                super(a);  調用父類的構造方法,一定要放在方法的首個語句  

      }

        public SubClass(String s){
                super(); //可省略
        }
}

在該示例代碼中,SubClass 繼承SuperClass 類,在SubClass 類的構造方法內部可以使用super 關鍵字調用父類SubClass 的構造方法,具體調用哪個構造方法沒有限制,可以在子類內部根據需要進行調用,只是根據調用的構造方法不同傳入適當的參數即可。由於SubClass 類的父類SuperClass 內部有默認的構造方法,所以SubClass 的構造方法內部super()的代碼可以省略。和使用this 關鍵字調用構造方法一樣,super 調用構造方法的代碼只能出現在 
子類構造方法中的第一行可執行代碼。這樣super 調用構造方法的代碼在子類的
構造方法內部則最多出現一句,且不能和this 調用構造方法的代碼一起使用。
引用父類成員方法
在子類中繼承了父類中的成員方法,一般可以直接通過方法名使用,但是如果在子類中覆蓋了父類的成員方法以後,如果需要在子類內部調用父類中被覆蓋的成員方法時則不能直接調用了,這樣就又需要使用super 關鍵字了。
示例代碼如下:
//文件名:SuperClass2.java
public class SuperClass2 {
        public void test(){}
        public void print(int a){
                System.out.println("SuperClass2: " + a);
        }
}
//文件名:SubClass2
public class SubClass2 extends SuperClass2 {
        public void print(int a){
                super.print(a);
                System.out.println("SubClass2");
        }
        public void t(){
                super.test(); //super 可省略
                super.print(0); //不可省略
        }
}
引用父類成員變量
在子類中如果引用父類的成員變量,也可以使用“super.成員變量”來引用,只是一般成員變量的覆蓋是沒有意義的,所以這個時候都可以直接使用成員變量名進行引用,所以這裏的super 都可以省略。
注意的問題:在實際使用this 和super 時,除了上面介紹到的需要注意的問題以外,還需要特別注意的是,t
his 和super 都是非靜態的,所以這兩個關鍵字都無法在靜態方法內部進行使用。
發佈了10 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章