其實這主要是因為在 Android 程式中, 大多數的程式可能都是在事件處理時執行, 而大多數的事件處理都是寫在匿名的內部類別 (Inner Class) 中, 也就是說, 當事件處理執行時, 所屬的物件是內部類別所產生的物件, 因此若是只寫 this, 那麼所指的其實是這個內部類別的物件, 但我們需要傳遞的是外部 Activity 類別的物件 (Activity 是 Context 的衍生類別), 這時就必須在 this 前冠上外部類別的名稱, 而這也就是你會看到 XXXActivity.this 的原因。
如果你還是不大了解, 請看以下這段程式:
public class MyOutterClass {
String name = "Outter Class";
MyInnerClass inner = null;
void callout() {
System.out.println("(Outter)this.name=" + this.name);
System.out.println("(Outter)MyOutterClass.this.name=" +
MyOutterClass.this.name);
}
public MyOutterClass() {
inner = new MyInnerClass();
}
public static void main(String[] argv) {
MyOutterClass outter = new MyOutterClass();
outter.inner.callme();
}
class MyInnerClass {
String name = "Inner Class";
void callme() {
System.out.println("(Inner)this.name=" + this.name);
System.out.println("(Inner)MyOutterClass.this.name=" +
MyOutterClass.this.name);
callout();
}
}
}
執行後的結果如下:(Inner)this.name=Inner Class (Inner)MyOutterClass.this.name=Outter Class (Outter)this.name=Outter Class (Outter)MyOutterClass.this.name=Outter Class當內部類別的 callme() 執行時, 可以看到 this 與 MyOutterClass.this 指的分別是內部以及外部的物件, 但是當執行到外部類別的 callout() 時, 這兩種寫法指的都是外部的物件。
補充說明:內部類別是指非 static 的巢狀類別 (Nested Class), 所以每個內部類別的物件一定都有一個版隨的外部類別的物件。
沒有留言:
張貼留言