java的this關(guān)鍵字怎么用?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了市中免費建站歡迎大家使用!this用在類內(nèi)部,表示類實例本身。
this關(guān)鍵字是類內(nèi)部當中對自己的一個引用,可以方便類中方法訪問自己的屬性。
java中this用法
1、當局部變量和成員變量重名的時候,在方法中使用this表示成員變量以示區(qū)分。
class Demo{ String str = "這是成員變量"; void fun(String str){ System.out.println(str); System.out.println(this.str); this.str = str; System.out.println(this.str); } } public class This{ public static void main(String args[]){ Demo demo = new Demo(); demo.fun("這是局部變量"); } }
分析:上面的類Demo中有一個成員變量str和一個局部變量str(類方法中的形式參數(shù)),很顯然局部變量和成員變量重名,這個時候一般在方法中直接使用str實際上是使用局部變量str,對成員變量str沒有任何影響,此時如果需要對成員變量做點什么,就必須使用this關(guān)鍵字。
有個問題,如果方法中沒有str,那么在方法中使用成員變量str會是什么情況呢?實際上是方法內(nèi)的所有操作都是針對成員變量str的。java編程思想的84頁中部有這樣一句話:如果在方法內(nèi)部調(diào)用同一個類的另一個方法,就不必使用this。同樣,在一個方法中如果沒有局部變量和成員變量同名,那么在這個方法中使用成員變量也不必使用this,可以運行下面的代碼看看。
class Demo{ String str = "這是成員變量"; void fun(String str1){ System.out.println(str1); System.out.println(str); } } public class This{ public static void main(String args[]){ Demo demo = new Demo(); demo.fun("這是局部變量"); } }
2、this關(guān)鍵字把當前對象傳遞給其他方法
這里有個很經(jīng)典的例子,就是java編程思想的85頁的例子。我們拿出來仔細研究。
class Person{ public void eat(Apple apple){ Apple peeled = apple.getPeeled(); System.out.println("Yummy"); } } class Peeler{ static Apple peel(Apple apple){ //....remove peel return apple; } } class Apple{ Apple getPeeled(){ return Peeler.peel(this); } } public class This{ public static void main(String args[]){ new Person().eat(new Apple()); } }
這是我自己的認識,也許不正確,看看書中是怎樣說的:Apple需要調(diào)用Peeler.peel()方法,他是一個外部的工具方法,將執(zhí)行由于某種原因而必須放在Apple外部的操作(也許是因為該外部方法要應用于許多不同的類,而你卻不想重復這些代碼)。為了將其自身傳遞給外部方法,必須使用this關(guān)鍵字。
分析:設(shè)想一個場景,假如各種水果去皮的工作都是一樣的,只要給我水果,我都按同樣的方法去皮。那么結(jié)合上面的例子,傳進來一個水果,我們吃之前getPeeled(),必須將此水果作為參數(shù)傳遞給外部的peel(),用this來代表自身傳遞給外部方法。
3、當需要返回當前對象的引用時,就常常在方法寫return this;
這種做法的好處是:當你使用一個對象調(diào)用該方法,該方法返回的是經(jīng)過修改后的對象,且又能使用該對象做其他的操作。因此很容易對一個對象進行多次操作。
public class This{ int i = 0; This increment(){ i += 2; return this; } void print(){ System.out.println("i = " + i); } public static void main(String args[]){ This x = new This(); x.increment().increment().print(); } }
結(jié)果為:
4
4、在構(gòu)造器中調(diào)用構(gòu)造器需要使用this
一個類有許多構(gòu)造函數(shù),有時候想在一個構(gòu)造函數(shù)中調(diào)用其他構(gòu)造函數(shù),以避免代碼重復,可以使用this關(guān)鍵字。在java編程思想中有這樣一段話:通常寫this的時候,都是指“這個對象”或者“當前對象”,而且它本身表示對當前對象的引用。在構(gòu)造器中,如果為this添加了參數(shù)列表,那么就有不同的含義。這將產(chǎn)生對符合此參數(shù)列表的某個構(gòu)造器的明確調(diào)用;這樣調(diào)用其他構(gòu)造函數(shù)就有了直接的途徑。
仔細分析:
從主函數(shù)開始,new Flower()會在內(nèi)存分配空間,初始化對象,初始化對象是調(diào)用構(gòu)造函數(shù),這里沒有寫任何參數(shù),當然是調(diào)用默認構(gòu)造函數(shù),就是那個無參的構(gòu)函數(shù)。
這個無參的構(gòu)造函數(shù)的第一行代碼就是this("hi",122);這里的意思是該無參構(gòu)造函數(shù)又去調(diào)用帶兩個參數(shù)的構(gòu)造函數(shù),來到帶兩個參數(shù)的構(gòu)造函數(shù),第一行代碼是this(s);這行代碼自動匹配帶一個參數(shù)的構(gòu)造函數(shù),發(fā)現(xiàn)Flower(String ss)這個比較匹配,都是String類型的參數(shù)。
然后調(diào)用了帶有一個String類型參數(shù)的構(gòu)造函數(shù),打?。?code>只有String類型的參數(shù)的構(gòu)造函數(shù) s = hi;然后回到上一級調(diào)用函數(shù),就是帶有兩個參數(shù)的構(gòu)造函數(shù),打印輸出:有String和int類型的參數(shù)的構(gòu)造函數(shù)
;再回到上一級,就是無參構(gòu)造函數(shù),打印:默認構(gòu)造函數(shù)
。
此時構(gòu)造函數(shù)已經(jīng)初始化完成新建的對象,最后在主函數(shù)的最后一行代碼中打?。?code>petalCount=122 s=hi。
畫個圖看得更明白。
有幾點要注意:
1,this只可以調(diào)用一個構(gòu)造器,在一個構(gòu)造器中不能同時調(diào)用兩個構(gòu)造器;
2,必須將你所調(diào)用的構(gòu)造器放在最開始的位置,這也解釋了為什么不能在一個構(gòu)造函數(shù)中調(diào)用兩個構(gòu)造器,那第二個勢必不在最開始位置。
3,本例中在帶有兩個參數(shù)的構(gòu)造函數(shù)中可以用this調(diào)用其他任意一個只有一個參數(shù)的構(gòu)造函數(shù),這取決你自己,隨便調(diào)哪一個都可以。
4,在構(gòu)造函數(shù)之外的方法內(nèi)不能使用this調(diào)用構(gòu)造函數(shù)。代碼里面注釋的都不能正確編譯。
this總結(jié)
1、表示對當前對象的引用!
2、表示用類的成員變量,而非函數(shù)參數(shù)。
3、用于在構(gòu)造方法中引用滿足指定參數(shù)類型的構(gòu)造器(其實也就是構(gòu)造方法)。但是這里必須非常注意:只能引用一個構(gòu)造方法且必須位于開始!
4、很明顯this不能用在static方法中,因為this指代當前對象,而static則無對象之說。
關(guān)于java的this關(guān)鍵字怎么用問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。