2010年4月5日 星期一

this關鍵字用法


this關鍵字可以視為強調物件本身的資料,以下我就以簡單的程式概略介紹:

public class test{
public static void main(String[] args){
obj obj1=new obj(1);
System.out.println(obj1.a+","+obj1.b);
obj obj2=new obj(2,2);
System.out.println(obj2.a+","+obj2.b);
}
}

public class obj {
int a=0,b=0;
obj(int a){
this.a=a;
}
obj(int a,int b){ //避免在使用上讓編譯器把兩個建構式區分錯誤
a=a;
}
}


上述obj建構式設置兩種,單引數建構式使用this關鍵字,而雙引數建構式則不使用this關鍵字,其中引數內的變數均已obj類別內的變數相同。test類別個別產生obj1、obj2物件,並個別印出obj1、obj2物件內的參數,結果執行結果為:

1,0
0,0

我們發現obj1的a引數確實設置到obj1物件的a變數內,而obj2的a、b引數卻無設置到obj2物件的a、b變數內,其主要原因在於編譯器把第二個建構式內的a、b變數視為建構式定義的a、b引數而非物件內部的a、b變數。我們可以把第一個建構式內的this.a解釋成物件本身的a變數。

還有另外一個this應用例子:

public class test{
public static void main(String[] args){
obj obj1=new obj(1); //a變數為1
obj obj2=new obj(1); //a變數為1
obj obj3=new obj(2); //a變數為2
obj1.cmp1(obj2); //用cmp1比較obj1跟obj2
obj1.cmp1(obj3); //用cmp1比較obj1跟obj3
obj1.cmp2(obj2); //用cmp2比較obj1跟obj2
obj1.cmp2(obj3); //用cmp2比較obj1跟obj3
}
}

public class obj {
int a=0;
obj(int a){
this.a=a;
}
void cmp1(obj objcmp){
if(this.a= =objcmp.a) System.out.println("equal");
else System.out.println("unequal");
}
void cmp2(obj objcmp){
if(this= =objcmp) System.out.println("equal");
else System.out.println("unequal");
}
}

在obj類別裡,新增兩個方法(method),均為比較物件內的變數是否相同,其中cmp1與cmp2的差別在於有無指明是a變數,其結果為:

equal
unequal
unequal
unequal

cmp1的執行結果與預想的一樣,但cmp2的結果卻出現異樣,原因在於單使用this作為變數,則視為整個物件,即便obj1與obj2的內容相同,但畢竟是不同物件,所以判定兩者不相同。

參考資料:

沒有留言:

張貼留言