This和Super關鍵字

This

this關鍵字必須放在非靜態方法裏面

this關鍵字代表自身,在程序中主要的使用用途有以下幾個方面:

? 使用this關鍵字引用成員變量

? 使用this關鍵字在自身構造方法內部引用其它構造方法

? 使用this關鍵字代表自身類的對象

? 使用this關鍵字引用成員方法

8.8.1.1 引用成員變量

在一個類的方法或構造方法內部,可以使用“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的使用頻率在規範的代碼內部應該很多。

8.8.1.2 引用構造方法

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

下面是一個簡單的示例:

/**

* 使用this關鍵字引用構造方法

*/

public class ReferenceConstructor {

int a;

public ReferenceConstructor(){

this(0);

}public ReferenceConstructor(int a){

this.a = a;}}

這裏在不帶參數的構造方法內部,使用this調用了另外一個構造方法,其中0是根據需要傳遞的參數的值,當一個類內部的構造方法比較多時,可以只書寫一個構造方法的內部功能代碼,然後其它的構造方法都通過調用該構造方法實現,這樣既保證了所有的構造是統一的,也降低了代碼的重複。

在實際使用時,需要注意的是,在構造方法內部使用this關鍵字調用其它的構造方法時,調用的代碼只能出現在構造方法內部的第一行可執行代碼。這樣,在構造方法內部使用this關鍵字調用構造方法最多會出現一次。

8.8.1.3 代表自身對象

在一個類的內部,也可以使用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都代表自身類型的對象。

8.8.1.4 引用成員方法

在一個類的內部,成員方法之間的互相調用時也可以使用“this.方法名(參數)”來進行引用,只是所有這樣的引用中this都可以省略,所以這裏就不詳細介紹了。

Super

一.super關鍵字作用

 

1:主要存在於子類方法中,用於指向子類對象中父類對象。

 

2:訪問父類的屬性

 

3:訪問父類的函數

 

4:訪問父類的構造函數

二.super注意的地方

 

this和super很像,this指向的是當前對象的調用,super指向的是當前調用對象的父類。類加載完畢,創建對象,父類的構造方法會被調用(默認自動無參),然後執行子類相應構造創建了一個子類對象,該子類對象還包含了一個父類對象。該父類對象在子類對象內部。this super只能在有對象的前提下使用,不能在靜態上下文使用。

 

三.super關鍵字的使用

 

1.子類的構造函數默認第一行會默認調用父類無參的構造函數,隱式語句

 

super();

 

[java] view plain copy

print?

 

   Son(int y) { 

           //super();隱式語句 

           this.y = y + x; 

           System.out.println("這是子類的有參構造"); 

       } 

 

2.子類顯式調用父類構造函數

 

在子類構造函數第一行通過super關鍵字調用父類任何構造函數。如果顯式調用父類構造函數,編譯器自動添加的調用父類無參數的構造就消失。構造函數間的調用只能放在第一行,只能調用一次。super()和this()不能同時存在構造函數第一行。

[java] view plain copy

print?

 

   Son(int y) { 

           super(y);// 子類顯式調用父類構造函數 

           this.y = y + x; 

           System.out.println("這是子類的有參構造"); 

       } 

 

四.super思考

 

如果開發者自定義了一個類,沒有顯示的進行類的繼承,那麼該類中成員函數是否可以使用super關健健字?可以使用,繼承了Object類,Object類是所有類的父類。

[java] view plain copy

print?

 

   class Demo7 { 

       public  void print(){ 

           System.out.println(super.toString()); 

       } 

       public static void main(String[] args){ 

           new Demo7().print(); 

           System.out.println(); 

           } 

   } 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章