this是指向本身的隱含的指針,簡單的說,哪個物件呼叫this所在的方法,那麼this就是哪個物件。
範例程式碼: TestThis_1.java
複製代碼代碼如下:
/* 問題:什麼是this
* 輸出結果:
* A@4e44ac6a
*/
public class TestThis_1 {
public static void main(String[] args) {
A aa = new A();
System.out.println(aa.f()); //aa.f(), 回傳aa這個物件的參考(指標)
}
}
class A {
public A f() {
return this; //傳回呼叫f()方法的物件的A類別物件的引用
}
}
this的常見用法
1. 區分同名變數
範例程式碼: TestThis_2.java
複製代碼代碼如下:
/* this的常見用法1:區分同名變數
* 輸出結果:
* this. i = 1
* i = 33
*/
public class TestThis_2 {
public static void main(String[] args) {
A aa = new A(33);
}
}
class A {
public int i = 1; //這個i是成員變數
/*注意:一般不這麼寫,建構子主要是為了初始化,這麼寫主要是為了方便理解*/
public A(int i) { //這個i是局部變數
System.out.printf("this. i = %d/n", this.i); //this.i指的是物件本身的成員變數i
System.out.printf("i = %d/n", i); //這裡的i是局部變數i
}
}
2. 構造方法間的相互調用
範例程式碼: TestThis_3.java
複製代碼代碼如下:
/* this的常見用法2: 建構方法中互相呼叫*/
public class TestThis_3 {
public static void main(String[] args) {
}
}
class A {
int i, j, k;
public A(int i) {
this.i = i;
}
public A(int i, int j) {
/* i = 3; error 如果不註解掉就會報錯:用this(...)呼叫建構方法的時候,只能把它放在第一句
* TestThis_3.java:20: error: call to this must be first statement in constructor
* this(i);
* ^
* 1 error
*/
this(i);
this.j = j;
}
public A(int i, int j, int k) {
this(i, j);
this.k = k;
}
}
注意事項
被static修飾的方法沒有this指標。因為被static修飾的方法是公共的,不能說是屬於哪個具體的對象的。
範例程式碼: TestThis_4.java
複製代碼代碼如下:
/*static方法內部沒有this指針*/
public class TestThis_4 {
public static void main(String[] args) {
}
}
class A {
static A f() {
return this;
/* 出錯訊息:TestThis_4.java:10: error: non-static variable this cannot be referenced from a static context
* return this;
* ^
* 1 error
*/
}
}