09.23 面向對象之this關鍵字的深入理解

方法之間調用,可以通過方法名進行調用。但構造方法,無法通過構造方法名來相互調用。

構造方法之間的調用,可以通過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;

}

}

面向對象之this關鍵字的深入理解

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;

}

}


分享到:


相關文章: