您好,登錄后才能下訂單哦!
如何正確的在Java中使用this關鍵字?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
Java this 關鍵字的使用方法詳解
構造方法中的this關鍵字
構造方法是一個類的對象在通過new關鍵字創建時自動調用的,在程序中不能向調用其他方法一樣通過方法名(也就是類名)來調用。但如果一個類有多個構造方法,可以在一個構造方法中通過this(paras…)來調用其他的構造方法。
使用this來調用其他構造方法有如下幾個約束。
1) 只能在構造方法中通過this來調用其他構造方法,普通方法中不能使用。
2) 不能通過this遞歸調用構造方法,即不能在一個構造方法中通過this直接或間接調用該構造方法本身。
例如:
class test { test() { this(1); } test(int a){ this(); } test(int a, int b) { this(1, 2); } }
test()方法中調用了test(int)構造方法,而test(int)構造方法又調用了test()構造方法,構成遞歸調用。test(int, int)中調用了自身,也構成了遞歸調用。都是不允許的。
3) 通過this調用其他構造方法必須放在構造方法的第一行中執行。由于super調用父類的構造函數也必須放在構造方法的第一行中執行,因此,通過this和super調用構造方法不能同時出現一個構造方法中。也不能在一個構造方法中多次調用不同的構造方法。
在構造方法中也可以使用this關鍵字來訪問本類中的成員變量和成員函數。其用法和非構造方法中的this關鍵字相同。
非構造方法中的this關鍵字
在Java中可以通過通過this關鍵字來調用類中的成員變量和方法。其用法是。
1) this.xxx; 訪問類中的成員變量xxx
2) this.yyy(paras…); 訪問類中的成員方法yyy
3) this; 當前類對象的引用
this關鍵字訪問類的成員變量和成員函數時不受訪問權限的控制,可以訪問本類中所有的成員變量和方法,包括private的成員變量和方法。也可以通過this訪問本類的static成員,不過由于static成員可以通過類名直接訪問,如果通過this來訪問會有“The static field ××× should be accessed in a static way”的警告信息。不能在類的static成員或static塊中使用this。
繼承關系下的this關鍵字
在繼承關系下,父類中的this關鍵字并不總是表示父類中的變量和方法。this關鍵字的四種用法如前文所述,列舉如下。
1) this(paras…); 訪問其他的構造方法
2) this.xxx; 訪問類中的成員變量xxx
3) this.yyy(paras…); 訪問類中的成員方法yyy
4) this; 當前類對象的引用
對第一種,無論子類是否有相同參數的構造方法,this(paras…);訪問的始終是父類中的構造方法。
對第二種,無論子類是否有覆蓋了該成員變量,this.xxx;訪問的始終是父類中的成員變量。
對第三種,如果子類重寫了該成員方法,則this.yyy(paras…);訪問的是子類的成員方法,如果子類沒有重寫該成員方法,則this.yyy(paras…);訪問的是父類的成員方法。
對第四種,this始終代表的是子類的對象。
例如:
public class ClassTest { public static void main(String[] args) { Child child = new Child(); child.show(); } } class Parent { public String str; Parent(){ this(1); } Parent(int a) { this.str = "Parent"; this.show(); } public void show() { System.out.println(this.str); } } class Child extends Parent { public String str; Child() { } Child(int a) { str = "Child"; } public void show() { System.out.println(str); super.show(); } }
main()函數中有兩條語句,new Child()和child.show()。
第一條語句new Child()時要執行Child類的構造方法,但是Child類是Parent類的子類,因此會先執行Parent類的構造方法。Child類的無參構造函數中沒有使用super和this來調用父類或本類中的其他的構造方法,因此會調用父類的無參構造函數。在父類的無參構造函數Parent()中調用了執行了this(1),此調用表示執行父類中有一個整數參數的構造方法,雖然子類中也有一個有一個整數參數的構造方法,但是并不會被執行。父類中有一個整數參數的構造方法執行this.str=”Parent”,這里的this.str代表的是父類中的成員變量str,雖然子類中也有一個成員變量str,但是并不會被賦值。將父類中的成員變量str賦值為”Parent”后,接著執行了this.show(),雖然父類中有一個show()方法,但由于子類重寫了show()方法,所以this.show()執行的子類的show()方法。子類的show()方法首先執行了打印str的操作,此時打印的顯然是子類中的str,子類的str沒有被賦值,因為打印null。接著子類的show()方法執行了super.show(),即調用了父類的show()方法,在父類的show()方法中執行了打印this.str的操作,this.str同樣代表父類中的成員變量str,因此打印”Parent”。
第二條語句child.show()先是執行子類的show()方法,子類的show()先是打印了子類的str值(null),然后執行了父類的show()打印了父類的str值(”Parent”)。
兩條語句的打印結果為null, Parent, null, Parent。
如果將第一條語句改為new Child(1),則執行的是子類的有一個整數參數的構造方法,仍然是先執行父類的無參構造方法,初始化父類的str為”Parent”,然后執行子類的show(),子類的show()打印子類的str值(null),然后執行父類的show(),父類show()打印父類的str值(”Parent”),然后執行子類的構造方法將子類的str初始化為”Child”。 第二條語句child.show()先是執行子類的show()方法,子類的show()先是打印了子類的str值(”Child”),然后執行了父類的show()打印了父類的str值(”Parent”)。
兩條語句的打印結果為null, Parent, Child, Parent。
super和this的異同
super在一個類中用來引用其父類的成員,它是在子類中訪問父類成員的一個橋梁,并不是任何一個對象的引用,而this則表示當前類對象的引用。在代碼中Object o = super;是錯誤的,Object o = this;則是允許的。
super關鍵字的作用在于當子類中覆蓋了父類的某個成員變量,或者重寫了父類的某個成員方法時還能夠訪問到父類的成員變量和成員方法。如果子類中沒有重寫父類的成員變量和成員方法,則子類會繼承父類的所有非private的成員變量和成員方法。這時在子類中無論通過this來訪問成員和通過super來訪問成員,結果都是一樣的。
super.getClass()和this.getClass()
getClass()是Object類定義的一個final方法,所有Java類的getClass()都繼承自Object類。如前文所述,如果子類沒有重寫父類的某個成員方法,那么通過super來訪問還是還是通過this來訪問結果都是一樣的。因此,super.getClass()和this.getClass()結果是一樣的。Object類的getClass()方法返回的是該對象的運行時類,一個對象的運行時類是該對象通過new創建時指定的類。因此,super.getClass()和this.getClass()返回的都是new對象時指定的類。
例如:
public class ClassConstructorTest { public static void main(String[] args) { Child child = new Child(); child.show(); } } class Parent { private Parent mSelf; Parent(){ mSelf = this; } public void show() { System.out.println(this.getClass().getName()); System.out.println(super.getClass().getName()); System.out.println(mSelf.getClass().getName()); } } class Child extends Parent { public void show() { System.out.println(this.getClass().getName()); System.out.println(super.getClass().getName()); super.show(); } }
打印的類名都是Child。
看完上述內容,你們掌握如何正確的在Java中使用this關鍵字的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。