本章目標(biāo)
- 掌握this關(guān)鍵字的使用
- 使用this調(diào)用其他構(gòu)造方法
- 使用this表示當(dāng)前對象
1、具體內(nèi)容
1.1汪厨、表示類中的屬性
例如赃春,有如下的一道程序:
class Person{ // 定義Person類
private String name ; // 姓名
private int age ; // 年齡
public Person(String name,int age){ // 通過構(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)造實例化對象
System.out.println(per1.getInfo()) ; // 取得信息
}
};
輸出結(jié)果:
姓名:null劫乱,年齡:0
此時聘鳞,并沒有正確的將內(nèi)容賦值給屬性。
假設(shè):現(xiàn)在要拿一根筆寫字要拂,在自己的桌子上已經(jīng)有了一根可以使用的比抠璃,之后在離自己10米遠(yuǎn)的地方也有一根筆。那么脱惰,此時你會選擇拿哪根筆寫字搏嗡?所以,此時操作的name和age實際上都是構(gòu)造方法中的拉一,跟類中的屬性完全不沾邊采盒。
所以此時,為了明確的表示出哪個是類中的屬性蔚润,此時就要加上“this.屬性名稱”的操作磅氨。
代碼改進(jìn):
class Person{ // 定義Person類
private String name ; // 姓名
private int age ; // 年齡
public Person(String name,int age){ // 通過構(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)造實例化對象
System.out.println(per1.getInfo()) ; // 取得信息
}
};
在大部分操作的時候嫡纠,屬性最好都是用this.屬性的形式表示烦租。
輸出結(jié)果:
姓名:null,年齡:0
1.2除盏、使用this調(diào)用構(gòu)造方法
如果在一個類中有多個構(gòu)造方法的話叉橱,也可以利用this關(guān)鍵字互相調(diào)用。
假設(shè):現(xiàn)在有一個類中存在多個構(gòu)造方法者蠕,但是不管都少個構(gòu)造方法窃祝,最終結(jié)果都要打印一句“新對象實例化”。此時就有以下的兩種做法:
- 按照最原始的方法完成:
class Person{ // 定義Person類
private String name ; // 姓名
private int age ; // 年齡
public Person(){ // 無參構(gòu)造
System.out.println("新對象實例化") ;
}
public Person(String name){
System.out.println("新對象實例化") ;
this.name = name ;
}
public Person(String name,int age){ // 通過構(gòu)造方法賦值
System.out.println("新對象實例化") ;
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)造實例化對象
System.out.println(per1.getInfo()) ; // 取得信息
}
};
因為以上代碼重復(fù)了粪小,現(xiàn)在只是一行,所以感覺不出來抡句,如果現(xiàn)在代碼有很多行的話探膊,以上代碼的缺陷,就立刻顯示出來了玉转。
此時突想,最好讓構(gòu)造方法間進(jìn)行互相的調(diào)用,使用this(若干參數(shù))的形式完成。
- 使用this修改以上的代碼:
class Person{ // 定義Person類
private String name ; // 姓名
private int age ; // 年齡
public Person(){ // 無參構(gòu)造
System.out.println("新對象實例化") ;
}
public Person(String name){
this.name = name ;
this() ;// 調(diào)用本類中的無參構(gòu)造方法
}
public Person(String name,int age){ // 通過構(gòu)造方法賦值
this(name) ;// 調(diào)用有一個參數(shù)的構(gòu)造方法
this.age = age ;// 為類中的age屬性賦值
}
public String getInfo(){ // 取得信息的方法\
this() ;// 調(diào)用本類中的無參構(gòu)造方法
return "姓名:" + name + "猾担,年齡:" + age ;
}
};
public class ThisDemo04{
public static void main(String args[]){
Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實例化對象
System.out.println(per1.getInfo()) ; // 取得信息
}
};
輸出結(jié)果:
姓名:張三袭灯,年齡:33
注意點:在使用this關(guān)鍵字調(diào)用其他構(gòu)造方法的時候,有以下幾點限制:
- this()調(diào)用構(gòu)造方法的語句只能放在構(gòu)造方法的首行绑嘹。
- 在使用this調(diào)用本類中其他構(gòu)造方法的時候稽荧,至少有一個構(gòu)造方法不用this調(diào)用的。
class Person{ // 定義Person類
private String name ; // 姓名
private int age ; // 年齡
public Person(){ // 無參構(gòu)造
this("LXH",30) ; // 調(diào)用有兩個參數(shù)的構(gòu)造方法
System.out.println("新對象實例化") ;
}
public Person(String name){
this() ;// 調(diào)用本類中的無參構(gòu)造方法
this.name = name ;
}
public Person(String name,int age){ // 通過構(gòu)造方法賦值
this(name) ;// 調(diào)用有一個參數(shù)的構(gòu)造方法
this.age = age ;// 為類中的age屬性賦值
}
public String getInfo(){ // 取得信息的方法
return "姓名:" + name + "工腋,年齡:" + age ;
}
};
public class ThisDemo05{
public static void main(String args[]){
Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實例化對象
System.out.println(per1.getInfo()) ; // 取得信息
}
};
此時構(gòu)造方法出現(xiàn)了遞歸調(diào)用姨丈,是一個錯誤的程序。
1.3擅腰、使用this表示當(dāng)前對象
當(dāng)前對象:當(dāng)前正在調(diào)用發(fā)法的對象蟋恬。
class Person{ // 定義Person類
public String getInfo(){ // 取得信息的方法
System.out.println("Person類 --> " + this) ; // 直接打印this
return null ; // 為了保證語法正確,返回null
}
};
public class ThisDemo06{
public static void main(String args[]){
Person per1 = new Person() ; // 調(diào)用構(gòu)造實例化對象
Person per2 = new Person() ; // 調(diào)用構(gòu)造實例化對象
System.out.println("MAIN方法 --> " + per1) ; // 直接打印對象
per1.getInfo() ; // 當(dāng)前調(diào)用getInfo()方法的對象是per1
System.out.println("MAIN方法 --> " + per2) ; // 直接打印對象
per2.getInfo() ; // 當(dāng)前調(diào)用getInfo()方法的對象是per2
}
};
輸出結(jié)果:
MAIN方法 --> Person@1540e19d
Person類 --> Person@1540e19d
MAIN方法 --> Person@677327b6
Person類 --> Person@677327b6
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) ; // 聲明兩個對象,內(nèi)容完全相等
Person per2 = new Person("張三",30) ; // 聲明兩個對象,內(nèi)容完全相等
// 直接在主方法中依次取得各個屬性進(jìn)行比較
if(per1.getName().equals(per2.getName())&&per1.getAge()==per2.getAge()){
System.out.println("兩個對象相等!") ;
}else{
System.out.println("兩個對象不相等!") ;
}
}
};
生成兩個對象括尸,當(dāng)兩個對象中的姓名和年齡完全相等時屁柏,則認(rèn)為對象是相等的僧家,但是在此時會產(chǎn)生兩個問題:
- 如何進(jìn)行對象的比較?
- 在哪塊進(jìn)行對象的比較肌稻?
String本身是一個類,如果要想進(jìn)行相等的比較东揣,則要判斷內(nèi)容凉袱,則必須使用equals()方法完成运沦,而age是int型,所以直接使用"=="完成即可烈掠。
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)用此方法時里面存在兩個對象:當(dāng)前對象、傳入的對象
Person p1 = this ; // 當(dāng)前的對象,就表示per1
Person p2 = per ; // 傳遞進(jìn)來的對象叼风,就表示per2
if(p1==p2){ // 判斷是不是同一個對象,用地址比較
return true ;
}
// 之后分別判斷每一個屬性是否相等
if(p1.name.equals(p2.name)&&p1.age==p2.age){
return true ; // 兩個對象相等
}else{
return false ; // 兩個對象不相等
}
}
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) ; // 聲明兩個對象彬碱,內(nèi)容完全相等
Person per2 = new Person("張三",30) ; // 聲明兩個對象配乱,內(nèi)容完全相等
// 直接在主方法中依次取得各個屬性進(jìn)行比較
if(per1.compare(per2)){
System.out.println("兩個對象相等!") ;
}else{
System.out.println("兩個對象不相等皮迟!") ;
}
}
};
輸出結(jié)果:
兩個對象相等搬泥!
地址相等,則兩個對象相等伏尼,如果地址不等忿檩,則以此判斷每一個屬性的內(nèi)容來判斷其是否相等。
2爆阶、總結(jié)
詳細(xì)解釋了this關(guān)鍵字的作用:
- this.屬性燥透、this.方法(),實際上都表示當(dāng)前的對象中的屬性或當(dāng)前對象調(diào)用的方法
- this的核心:表示當(dāng)前對象辨图,當(dāng)前正在操作本方法的對象稱為當(dāng)前對象
- 使用this可以調(diào)用其他構(gòu)造昂奮班套,但是此語句必須放在構(gòu)造方法的首行