一 this調用構造方法
構造方法之間的調用,可以通過this關鍵字來完成。
格式:
this(參數列表);
構造方法的調用舉例:
class Person { // Person的成員屬性 private int age; private String name; // 無參數的構造方法 Person() { } // 給姓名初始化的構造方法 Person(String nm) { name = nm; } // 給姓名和年齡初始化的構造方法 Person(String nm, int a) { // 由於已經存在給姓名進行初始化的構造方法 name = nm;因此只需要調用即可 // 調用其他構造方法,需要通過this關鍵字來調用 this(nm); // 給年齡初始化 age = a; } }
二 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、先執行main方法,main方法壓棧,執行其中的new Person(“張三”,23);
2、堆內存中開辟空間,並為其分配內存地址0x33,,緊接着成員變量默認初始化(name=null age = 0);
3、擁有兩個參數的構造方法(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,這時會執行其中name = nm,即把“張三”賦值給成員的name。當賦值結束后Person(String nm , int a)
構造方法彈棧。
5、程序繼續執行構造方法(Person(String nm , int a)中的age = a;這時會將23賦值給成員屬性age。
賦值結束構造方法(Person(String nm , int a)彈棧。
6、當構造方法(Person(String nm , int a)彈棧結束后,Person對象在內存中創建完成,並將0x33賦值
給main方法中的p引用變量。
注意事項:
this所在的方法,this就代表哪個對象。
調用其他構造方法的語句必須定義在構造方法的第一行,原因是初始化動作要最先執行。
三 成員變量和局部變量同名問題
以在成員變量名前面加上this.來區別成員變量和局部變量
例如:
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(); } }
四 this的應用
例如:在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; } }