Was ist der Unterschied zwischen Class.this und diesem in Java


121

Es gibt zwei Möglichkeiten, auf die Instanz einer Klasse innerhalb dieser Klasse zu verweisen. Beispielsweise:

class Person {
  String name;

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

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

Einer verwendet, this.nameum auf das Objektfeld zu verweisen, der andere verwendet, className.thisum auf das Objektfeld zu verweisen. Was ist der Unterschied zwischen diesen beiden Referenzen?

Antworten:


164

In diesem Fall sind sie gleich. Die Class.thisSyntax ist nützlich, wenn Sie eine nicht statisch verschachtelte Klasse haben, die auf die Instanz ihrer äußeren Klasse verweisen muss.

class Person{
    String name;

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

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

    }
}

2
Wenn Sie anstelle von Person.this.name nur "return name" gesagt haben, funktioniert das nicht?
Amit G

7
@Amit G - in diesem Beispiel wird es funktionieren. Es gibt jedoch Situationen, in denen Sie klären müssen, welches "dies" Sie verwenden (z. B. wenn Konflikte bei Mitgliedsnamen oder Methodennamen auftreten). Ein relevantes Beispiel finden Sie in Michaels Antwort.
Jtahlborn

1
Ein Beispiel wäre, wenn Sie auf ein Person.thisanderes Objekt verweisen müssen .
Bowi

85

Diese Syntax wird nur relevant, wenn Sie verschachtelte Klassen haben:

class Outer{
    String data = "Out!";

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

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

13

Sie müssen className.this nur für innere Klassen verwenden. Wenn Sie sie nicht verwenden, machen Sie sich darüber keine Sorgen.


4

Class.this ist nützlich, um auf eine nicht statische zu verweisen OuterClass .

Um einen Nichtstatiker zu instanziieren InnerClass, müssen Sie zuerst den instanziieren OuterClass. Daher wird ein Nichtstatiker InnerClassimmer einen Bezug zu seinem haben OuterClassund alle Felder und Methoden von OuterClassstehen dem zur Verfügung 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();
        ...
}

In diesem Beispiel werden beide Innerclassvom selben instanziiert, Outerclassdaher haben beide den gleichen Verweis auf das Outerclass.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.