教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Java中this關鍵字的常見用法有哪些?

更新時間:2021年04月29日14時48分 來源:傳智教育 瀏覽次數(shù):

傳智教育-一樣的教育,不一樣的品質

在上一節(jié)案例中使用變量表示年齡時,構造方法中使用的參數(shù)是a,成員變量使用的是age,雖然在語法上沒有任何問題,但這樣的程序可讀性很差。這時可以將Person類中表示年齡的變量進行統(tǒng)一命名,例如都聲明為age,但是這樣做又會導致成員變量和局部變量的名稱沖突,在方法中將無法訪問成員變量age。

為了解決這個問題,Java中提供了一個關鍵字this來指代當前對象,用于在方法中訪問對象的其他成員。接下來將為讀者詳細地講解this關鍵字在程序中的三種常見用法,具體如下:


1.通過this關鍵字調用成員變量,解決與局部變量名稱沖突問題。具體示例代碼如下:

class Person {
    int age;                     // 成員變量age
    public Person(int age) {      // 局部變量age
        this.age = age;         // 將局部變量age的值賦給成員變量age
    }
}

在上面的代碼中,構造方法的參數(shù)被定義為age,它是一個局部變量,在類中還定義了一個成員變量,名稱也是age。在構造方法中如果使用“age”,則是訪問局部變量,但如果使用“this.age”則是訪問成員變量。


2.通過this關鍵字調用成員方法,具體示例代碼如下:

class Person {
    public void openMouth() {
        ...
    }
    public void speak() {
        this.openMouth();
    }
}

在上面的speak()方法中,使用this關鍵字調用了openMouth()方法。需要注意的是,此處的this關鍵字可以省略不寫,也就是說上面的代碼中,寫成“this.openMouth()”和“openMouth()”效果是完全一樣的。


3.通過this關鍵字調用構造方法。構造方法是在實例化對象時被Java虛擬機自動調用的,在程序中不能像調用其他方法一樣去調用構造方法,但可以在一個構造方法中使用“this([參數(shù)1,參數(shù)2…])”的形式來調用其他的構造方法。

接下來通過一個案例來演示這種形式構造方法的調用,如文件1所示。

文件1 Example11.java

     class Person {
         public Person() {
             System.out.println("無參的構造方法被調用了...");
         }
         public Person(int age) {
             this();                  // 調用無參的構造方法
             System.out.println("有參的構造方法被調用了...");
         }
     }
     public class Example11 { 
         public static void main(String[] args) {
             Person p = new Person(18); // 實例化 Person 對象
         }
     }

運行結果如圖1所示。

this關鍵字

圖1 運行結果

在文件1中,第12行代碼在實例化Person對象時,調用了有參的構造方法,在有參構造方法中又通過this()調用了無參的構造方法,因此運行結果中顯示兩個構造方法都被調用了。

在使用this調用類的構造方法時,應注意以下幾點:

①只能在構造方法中使用this調用其他的構造方法,不能在成員方法中使用。

②在構造方法中,使用this調用構造方法的語句必須是該方法的第一條執(zhí)行語句,且只能出現(xiàn)一次。下面的寫法是錯誤的:

public Person(int age) {
   System.out.println("有參的構造方法被調用了...");
   this();  // 調用無參的構造方法。
}

在上述代碼中,由于調用語句this()不是構造方法的第一條執(zhí)行語句,所以Eclipse在編譯時會報出“Constructor call must be the first statement in a constructor(調用構造函數(shù)必須是構造函數(shù)中的第一條語句)”的錯誤提示信息。

③不能在一個類的兩個構造方法中使用this互相調用。下面的寫法是錯誤的:

class Person {
  public Person() {
     this(18);    // 調用有參的構造方法
    System.out.println("無參的構造方法被調用了...");
  }
  public Person(int age) {
    this();     // 調用無參的構造方法
    System.out.println("有參的構造方法被調用了...")
  }
}

在上述代碼中,無參構造方法和有參構造方法分別使用了this關鍵字對方法進行了相互調用,此時在編譯時,將會報出“Recursive constructor invocation Person()(遞歸調用構造函數(shù)Person())”的錯誤提示信息。



猜你喜歡:

volatile關鍵字的作用,看完你明白了!

Java中有多少個關鍵字?使用關鍵字應當注意什么

final在Java編程中有什么作用?【Java面試】    

傳智教育高級java工程師培訓

0 分享到:
和我們在線交談!