2010-11-02 38 views
102

我正在做Android編程,並且正在學習Intents,當我看到一個構造函數時,對我的C#培訓的頭腦,看起來很時髦。電話是:使用「this」和類名

Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class); 

這兩個參數對我來說都是新的。如何從類名稱中獲取靜態「.this」?這是一個Java事物還是一個Android事物?我假設它只是說「this」,因爲我在CurrentActivity的背景下,但我不知道如何將「this」從類名稱本身中取消。也。 「.class」看起來像它用於反射,這在C#中我很熟悉,但任何對此的洞察也會受到歡迎。

謝謝。

回答

122

通常情況下,你只能使用this。但是,有時this參考了一個內部類...因此,例如:

Button button = (Button)findViewById(R.id.ticket_details_sell_ticket); 
button.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // it will be wrong to use only "this", because it would 
     // reference the just created OnClickListener object 
     Intent login = new Intent(ClassName.this, Login.class); 
     startActivityForResult(login, LOGIN_REQUEST); 
    } 
}); 
+16

我明白了。所以如果我剛剛在你的例子中的新Intent中說了「this」,它會引用OnClickListener類的「this」,但是因爲我需要引用外部類,所以我需要一種方式來表示它。 – skaz 2010-11-02 18:38:05

+6

沒錯。 「這個」總是最內層的。 – Falmarri 2010-11-02 19:21:22

+7

並回答問題的其他部分:是的,這是一個java事情 – Decko 2011-07-22 13:08:07

8

ClassName.this用於從內部類引用外部類的當前實例。

+0

而且肯定是另一種方式? – codymanix 2010-11-02 18:26:56

12

語法「Classname.this」用於內部類。如果你想引用封閉的「Outerclass」類型的實例,那麼你將它作爲「Outerclass.this」。

NextActivity.class只是描述類「NextActivity」的Class對象。

9

在Java NextActivity.class意味着在C#typeof(NextActivity)

55

一次一個:

第一構建體被稱爲qualified this。語法的目的是在您處於內部類(通常是匿名內部類)的情況下,並且您想引用外部類的this而不是內部類(匿名)的this。 「合格的」只能在this不明確的情況下使用。引用JLS「如果表達式出現在不是類T或T本身的內部類的類或接口中,則這是編譯時錯誤」。

第二個構造被稱爲class literal是引用表示該類型的Class對象的方式。它可以在任何情況下使用。

+0

值得注意的是,如果這個答案仍然不夠明確,那它只有在封閉類和引用外部類時纔有效。你根本無法使用「NotInTheStackOfEnclosings.this」。 – 2015-07-21 23:54:34

+1

@DiegoNunes,這是'合格這',而不是'類文字'。我已經擴大了我的答案,使之更清晰。 – Yishai 2015-07-22 17:13:53

3
<ClassName>.this 

用於嵌套類引用封閉類的當前實例,因爲`this'關鍵字引用了嵌套類實例。

 
public class Siht { 
    class NestedSiht { 
     void demoThis() { 
      System.err.println("this' is an instance of: " + 
          this.getClass().getName()); 
      System.err.println("Siht.this' is an instance of: " + 
          Siht.this.getClass().getName()); 
     } 
    }

void demoThis() { 
    new java.lang.Object() { 
     void demoThis() { 
      System.err.println("`this' is an instance of: " + 
          this.getClass().getName()); 
      System.err.println("`Siht.this' is an instance of: " + 
          Siht.this.getClass().getName()); 
     } 
    }.demoThis(); 
    new NestedSiht().demoThis(); 
} 

public static void main(String [] args) { 
    new Siht().demoThis(); 
} 

}

0

,因爲當你使用 「MainActivity.this」 這只是混亂,看來你指的是類,而不是對象。 在現實中,當你用「這個」你總是指當前對象, 作爲Java SE文檔狀態:

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

在實例方法或構造,是參考到當前對象 t - 其方法或構造函數被調用的對象。您可以使用此方法從實例方法或構造函數中引用當前對象的任何成員。

這只是語法上特有的。