366 Stimmen

Wann sollte ich "dies" in einer Klasse verwenden?

Ich weiß, dass this bezieht sich auf ein aktuelles Objekt. Aber ich weiß nicht, wann ich es wirklich brauchen werde. Gibt es zum Beispiel einen Unterschied, wenn ich x 代わりに this.x in einigen der Methoden? Kann sein x auf eine Variable verweisen wird, die für die betreffende Methode lokal ist? Ich meine eine Variable, die nur in dieser Methode zu sehen ist.

Was ist mit this.method() ? Kann ich es verwenden? Sollte ich es verwenden. Wenn ich nur method() wird sie dann nicht standardmäßig auf das aktuelle Objekt angewendet?

468voto

William Brendel Punkte 30822

En this Schlüsselwort wird hauptsächlich in drei Situationen verwendet. Die erste und häufigste ist in Setter-Methoden, um Variablenreferenzen zu disambiguieren. Die zweite ist, wenn die aktuelle Klasseninstanz als Argument an eine Methode eines anderen Objekts übergeben werden soll. Drittens kann man aus einem Konstruktor heraus alternative Konstruktoren aufrufen.

Fall 1: Verwendung von this um Variablenreferenzen zu disambiguieren. In Java-Setter-Methoden wird in der Regel ein Argument mit demselben Namen wie die private Mitgliedsvariable übergeben, die gesetzt werden soll. Dann weisen wir das Argument x a this.x . Dadurch wird deutlich, dass Sie den Wert des Parameters "name" der Instanzvariablen "name" zuweisen.

public class Foo
{
    private String name;

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

Fall 2: Verwendung von this als Argument an ein anderes Objekt übergeben.

public class Foo
{
    public String useBarMethod() {
        Bar theBar = new Bar();
        return theBar.barMethod(this);
    }

    public String getName() {
        return "Foo";
    }
}

public class Bar
{
    public void barMethod(Foo obj) {
        obj.getName();
    }
}

Fall 3: Verwendung von this um alternative Konstruktoren aufzurufen. In den Kommentaren, trinithis hat zu Recht auf eine weitere häufige Verwendung von this . Wenn Sie mehrere Konstruktoren für eine einzelne Klasse haben, können Sie this(arg0, arg1, ...) um einen anderen Konstruktor Ihrer Wahl aufzurufen, sofern Sie dies in der ersten Zeile Ihres Konstruktors tun.

class Foo
{
    public Foo() {
        this("Some default value for bar");

        //optional other lines
    }

    public Foo(String bar) {
        // Do something with bar
    }
}

Ich habe auch gesehen this verwendet, um die Tatsache zu betonen, dass eine Instanzvariable referenziert wird (ohne die Notwendigkeit einer Disambiguierung), aber das ist meiner Meinung nach ein seltener Fall.

81voto

Christopher Oezbek Punkte 20239

Die zweite wichtige Verwendung von this (neben dem Verstecken mit einer lokalen Variablen, wie bereits in vielen Antworten erwähnt) ist der Zugriff auf eine äußere Instanz von einer verschachtelten nicht statischen Klasse:

public class Outer {
  protected int a;

  public class Inner {
    protected int a;

    public int foo(){
      return Outer.this.a;
    }

    public Outer getOuter(){
      return Outer.this;
    }
  }
}

51voto

froadie Punkte 75709

Sie müssen nur Folgendes verwenden this - und die meisten Leute benutzen sie nur, wenn es eine überlappende lokale Variable mit demselben Namen gibt. (Setter-Methoden, zum Beispiel.)

Natürlich ist ein weiterer guter Grund für die Verwendung von this ist, dass es Intellisense in IDEs auftauchen lässt :)

32voto

Adam Robinson Punkte 176996

Die einzige brauchen zur Nutzung der this. Qualifier wird verwendet, wenn eine andere Variable im aktuellen Bereich denselben Namen hat und Sie sich auf das Instanzmitglied beziehen wollen (wie William beschreibt). Abgesehen davon gibt es keinen Unterschied im Verhalten zwischen x y this.x .

15voto

Benjamin Punkte 151

"this" ist auch nützlich, wenn ein Konstruktor von einem anderen aufgerufen wird:

public class MyClass {
    public MyClass(String foo) {
        this(foo, null);
    }
    public MyClass(String foo, String bar) {
        ...
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X