更新時(shí)間:2021-04-29 來(lái)源:黑馬程序員 瀏覽量:
在上一節(jié)案例中使用變量表示年齡時(shí),構(gòu)造方法中使用的參數(shù)是a,成員變量使用的是age,雖然在語(yǔ)法上沒(méi)有任何問(wèn)題,但這樣的程序可讀性很差。這時(shí)可以將Person類中表示年齡的變量進(jìn)行統(tǒng)一命名,例如都聲明為age,但是這樣做又會(huì)導(dǎo)致成員變量和局部變量的名稱沖突,在方法中將無(wú)法訪問(wèn)成員變量age。
為了解決這個(gè)問(wèn)題,Java中提供了一個(gè)關(guān)鍵字this來(lái)指代當(dāng)前對(duì)象,用于在方法中訪問(wèn)對(duì)象的其他成員。接下來(lái)將為讀者詳細(xì)地講解this關(guān)鍵字在程序中的三種常見(jiàn)用法,具體如下:
1.通過(guò)this關(guān)鍵字調(diào)用成員變量,解決與局部變量名稱沖突問(wèn)題。具體示例代碼如下:
class Person { int age; // 成員變量age public Person(int age) { // 局部變量age this.age = age; // 將局部變量age的值賦給成員變量age } }
在上面的代碼中,構(gòu)造方法的參數(shù)被定義為age,它是一個(gè)局部變量,在類中還定義了一個(gè)成員變量,名稱也是age。在構(gòu)造方法中如果使用“age”,則是訪問(wèn)局部變量,但如果使用“this.age”則是訪問(wèn)成員變量。
2.通過(guò)this關(guān)鍵字調(diào)用成員方法,具體示例代碼如下:
class Person { public void openMouth() { ... } public void speak() { this.openMouth(); } }
在上面的speak()方法中,使用this關(guān)鍵字調(diào)用了openMouth()方法。需要注意的是,此處的this關(guān)鍵字可以省略不寫,也就是說(shuō)上面的代碼中,寫成“this.openMouth()”和“openMouth()”效果是完全一樣的。
3.通過(guò)this關(guān)鍵字調(diào)用構(gòu)造方法。構(gòu)造方法是在實(shí)例化對(duì)象時(shí)被Java虛擬機(jī)自動(dòng)調(diào)用的,在程序中不能像調(diào)用其他方法一樣去調(diào)用構(gòu)造方法,但可以在一個(gè)構(gòu)造方法中使用“this([參數(shù)1,參數(shù)2…])”的形式來(lái)調(diào)用其他的構(gòu)造方法。
接下來(lái)通過(guò)一個(gè)案例來(lái)演示這種形式構(gòu)造方法的調(diào)用,如文件1所示。
文件1 Example11.java
class Person { public Person() { System.out.println("無(wú)參的構(gòu)造方法被調(diào)用了..."); } public Person(int age) { this(); // 調(diào)用無(wú)參的構(gòu)造方法 System.out.println("有參的構(gòu)造方法被調(diào)用了..."); } } public class Example11 { public static void main(String[] args) { Person p = new Person(18); // 實(shí)例化 Person 對(duì)象 } }
運(yùn)行結(jié)果如圖1所示。
圖1 運(yùn)行結(jié)果
在文件1中,第12行代碼在實(shí)例化Person對(duì)象時(shí),調(diào)用了有參的構(gòu)造方法,在有參構(gòu)造方法中又通過(guò)this()調(diào)用了無(wú)參的構(gòu)造方法,因此運(yùn)行結(jié)果中顯示兩個(gè)構(gòu)造方法都被調(diào)用了。
在使用this調(diào)用類的構(gòu)造方法時(shí),應(yīng)注意以下幾點(diǎn):
①只能在構(gòu)造方法中使用this調(diào)用其他的構(gòu)造方法,不能在成員方法中使用。
②在構(gòu)造方法中,使用this調(diào)用構(gòu)造方法的語(yǔ)句必須是該方法的第一條執(zhí)行語(yǔ)句,且只能出現(xiàn)一次。下面的寫法是錯(cuò)誤的:
public Person(int age) { System.out.println("有參的構(gòu)造方法被調(diào)用了..."); this(); // 調(diào)用無(wú)參的構(gòu)造方法。 }
在上述代碼中,由于調(diào)用語(yǔ)句this()不是構(gòu)造方法的第一條執(zhí)行語(yǔ)句,所以Eclipse在編譯時(shí)會(huì)報(bào)出“Constructor call must be the first statement in a constructor(調(diào)用構(gòu)造函數(shù)必須是構(gòu)造函數(shù)中的第一條語(yǔ)句)”的錯(cuò)誤提示信息。
③不能在一個(gè)類的兩個(gè)構(gòu)造方法中使用this互相調(diào)用。下面的寫法是錯(cuò)誤的:
class Person { public Person() { this(18); // 調(diào)用有參的構(gòu)造方法 System.out.println("無(wú)參的構(gòu)造方法被調(diào)用了..."); } public Person(int age) { this(); // 調(diào)用無(wú)參的構(gòu)造方法 System.out.println("有參的構(gòu)造方法被調(diào)用了...") } }
在上述代碼中,無(wú)參構(gòu)造方法和有參構(gòu)造方法分別使用了this關(guān)鍵字對(duì)方法進(jìn)行了相互調(diào)用,此時(shí)在編譯時(shí),將會(huì)報(bào)出“Recursive constructor invocation Person()(遞歸調(diào)用構(gòu)造函數(shù)Person())”的錯(cuò)誤提示信息。
猜你喜歡:
POST請(qǐng)求與GET請(qǐng)求的區(qū)別【java面試題】
黑馬程序員高級(jí)java工程師培訓(xùn)