深入理解java中this關(guān)鍵字的使用
一,表示類中屬性
1,沒(méi)有使用this的情況
class Person{ // 定義Person類 private String name ; // 姓名 private int age ; // 年齡 public Person(String name,int age){ // 通過(guò)構(gòu)造方法賦值 name = name ; age = age ; } public String getInfo(){ // 取得信息的方法 return "姓名:" + name + ",年齡:" + age ; } }; public class ThisDemo01{ public static void main(String args[]){ Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實(shí)例化對(duì)象 System.out.println(per1.getInfo()) ; // 取得信息 } };
運(yùn)行結(jié)果:
姓名:null,年齡:0;
可以得出結(jié)論:此時(shí)并沒(méi)有正確將內(nèi)容賦給屬性;
假設(shè)身邊有一只筆,遠(yuǎn)處也有一只筆,肯定會(huì)就近拿身邊的筆。這在構(gòu)造方法中一樣。
所以此時(shí)操作的name,age都是構(gòu)造方法中定義的name,age.跟類中屬性完全不沾邊。
此時(shí),為了明確哪個(gè)是類中的屬性,需要加上this.類中屬性。
class Person{ // 定義Person類 private String name ; // 姓名 private int age ; // 年齡 public Person(String name,int age){ // 通過(guò)構(gòu)造方法賦值 this.name = name ; // 為類中的name屬性賦值 this.age = age ;// 為類中的age屬性賦值 } public String getInfo(){ // 取得信息的方法 return "姓名:" + name + ",年齡:" + age ; } }; public class ThisDemo02{ public static void main(String args[]){ Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實(shí)例化對(duì)象 System.out.println(per1.getInfo()) ; // 取得信息 } };
運(yùn)行結(jié)果:
姓名:張三,年齡:33
二,this調(diào)用構(gòu)造方法
如果在類中有多個(gè)構(gòu)造方法,也可以利用this關(guān)鍵字互相調(diào)用。
假設(shè)一個(gè)類中存在多個(gè)構(gòu)造方法,但無(wú)論多少構(gòu)造方法,都要打造一個(gè)“新對(duì)象實(shí)例化”,此時(shí)就有兩種做法。
按照最原始方法:
class Person{ // 定義Person類 private String name ; // 姓名 private int age ; // 年齡 public Person(){ // 無(wú)參構(gòu)造 System.out.println("新對(duì)象實(shí)例化") ; } public Person(String name){ System.out.println("新對(duì)象實(shí)例化") ; this.name = name ; } public Person(String name,int age){ // 通過(guò)構(gòu)造方法賦值 System.out.println("新對(duì)象實(shí)例化") ; this.name = name ; // 為類中的name屬性賦值 this.age = age ;// 為類中的age屬性賦值 } public String getInfo(){ // 取得信息的方法 return "姓名:" + name + ",年齡:" + age ; } }; public class ThisDemo03{ public static void main(String args[]){ Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實(shí)例化對(duì)象 System.out.println(per1.getInfo()) ; // 取得信息 } };
因?yàn)橐陨霞t色部分重復(fù)了,現(xiàn)在只是一行,感覺(jué)不出來(lái),但是如果現(xiàn)在代碼很多行的話,缺陷立刻顯現(xiàn)出來(lái)了。
此時(shí),最好讓構(gòu)造方法間進(jìn)行互相調(diào)用。
使用:this(若干參數(shù))的形式完成。
package methoud; class Person{ // 定義Person類 private String name ; // 姓名 private int age ; // 年齡 public Person(){ // 無(wú)參構(gòu)造 System.out.println("新對(duì)象實(shí)例化") ; } public Person(String name){ this() ;// 調(diào)用本類中的無(wú)參構(gòu)造方法 this.name = name ; } public Person(String name,int age){ // 通過(guò)構(gòu)造方法賦值 this(name) ;// 調(diào)用有一個(gè)參數(shù)的構(gòu)造方法 this.age = age ;// 為類中的age屬性賦值 } public String getInfo(){ // 取得信息的方法 return "姓名:" + name + ",年齡:" + age ; } }; public class ThisDemo06{ public static void main(String args[]){ Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實(shí)例化對(duì)象 System.out.println(per1.getInfo()) ; // 取得信息 } };
運(yùn)行結(jié)果:
新對(duì)象實(shí)例化
姓名:張三,年齡:33
注意點(diǎn):
在使用this關(guān)鍵字調(diào)用其他關(guān)鍵字的時(shí)候,有以下限制:
1)this()調(diào)用其他構(gòu)造方法的語(yǔ)句只能放在構(gòu)造方法(在其他普通方法里是不行的)的首行;
2)在使用this調(diào)用其他構(gòu)造方法的時(shí)候,至少有一個(gè)構(gòu)造方法是不用this調(diào)用的。(必須要有結(jié)尾,不能無(wú)限期的調(diào)用下去,循環(huán)遞歸調(diào)用);
如下就會(huì)出錯(cuò):
package methoud; class Person{ // 定義Person類 private String name ; // 姓名 private int age ; // 年齡 public Person(){ // 無(wú)參構(gòu)造 System.out.println("新對(duì)象實(shí)例化") ; } public Person(String name){ this.name = name ; this() ;// 調(diào)用this()方法只能放在構(gòu)造方法首行 } public Person(String name,int age){ // 通過(guò)構(gòu)造方法賦值 this(name) ;// 調(diào)用有一個(gè)參數(shù)的構(gòu)造方法 this.age = age ;// 為類中的age屬性賦值 } public String getInfo(){ // 取得信息的方法 this() ;// 其他普通方法不能調(diào)用this()方法 return "姓名:" + name + ",年齡:" + age ; } }; public class ThisDemo04{ public static void main(String args[]){ Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實(shí)例化對(duì)象 System.out.println(per1.getInfo()) ; // 取得信息 } };
三,使用this關(guān)鍵字調(diào)用當(dāng)前對(duì)象。
當(dāng)前對(duì)象:當(dāng)前正在調(diào)用方法的對(duì)象。
如下,分別用兩種方法打印對(duì)象per1和per2
class Person{ // 定義Person類 public String getInfo(){ // 取得信息的方法 System.out.println("Person類 --> " + this) ; // 直接打印this return null ; // 為了保證語(yǔ)法正確,返回null } }; public class ThisDemo06{ public static void main(String args[]){ Person per1 = new Person() ; // 調(diào)用構(gòu)造實(shí)例化對(duì)象 Person per2 = new Person() ; // 調(diào)用構(gòu)造實(shí)例化對(duì)象 System.out.println("MAIN方法 --> " + per1) ; // 直接打印對(duì)象 per1.getInfo() ; // 當(dāng)前調(diào)用getInfo()方法的對(duì)象是per1 System.out.println("MAIN方法 --> " + per2) ; // 直接打印對(duì)象 per2.getInfo() ; // 當(dāng)前調(diào)用getInfo()方法的對(duì)象是per2 } };
運(yùn)行結(jié)果:
MAIN方法 --> methoud.Person@2a139a55
Person類 --> methoud.Person@2a139a55
MAIN方法 --> methoud.Person@15db9742
Person類 --> methoud.Person@15db9742
可見(jiàn),用this調(diào)用的是當(dāng)前對(duì)象,與直接per1,per2是一樣的效果。
四,對(duì)象的比較
以下這個(gè)例子中,生成兩個(gè)對(duì)象,當(dāng)對(duì)象中年齡和姓名完全相等的時(shí)候,則認(rèn)為兩個(gè)對(duì)象是相等的,此時(shí)有兩個(gè)問(wèn)題
1)如何進(jìn)行對(duì)象比較:
2)在那塊對(duì)象比較:
String本身是一個(gè)類,如果要進(jìn)行相等比較,需要使用equls(),而,age是Int,直接使用==判斷。
class Person{ // 定義Person類 private String name ; // 姓名 private int age ; // 年齡 public Person(String name,int age){ this.setName(name) ; this.setAge(age) ; } public void setName(String name){ // 設(shè)置姓名 this.name = name ; } public void setAge(int age){ // 設(shè)置年齡 this.age = age ; } public String getName(){ return this.name ; } public int getAge(){ return this.age ; } }; public class ThisDemo07{ public static void main(String args[]){ Person per1 = new Person("張三",30) ; // 聲明兩個(gè)對(duì)象,內(nèi)容完全相等 Person per2 = new Person("張三",30) ; // 聲明兩個(gè)對(duì)象,內(nèi)容完全相等 // 直接在主方法中依次取得各個(gè)屬性進(jìn)行比較 if(per1.getName().equals(per2.getName())&&per1.getAge()==per2.getAge()){ System.out.println("兩個(gè)對(duì)象相等!") ; }else{ System.out.println("兩個(gè)對(duì)象不相等!") ; } } };
運(yùn)行結(jié)果:
兩個(gè)對(duì)象相等!
以上代碼,功能確實(shí)實(shí)現(xiàn)了,但是由于代碼暴露在外面,不安全,容易出錯(cuò)。
應(yīng)該由自己進(jìn)行比較最合適,所以應(yīng)該在Person類中增加一個(gè)比較的方法。
當(dāng)前對(duì)象調(diào)用傳人的對(duì)象,當(dāng)前對(duì)象即調(diào)用方法的對(duì)象,用this表示,
這里表示在哪里比較。
如下:
class Person{ // 定義Person類 private String name ; // 姓名 private int age ; // 年齡 public Person(String name,int age){ this.setName(name) ; this.setAge(age) ; } public boolean compare(Person per){ // 調(diào)用此方法時(shí)里面存在兩個(gè)對(duì)象:當(dāng)前對(duì)象、傳入的對(duì)象 Person p1 = this ; // 當(dāng)前的對(duì)象,就表示per1 Person p2 = per ; // 傳遞進(jìn)來(lái)的對(duì)象,就表示per2 if(p1==p2){ // 判斷是不是同一個(gè)對(duì)象,用地址比較 return true ; } // 之后分別判斷每一個(gè)屬性是否相等 if(p1.name.equals(p2.name)&&p1.age==p2.age){ return true ; // 兩個(gè)對(duì)象相等 }else{ return false ; // 兩個(gè)對(duì)象不相等 } } public void setName(String name){ // 設(shè)置姓名 this.name = name ; } public void setAge(int age){ // 設(shè)置年齡 this.age = age ; } public String getName(){ return this.name ; } public int getAge(){ return this.age ; } }; public class ThisDemo08{ public static void main(String args[]){ Person per1 = new Person("張三",30) ; // 聲明兩個(gè)對(duì)象,內(nèi)容完全相等 Person per2 = new Person("張三",30) ; // 聲明兩個(gè)對(duì)象,內(nèi)容完全相等 // 直接在主方法中依次取得各個(gè)屬性進(jìn)行比較 if(per1.compare(per2)){ System.out.println("兩個(gè)對(duì)象相等!") ; }else{ System.out.println("兩個(gè)對(duì)象不相等!") ; } } };
運(yùn)行結(jié)果:
兩個(gè)對(duì)象相等!
以上就是小編整理的全部?jī)?nèi)容啦,希望大家繼續(xù)支持腳本之家~
相關(guān)文章
Java源碼分析:Guava之不可變集合ImmutableMap的源碼分析
今天給大家?guī)?lái)的是關(guān)于Java源碼的相關(guān)知識(shí),文章圍繞著Java ImmutableMap展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下,希望能給你帶來(lái)幫助2021-06-06Mybatis collection查詢集合屬性報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Mybatis collection查詢集合屬性報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09java中Callback簡(jiǎn)單使用總結(jié)
正好學(xué)習(xí)到j(luò)ava Callback,就整理了一下,希望整理的文章內(nèi)容對(duì)大家有所幫助2017-04-04Spring中@Async注解實(shí)現(xiàn)異步調(diào)詳解
在本篇文章里小編給大家分享的是關(guān)于Spring中@Async注解實(shí)現(xiàn)異步調(diào)詳解內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-04-04mybatis查詢實(shí)現(xiàn)返回List<Map>類型數(shù)據(jù)操作
這篇文章主要介紹了mybatis查詢實(shí)現(xiàn)返回List<Map>類型數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11IDEA上面搭建一個(gè)SpringBoot的web-mvc項(xiàng)目遇到的問(wèn)題
這篇文章主要介紹了IDEA上面搭建一個(gè)SpringBoot的web-mvc項(xiàng)目遇到的問(wèn)題小結(jié),需要的朋友可以參考下2017-04-04Java 實(shí)戰(zhàn)項(xiàng)目錘煉之網(wǎng)上花店商城的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+jsp+servlet+mysql+ajax實(shí)現(xiàn)一個(gè)網(wǎng)上花店商城系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11Java中forEach使用lambda表達(dá)式,數(shù)組和集合的區(qū)別說(shuō)明
這篇文章主要介紹了Java中forEach使用lambda表達(dá)式,數(shù)組和集合的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07mybatis注解開(kāi)發(fā)使用foreach方式
這篇文章主要介紹了mybatis注解開(kāi)發(fā)使用foreach方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08