this關(guān)鍵字詳解
Java提供了一個this關(guān)鍵字,this關(guān)鍵字總是指向調(diào)用該方法的對象。根據(jù)this出現(xiàn)的位置的不同,this作為對象的默認(rèn)引用有兩種情形。
1)構(gòu)造器中引用該構(gòu)造器正在初始化的對象。
2)在方法中引用調(diào)用該方法的對象。
this關(guān)鍵字最大的作用就是讓類中一個方法,訪問該類里的另一個方法或者實例變量。假設(shè)定義了一個Person類,這個Person對象的eat()方法需要調(diào)用它的move()方法,則如何做呢?是否應(yīng)該定義如下的Person類呢?
public class Person { //定義一個move()方法 public void move(){ System.out.println("正在執(zhí)行move()方法"); } //定義一個eat()方法,eat()方法需要借助move()方法 public void eat(){ Person p = new Person(); p.move(); System.out.println("正在執(zhí)行eat()方法"); } public static void main(String[] args) { //創(chuàng)建Person對象 Person p = new Person(); //調(diào)用Person的eat()方法 p.eat(); } }
運行結(jié)果為:
正在執(zhí)行move()方法
正在執(zhí)行eat()方法
以上這種方式確實能夠做到在eat()方法里調(diào)用move()方法,但從main()方法里的程序中可以看出,一共創(chuàng)建了兩個對象:main()方法里創(chuàng)建一個對象;eat()方法里創(chuàng)建一個對象。可是真的需要創(chuàng)建兩個對象嗎?答案是否定的!因為當(dāng)程序調(diào)用eat()方法時一定會提供一個Person對象,而不需要重新創(chuàng)建一個Person對象了。
因此需要在eat()方法中獲得調(diào)用該方法的對象,通過this關(guān)鍵字就可以滿足這個需求。
this可以代表任何對象,當(dāng)this出現(xiàn)在某個方法體中時,它所代表的對象是不確定的,但它的類型是確定的,它所代表的類型只能是當(dāng)前類:只有當(dāng)這個方法被調(diào)用時,它所代表的對象才被確定下來:誰在調(diào)用這個方法,this就代表誰。
將上面的Person類中的eat()方法改為一下這種方式更合適:
//定義一個eat()方法,eat()方法需要借助move()方法 public void eat(){ //使用this引用調(diào)用eat()方法的對象 this.move(); System.out.println("正在執(zhí)行eat()方法"); }
上述程序中eat()方法需要依賴于move()方法,現(xiàn)實中這種依賴情形非常常見,例如寫字方法需要拿筆的方法,這種依賴都是同一個對象兩個方法之間的依賴。因此,Java允許對象的的一個成員直接調(diào)用另一成員,可以省略this前綴。也就是說,上面的程序可以改為如下形式:
public void eat(){ move(); System.out.println("正在執(zhí)行eat()方法"); }
另外一種情形是:this關(guān)鍵字可用于構(gòu)造器中作為默認(rèn)引用,由于構(gòu)造器是直接使用new關(guān)鍵字來調(diào)用,而不是使用對象來調(diào)用的,所以this在構(gòu)造器中代表該構(gòu)造器正在初始化的對象。例如下面的程序:
public class Person { //定義一個名為age的成員變量 public int age; //構(gòu)造器 public Person() { //在構(gòu)造器里定義一個age變量 int age = 0; //使用this代表該構(gòu)造器正在初始化的對象 //下面的代碼將會把該構(gòu)造器正在初始化的對象的age成員變量設(shè)為3 this.age = 3; } public static void main(String[] args) { //使用new Person()創(chuàng)建的對象的age成員變量都將被設(shè)為3 //下面代碼輸出3 System.out.println(new Person().age); } }
與普通方法類似的是,大部分時候,在構(gòu)造器中訪問其它成員變量和方法時都可以省略this前綴,但如果構(gòu)造器中有一個與成員變量同名的局部變量,又必須在構(gòu)造器中訪問這個被覆蓋的成員變量,則必須使用this前綴。如上面程序所示。
當(dāng)this作為對象的默認(rèn)引用使用時,程序可以像訪問普通引用變量一樣來訪問這個this引用,甚至可以把this當(dāng)成普通方法的返回值。請看下面程序:
public class Person { public int age; public Person grow() { age ++; return this; } public static void main(String[] args) { Person p = new Person(); //可以連續(xù)調(diào)用同一個方法 p.grow().grow().grow(); System.out.println("p對象的age的值是:"+p.age); } }
運行結(jié)果為:
p對象的age的值是:3
從上面的程序可以看出,如果在某個方法中把this作為返回值,則可以多次連續(xù)調(diào)用同一個方法,從而使得代碼更加的簡潔。但這種方式容易造成實際意義的模糊,例如上面的group()方法,用于表示對象的生長,即age變量的值加1,實際上不應(yīng)該有返回值。
最后需要強調(diào)一點:靜態(tài)成員不能直接訪問非靜態(tài)成員,即static修飾的方法不能訪問不適用static修飾的普通方法。對于static修飾的方法而言,可以使用類直接調(diào)用該方法,如果在static修飾的方法中使用this關(guān)鍵字,則這個關(guān)鍵字就無法指向合適的對象。所以,static修飾的方法中不能使用this引用。
以上所述是小編給大家介紹的this關(guān)鍵字詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
設(shè)計模式之構(gòu)建(Builder)模式 建造房子實例分析
構(gòu)建模式主要用來針對復(fù)雜產(chǎn)品生產(chǎn),分離部件構(gòu)建細(xì)節(jié),以達到良好的伸縮性,考慮到設(shè)計模式來源于建筑學(xué),因此舉一個建造房子的例子,需要的朋友可以參考下2012-12-12Springboot之idea之pom文件圖標(biāo)不對問題
這篇文章主要介紹了Springboot之idea之pom文件圖標(biāo)不對問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04Spring解決循環(huán)依賴問題的三種方法小結(jié)
在 Spring 中,循環(huán)依賴問題指的是兩個或多個 bean 之間相互依賴形成的閉環(huán),具體而言,當(dāng) bean A 依賴于 bean B,同時 bean B 也依賴于 bean A,就形成了循環(huán)依賴,本文就給大家介紹了Spring解決循環(huán)依賴問題的三種方法,需要的朋友可以參考下2023-09-09Spring?Security實現(xiàn)添加圖片驗證功能
這篇文章主要為大家介紹了Spring?Security實現(xiàn)添加圖片驗證功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01