先看下面程序: this從哪裏來?
public class This {
private int x;
public This(int x){
this.x=x; //this
}
public void f(){
System.out.println(x);
System.out.println(this.x);
}
public static void main(String[] args) {
This t=new This(10);
t.f();
}
}
我們通常在構造器中使用this來訪問由局部變量所屏蔽得成員變量。當然,this也可以再實例方法中使用,用來指代當前對象,只是我們一般會省略this,而是直接通過實例變量去訪問。
我們都知道,this指代的是當前對象,可是,this(當前對象)是從哪裏來的呢? 或者說,一個類可以創建無數個對象,並且每個對象都會堆上分配地址(空間),每個對象也都有自己的實例成員變量。當執行構造器或者實例方法的時候,系統怎麼知道我們要訪問的是哪個對象的x變量呢?
實際是這樣的,在構造器或者實例方法中,都有一個隱藏的參數,這個參數就是類的對象,當調用構造器或者實例方法的時候,就會將這個參數作爲第一個參數傳遞過去,因此,類中的構造器與f方法可以看作這樣的:
public This(This this,int x){
this.x=x;
}
public void f(This this){
System.out.println(x);
System.out.println(this.x);
}
對於靜態方法,在方法調用的時候是沒有隱式參數(this)傳遞的,因爲靜態方法屬於類,與對象無關。所以,在靜態方法中不能使用this。