クラス名で「this」を使用する


115

私はAndroidプログラミングを行っており、C#のトレーニングを受けた人にはファンキーに思えるコンストラクターを見つけたとき、インテントについて学んでいました。呼び出しは:

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

どちらのパラメーターも私にとって新しいものです。クラス名からの静的な「.this」はどのようにありますか?これはJavaのものですか、Androidのものですか?私はのコンテキストにいるため、これを単に「これ」と言うのと同じであると想定していますがCurrentActivity、クラス名自体からこの「これ」を呼び出す方法がわかりません。また。「.class」は、C#でよく知っているリフレクションに使用されているように見えますが、これに関する洞察も歓迎します。

ありがとう。

回答:


138

通常はのみ使用できます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);
    }
});

17
そうですか。したがって、例の新しいIntentで「this」と言っただけでは、OnClickListenerクラスの「this」を参照することになりますが、外部クラスを参照する必要があるため、それを示す方法が必要です。
skaz 2010年

7
正しい。this常に最も内側のクラスです。
Falmarri 2010年

7
そして、質問の他の部分に答えると、はい、それはJavaの問題です
Decko

1
リスナーを登録するときに、なぜMyClass.thisだけでなく、なぜMyClass.thisなのかと思っていました。ありがとう
luigi7up 2013年

3
おかしい!Java thisがJavaScriptによく似ていることを誰が知っていましたthisか?それは、ファーストクラスの関数やラムダを持たないために得られるものだと思います:-)
Pat

61

一つずつ:

最初の構文は、修飾されたthisと呼ばれます。構文の目的は、内部クラス(通常は匿名の内部クラス)にいて、(匿名の)内部クラスではthisなく外部クラスのを参照する場合ですthis。「修飾されたthis」thisは、あいまいな状況でのみ使用できます。JLSの引用 "クラスTまたはT自体の内部クラスではないクラスまたはインターフェイスで式が発生した場合、コンパイル時エラーになります"。

2番目の構成は、aと呼ばれ、class literalそのタイプを表すClassオブジェクトを参照する方法です。どのような状況でも使用できます。


この答えがまだ十分に明確でない場合は、囲まれたクラスがあり、外部クラスを参照しているときにのみ機能することに注意してください。「NotInTheStackOfEnclosings.this」は使用できません。
diego nunes

1
真実である@DiegoNunes、qualified thisないのclass literal。私はそれをより明確にするために私の答えを拡大しました。
Yishai

14

構文 "Classname.this"は内部クラス用です。「Outerclass」タイプの包含インスタンスを参照する場合は、「Outerclass.this」として実行します。

NextActivity.classは、クラス「NextActivity」を記述するClassオブジェクトです。



8

ClassName.this 内部クラスから外部クラスの現在のインスタンスを参照するために使用されます。


そして確かにその逆ですか?
codymanix、2010年

5
<ClassName>.this

「this」キーワードはネストされたクラスインスタンスを参照するため、ネストされたクラスでは、囲まれたクラスの現在のインスタンスを参照するために使用されます。

public class Siht { class NestedSiht { void demoThis (){ System エラーprintln " Siht.thisがのインスタンスである:" + Siht こののgetClass ()のgetName ())。} }   
      
         
            this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            
        
    

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 " を使用すると、オブジェクトではなくクラスを参照しているように見えるため、混乱を招くだけです。実際には、「this」を使用するときは、Java SEのドキュメントに記載されているように、常に現在のオブジェクトを参照しています。

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

インスタンスメソッドまたはコンストラクター内では、これ現在のオブジェクト(メソッドまたはコンストラクターが呼び出されているオブジェクト)への参照です。これを使用して、インスタンスメソッドまたはコンストラクター内から現在のオブジェクトの任意のメンバーを参照できます。

それは構文的に独特です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.