JavaでのClass.thisとthisの違いは何ですか


121

そのクラス内のクラスのインスタンスを参照するには、2つの方法があります。例えば:

class Person {
  String name;

  public void setName(String name) {
    this.name = name;
  }

  public void setName2(String name) {
    Person.this.name = name;
  }
}

1つはthis.nameオブジェクトフィールドを参照するために使用しますが、もう1つはオブジェクトフィールドclassName.thisを参照するために使用します。これら2つの参照の違いは何ですか?

回答:


165

この場合、それらは同じです。Class.thisあなたはニーズがその外側のクラスのインスタンスを参照することを非静的な入れ子になったクラスを持っているとき、構文が便利です。

class Person{
    String name;

    public void setName(String name){
        this.name = name;
    }

    class Displayer {
        String getPersonName() { 
            return Person.this.name; 
        }

    }
}

2
Person.this.nameの代わりに、「名前を返す」と言っただけでは機能しませんか?
アミットG

7
@Amit G-この例では、はい、動作します。ただし、使用している「this」を明確にする必要がある場合があります(たとえば、メンバー変数名またはメソッド名に競合がある場合)。関連する例については、マイケルの回答を参照してください。
jtahlborn 2011

1
1つの例はPerson.this、別のオブジェクトへの参照を与える必要がある場合です。
ボウイ

85

この構文は、クラスがネストされている場合にのみ関係します。

class Outer{
    String data = "Out!";

    public class Inner{
        String data = "In!";

        public String getOuterData(){
            return Outer.this.data; // will return "Out!"
        }
    }
}

13

内部クラスにはclassName.thisのみを使用する必要があります。それらを使用していない場合でも、心配する必要はありません。


4

Class.this静的でないを参照するのに役立ちますOuterClass

非静的をインスタンス化するにはInnerClass、最初にをインスタンス化する必要がありますOuterClass。したがって、非静的オブジェクトInnerClassは常にその参照と、OuterClassすべてのフィールドおよびメソッドを参照OuterClassできますInnerClass

public static void main(String[] args) {

        OuterClass outer_instance = new OuterClass();
        OuterClass.InnerClass inner_instance1 = outer_instance.new InnerClass();
        OuterClass.InnerClass inner_instance2 = outer_instance.new InnerClass();
        ...
}

この例では、両方Innerclassが同じものからインスタンス化されているOuterclassため、どちらもへの同じ参照を持っていOuterclassます。

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