閱讀目錄 一般形式 不含參數列表 含參數列表 閱讀目錄 閱讀目錄 一般形式 不含參數列表 含參數列表 一般形式 不含參數列表 含參數列表 一、一般形式 this 有兩種形式: 1)不含參數列表,例如:this.age , this.speak() , this 等等 2)含參數列表,例如:this( ...
閱讀目錄
一、一般形式
this 有兩種形式:
1)不含參數列表,例如:this.age , this.speak() , this 等等
2)含參數列表,例如:this(10) , this("Hello World !") 等等
[ 返回頂部 ]
二、不含參數列表
this 關鍵字的由來
package com.example; public class Person{ public void speak(String s){ System.out.println(s); } }
package com.example; public class Test{ public static void main(String[] args){ Person p1 = new Person(); Person p2 = new Person(); p1.speak("This is p1"); p2.speak("This is p2"); } }
1)這裡用 new 創建了兩個 Person 對象,對象的引用分別是 p1 和 p2
2)p1 和 p2 都調用了 speak 方法,那麼 speak 方法怎麼知道是 p1 對自己進行調用還是 p2 對自己進行調用呢?其實編譯器暗自把 “對象的引用” 作為第一個參數傳遞給 speak 方法,所以實際上 speak 方法調用的形式為:
- Person.speak(p1, "This is p1")
- Person.speak(p2, "This is p2")
3)從上面表述中我們知道,在 speak 方法中有對象的引用,那麼我們怎麼才能得到這個引用呢?答案是:使用 this 關鍵字。
返回對象的引用
package com.example; public class Animals{ private int number; public void setNumber(int n){ number = n; } public int getNumber(){ return number; } public Animals getObject(){ return this; //返回對象的引用 } }
package com.example; public class Test{ public static void main(String[] args){ Animals A1 = new Animals(); A1.setNumber(100); System.out.println("A1: number=" + A1.getNumber()); Animals A2 = A1.getObject(); // 使得 A2 與 A1 引用的對象相同 System.out.println("A2:number=" + A2.getNumber()); Animals A3 = new Animals(); System.out.println("A3:number=" + A3.getNumber()); } }
運行結果: A1: number=100 A2:number=100 A3:number=0
1)可以看到,A1 和 A2 中 number 的值都是100,而 A3 中 number 的值是0
2)看 Animals A2 = A1.getObject(); 這一行,A1 調用 getObject()方法,所以返回的 this 就是 A1,該行代碼等同於 A2 = A1;
3)A1 和 A2 指向同一個對象,A3 指向另外一個對象,不同對象的記憶體區域不同,所以 A3 中 number 的值才會是預設值0
防止屬性名稱與局部變數名稱衝突
package com.example; public class Person{ public String name; // 屬性 public int age; public Person(String name, int age){ // 局部變數 this.name = name; this.age = age; } }
package com.example; public class Test{ public static void main(String[] args){ Person p = new Person("張三", 20); System.out.println("name: " + p.name); System.out.println("age: " + p.age); } }
運行結果: name: 張三 age: 20
1)可以看到,屬性名稱和構造器中的局部變數名稱都是一樣的
2)在構造器中用 this.name、this.age 表示屬性名稱,這樣來和局部變數中的 name、age 加以區分
[ 返回頂部 ]
三、含參數列表
作用
含有參數列表的 this 的作用是:在一個構造器中調用另外一個構造器
使用註意事項
1)只能在構造器中調用
2)最多每個構造器只能調用一個
3)必須位於構造器的第一行
package com.example; public class Man{ private int age; private String name; public Man(){ this(20); //this("張三"); // error,構造器中最多只能調用一個 System.out.println("Man()"); } public Man(int age){ this("張三"); System.out.println("age: " + age); } public Man(String name){ System.out.println("name: " + name); //this(); // error,必須位於構造器的第一行 } public int getAge(){ //this(); // error,只能在構造器中調用 return age; } }
package com.example; public class Test{ public static void main(String[] args){ Man m = new Man(); } }
運行結果: name: 張三 age: 20 Man()
1)可以看到,調用含有參數的 this 時,必須遵守相應的原則才能夠正確編譯執行
2)事實上,this 的不同參數列表對應不同的構造器,例如:this(20) 對應的是 public Man(int age){...} 這個構造器
[ 返回頂部 ]
參考資料:
《Java 編程思想》第4版