方法之間調用,可以通過方法名進行調用。但構造方法,無法通過構造方法名來相互調用。 構造方法之間的調用,可以通過this關鍵字來完成。 l 構造方法調用格式: this(參數列表); l 構造方法的調用 l 圖列說明: 1、先執行main方法,main方法壓棧,執行其中的new Person(“張三” ...
方法之間調用,可以通過方法名進行調用。但構造方法,無法通過構造方法名來相互調用。
構造方法之間的調用,可以通過this關鍵字來完成。
l 構造方法調用格式:
this(參數列表);
l 構造方法的調用
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; } }
l 圖列說明:
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引用變數。
l 註意:
this到底代表什麼呢?this代表的是對象,具體代表哪個對象呢?哪個對象調用了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(); } }
需求:在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; } }