第2章 this關鍵字
在之前學習方法時,我們知道方法之間是可以相互調用的,那么構造方法之間能不能相互調用呢?若可以,怎么調用呢?
2.1 this調用構造方法
在之前學習方法之間調用時,可以通過方法名進行調用。可是針對構造方法,無法通過構造方法名來相互調用。
構造方法之間的調用,可以通過this關鍵字來完成。
? 構造方法調用格式:
this(參數(shù)列表);
? 構造方法的調用
class Person {
// Person的成員屬性
private int age;
private String name;
// 無參數(shù)的構造方法
Person() {
}
// 給姓名初始化的構造方法
Person(String nm) {
name = nm;
}
// 給姓名和年齡初始化的構造方法
Person(String nm, int a) {
// 由于已經存在給姓名進行初始化的構造方法 name = nm;因此只需要調用即可
// 調用其他構造方法,需要通過this關鍵字來調用
this(nm);
// 給年齡初始化
age = a;
}
}
2.2 this的原理圖解
了解了構造方法之間是可以相互調用,那為什么他們之間通過this就可以調用呢?
通過上面的學習,簡單知道使用this可以實現(xiàn)構造方法之間的調用,但是為什么就會知道this調用哪一個構造方法呢?接下來需要圖解完成。
class Person {
private int age;
private String name;
Person() {
}
Person(String nm) {
name = nm;
}
Person(String nm, int a) {
this(nm);
age = a;
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person("張三", 23);
}
}
? 圖列說明:
1、先執(zhí)行main方法,main方法壓棧,執(zhí)行其中的new Person(“張三”,23);
2、堆內存中開辟空間,并為其分配內存地址0x33,,緊接著成員變量默認初始化(name=null age = 0);
3、擁有兩個參數(shù)的構造方法(Person(String nm , int a))壓棧,在這個構造方法中有一個隱式的this,因為構造方法是給對象初始化的,那個對象調用到這個構造方法,this就指向堆中的那個對象。
4、由于Person(String nm , int a)構造方法中使用了this(nm);構造方法Person(String nm)就會壓棧,并將“張三”傳遞給nm。在Person(String nm , int a)構造方法中同樣也有隱式的this,this的值同樣也為0x33,這時會執(zhí)行其中name = nm,即把“張三”賦值給成員的name。當賦值結束后Person(String nm , int a)構造方法彈棧。
5、程序繼續(xù)執(zhí)行構造方法(Person(String nm , int a)中的age = a;這時會將23賦值給成員屬性age。賦值結束構造方法(Person(String nm , int a)彈棧。
6、當構造方法(Person(String nm , int a)彈棧結束后,Person對象在內存中創(chuàng)建完成,并將0x33賦值給main方法中的p引用變量。
? 注意:
this到底代表什么呢?this代表的是對象,具體代表哪個對象呢?哪個對象調用了this所在的方法,this就代表哪個對象。
調用其他構造方法的語句必須定義在構造方法的第一行,原因是初始化動作要最先執(zhí)行。
2.3 成員變量和局部變量同名問題
通過上面學習,基本明確了對象初始化過程中的細節(jié),也知道了構造方法之間的調用是通過this關鍵字完成的。但this也有另外一個用途,接下來我們就學習下。
當在方法中出現(xiàn)了局部變量和成員變量同名的時候,那么在方法中怎么區(qū)別局部變量成員變量呢?可以在成員變量名前面加上this.來區(qū)別成員變量和局部變量
class Person {
private int age;
private String name;
// 給姓名和年齡初始化的構造方法
Person(String name, int age) {
// 當需要訪問成員變量是,只需要在成員變量前面加上this.即可
this.name = name;
this.age = age;
}
public void speak() {
System.out.println("name=" + this.name + ",age=" + this.age);
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person("張三", 23);
p.speak();
}
}
2.4 this的應用
學習完了構造方法、this的用法之后,現(xiàn)在做個小小的練習。
需求:在Person類中定義功能,判斷兩個人是否是同齡人
class Person {
private int age;
private String name;
// 給姓名和年齡初始化的構造方法
Person(String name, int age) {
// 當需要訪問成員變量是,只需要在成員變量前面加上this.即可
this.name = name;
this.age = age;
}
public void speak() {
System.out.println("name=" + this.name + ",age=" + this.age);
}
// 判斷是否為同齡人
public boolean equalsAge(Person p) {
// 使用當前調用該equalsAge方法對象的age和傳遞進來p的age進行比較
// 由于無法確定具體是哪一個對象調用equalsAge方法,這里就可以使用this來代替
/*
* if(this.age == p.age) { return true; } return false;
*/
return this.age = p.age;
}
}