2009-02-23 11 views
18

Ich versuche zu verstehen, was das Java-Schlüsselwort this tatsächlich tut. Ich habe Sun's Dokumentation gelesen, aber ich bin immer noch unscharf auf was this tatsächlich tut.Mit dem Schlüsselwort "this" in Java

+1

@JasonC Fragen können nur Duplikate anderer Fragen auf dieser Website sein. –

Antwort

36

Das this Schlüsselwort ein Verweis auf das aktuelle Objekt.

class Foo 
{ 
    private int bar; 

    public Foo(int bar) 
    { 
     // the "this" keyword allows you to specify that 
     // you mean "this type" and reference the members 
     // of this type - in this instance it is allowing 
     // you to disambiguate between the private member 
     // "bar" and the parameter "bar" passed into the 
     // constructor 
     this.bar = bar; 
    } 
} 

Eine andere Möglichkeit, darüber nachzudenken, dass das this Schlüsselwort wie ein Personalpronomen ist, dass Sie sich referenzieren. Andere Sprachen haben unterschiedliche Wörter für dasselbe Konzept. VB verwendet Me und die Python-Konvention (da Python kein Schlüsselwort verwendet, einfach ein impliziter Parameter für jede Methode) ist self zu verwenden.

Wenn Sie waren Objekte verweisen, die an sich bei Ihnen sind, würden Sie so etwas wie dies sagen:

Mein Arm oder mein Bein

Denken Sie an this als nur eine Möglichkeit für ein Typ, der "mein" sagt. So wäre eine psuedocode Darstellung wie folgt aussehen:

class Foo 
{ 
    private int bar; 

    public Foo(int bar) 
    { 
     my.bar = bar; 
    } 
} 
+1

Sie könnten das oben ohne "this" tun, zum Beispiel mit etwas wie ungarische Notation. m_bar = bar. So erklärt sich nicht wirklich, wofür das wirklich wichtig ist. –

+1

könnte es sein, seltsame Konstrukte wie diese zu vermeiden? – Magnar

+0

@ng: Was machen Sie, wenn Sie das Feld nicht umbenennen können? Wie wenn es ein geschütztes Feld von einer Superklasse ist? –

6

"Dies" ist eine Referenz auf das aktuelle Objekt.

Details sehen here

4

Eine noch bessere Nutzung dieser

public class Blah implements Foo { 

    public Foo getFoo() { 
     return this; 
    } 
} 

Es ermöglicht Ihnen, speziell „das“ Objekt im aktuellen Kontext. Ein anderes Beispiel:

public class Blah { 

    public void process(Foo foo) { 
     foo.setBar(this); 
    } 
} 

Wie sonst könnten Sie diese Operationen ausführen.

+0

Für Ihr erstes Beispiel: Es macht wirklich keinen Sinn, 'das' von einem Objekt zurückzugeben. Der Aufrufer hat bereits einen Verweis auf Ihr Objekt, wie sonst würde er die Methode aufrufen? – eljenso

+0

@eljenso: Wenn "zurückgeben"; ist die einzige Zeile in der Methode, dann ja, es ist ziemlich nutzlos. Aber wenn es z.B. Ein Setter, mit dem Sie Methoden verketten können: myFoo.setBar (myBar) .setBaz (myBaz) .setMyInt (1); –

+0

Nicht nur das, aber was, wenn das zurückkommt, ist ein Merkmal einer Schnittstellenimplementierung? Ich fordere Sie heraus, mir ein komplexes Projekt zu zeigen, das Sie nicht irgendwann zurückgeben müssen. Es ist eine kritische Anforderung der meisten OO-Systeme. –

5

The keyword this is a reference to the current object. Es wird erklärt, am besten mit der folgenden Code:

public class MyClass { 

    public void testingThis() 
    { 
     // You can access the stuff below by 
     // using this (although this is not mandatory) 

     System.out.println(this.myInt); 
     System.out.println(this.myStringMethod()); 

     // Will print out: 
     // 100 
     // Hello World 
    } 

    int myInt = 100; 
    string myStringMethod() 
    { 
     return "Hello World"; 
    } 

} 

es nicht viel verwendet wird, wenn Sie Codestandard an Ihrem Platz haben sagen das this Schlüsselwort zu verwenden. Es gibt eine gemeinsame Verwendung für sie, und das ist, wenn Sie einen Code-Konvention folgen, wo Sie Parameternamen haben, die gleich sind wie Ihre Klasse Attribute:

public class ProperExample { 
    private int numberOfExamples; 

    public ProperExample(int numberOfExamples) 
    { 
     this.numberOfExamples = numberOfExamples; 
    } 
} 

Eine ordnungsgemäße Verwendung der diesem Begriff Kettenbauer ist (was Konstruieren von Objekt konsistent in Konstruktoren):

Dieses Schlüsselwort funktioniert auf die gleiche Weise in zB C#.

+0

Dieser Code ist falsch, eine statische Methode hat keinen Verweis darauf. –

+0

kompiliert es? Zugriff auf Objektelemente von einer statischen Methode sollte nicht – chburd

+0

Nein, tut es nicht. main() ist eine statische Methode und daher gibt es keinen 'diesen' Zeiger, weil es kein Objekt gibt, das ihn aufruft. Dies sollte nicht kompiliert werden. – James

1

Das Schlüsselwort 'dieser' bezieht sich auf den Kontext des aktuellen Objekts. In vielen Fällen (wie Andrew weist darauf hin), verwenden Sie eine explizite diese, um deutlich zu machen, dass Sie auf das aktuelle Objekt verweisen.

Auch von 'this and super':

* Es gibt auch andere Verwendungen für diese. Wenn Sie eine Instanzmethode schreiben, müssen Sie manchmal das Objekt, das die Methode enthält, als tatsächlichen Parameter an eine Unterroutine übergeben. In diesem Fall können Sie dies als tatsächlichen Parameter verwenden. Wenn Sie beispielsweise eine Zeichenfolgendarstellung des Objekts drucken möchten, können Sie "System.out.println (this);" sagen. Oder Sie könnten den Wert einer anderen Variablen in einer Zuweisungsanweisung zuweisen.

In der Tat kann man nichts damit tun, dass Sie mit jeder anderen Variablen tun konnte, außer seinen Wert ändern. *

Diese Stelle bezieht sich auch auf die damit verbundene Konzept der ‚Super‘, die beweisen können um zu verstehen, wie diese mit Vererbung arbeiten.

0

Denken Sie in Bezug auf Englisch, "dieses Objekt" ist das Objekt, das Sie derzeit haben.

WindowMaker foo = new WindowMaker(this); 

Zum Beispiel sind Sie derzeit in einer Klasse, die von der JFrame erweitert, und Sie wollen für die JFrame einen Verweis auf das Window Objekt zu übergeben, damit es mit dem JFrame interagieren kann. Sie können einen Verweis auf den JFrame übergeben, indem Sie seinen Verweis auf das Objekt übergeben, das "this" genannt wird.

21

Das Schlüsselwort this kann verschiedene Dinge in verschiedenen Kontexten bedeuten, das ist wahrscheinlich die Quelle Ihrer Verwirrung.

Es kann als eine Objektreferenz verwendet werden, die zu der Instanz aufgerufen wurde die aktuelle Methode bezieht: return this;

kann es als eine Objektreferenz verwendet werden, das die aktuelle Konstruktor zum Beispiel bezieht sich schafft, z.B. versteckte Felder zuzugreifen:

MyClass(String name) 
{ 
    this.name = name; 
} 

Es verwendet werden kann, einen anderen Konstruktor von aa Klasse aufrufen aus einem Konstruktor:

MyClass() 
{ 
    this("default name"); 
} 

Es verwendet werden kann, für den Zugriff auf Instanzen innerhalb einer geschachtelten Klasse umschließt:

public class MyClass 
{ 
    String name; 

    public class MyClass 
    { 
     String name; 

     public String getOuterName() 
     { 
      return MyClass.this.name; 
     } 
    } 
} 
+0

1 # Wird "this" nur benutzt und durch Konstruktor geschrieben? 2 # was ist mit 'this.setTittle (" Tittle of Fram ")'; Wie Sie sehen können, wird es verwendet, um Methode aufzurufen, aber ich habe seine Semantik nicht verstanden ?? – user2019510

+0

@ user2019510: Nein, es wird nicht nur in Konstruktoren verwendet; Meine Antwort enthält Beispiele für verschiedene Anwendungen. Und ja, es wird verwendet, um Methoden aufzurufen, in diesem Fall bedeutet es das aktuelle Objekt und funktioniert genauso wie jeder andere Objektverweis, um eine Methode aufzurufen. –

+0

danke für die freundliche Hilfe @Michael :) – user2019510

1

Es ist eine Referenz der tatsächlichen Instanz einer Klasse innerhalb einer Methode der gleichen Klasse. Codierung

public class A{ 
    int attr=10; 

    public int calc(){ 
    return this.getA()+10; 
    } 
    /** 
    *get and set 
    **/  

}//end class A 

In calc() Körper, läuft die Software ein Verfahren innerhalb des aktuell zugewiesenen Objekts.

Wie ist es möglich, dass das Verhalten des Objekts sich selbst sehen kann? Mit dem dieses Schlüsselwort genau.

Wirklich, das dieses Schlüsselwort erfordert keine obligatorische Verwendung (als Super), weil die JVM weiß, wo ein Verfahren im Bereich Speicher nennen, aber meiner Meinung nach dem Code readeable machen.

1

Es kann auch eine Möglichkeit sein, auf Informationen über den aktuellen Kontext zuzugreifen. Zum Beispiel:

public class OuterClass 
{ 
    public static void main(String[] args) 
    { 
    OuterClass oc = new OuterClass(); 
    } 

    OuterClass() 
    { 
    InnerClass ic = new InnerClass(this); 
    } 

    class InnerClass 
    { 
    InnerClass(OuterClass oc) 
    { 
     System.out.println("Enclosing class: " + oc + "/" + oc.getClass()); 
     System.out.println("This class: " + this + "/" + this.getClass()); 
     System.out.println("Parent of this class: " + this.getClass().getEnclosingClass()); 
     System.out.println("Other way to parent: " + OuterClass.this); 
    } 
    } 
} 
2

„this“ Schlüsselwort bezieht sich auf aktuelles Objekt aufgrund dem das Verfahren in Ausführung ist. Es wird auch verwendet, um Mehrdeutigkeiten zwischen lokalen Variablen zu vermeiden, die als Argument in einer Methode und Instanzvariable übergeben werden, wenn Instanzvariable und lokale Variable denselben Namen haben.

Beispiel ::

public class ThisDemo1 
{ 
    public static void main(String[] args) 
    { 
     A a1=new A(4,5);  
    } 
} 

class A 
{ 
    int num1; 
    int num2; 

    A(int num1) 
    { 
     this.num1=num1; //here "this" refers to instance variable num1. 
     //"this" avoids ambigutiy between local variable "num1" & instance variable "num1" 

     System.out.println("num1 :: "+(this.num1)); 
    } 

    A(int num, int num2) 
    { 
     this(num); //here "this" calls 1 argument constructor within the same class. 
     this.num2=num2; 
     System.out.println("num2 :: "+(this.num2)); 
     //Above line prints value of the instance variable num2. 
    } 
} 
0

Jedes Objekt einen Verweis auf sich selbst mit Stichwort Zugriff auf diese (manchmal die diese Referenz).

Zuerst lässt auf Code einen Blick

public class Employee { 

private int empId; 
private String name; 

public int getEmpId() { 
    return this.empId; 
} 

public String getName() { 
    return this.name; 
} 

public void setEmpId(int empId) { 
    this.empId = empId; 
} 

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

}

Bei dem obigen Verfahren getName() Instanz Variablennamen zurück. können nun noch einen Blick von ähnlichen Code nehmen ist

public class Employee { 

private int empId; 
private String name; 

public int getEmpId() { 
    return this.empId; 
} 

public String getName() { 

    String name="Yasir Shabbir"; 
    return name; 
} 

public void setEmpId(int empId) { 
    this.empId = empId; 
} 

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


public static void main(String []args){ 
    Employee e=new Employee(); 
    e.setName("Programmer of UOS"); 

    System.out.println(e.getName()); 

} 

}

Ausgabe Yasir Shabbir

  • dieser Operator immer mit Instanzvariablen arbeiten (Belong to Object) nicht jede Klasse Variable (gehört zur Klasse)
  • Dies bezieht sich immer auf Klasse nicht statische Attribut nicht anderer Parameter oder lokale Variable.
  • dies immer in nicht statische Methode
  • dieser Operator nicht auf statische Variable (Klasse variabel) arbeiten können

** Hinweis: ** Es ist oft ein logischer Fehler, wenn eine Methode einen Parameter oder eine lokale Variable enthält Das hat den gleichen Namen wie ein Feld der Klasse. Verwenden Sie in diesem Fall diesen Verweis, wenn Sie auf das Feld der Klasse zugreifen möchten. Andernfalls wird auf den Methodenparameter oder die lokale Variable verwiesen.

0

Was "das" tut, ist sehr einfach. Es enthält die Referenz des aktuellen Objekts .

  • Dieses Schlüsselwort enthält die Referenz der Instanz der aktuellen Klasse
  • Dieses Schlüsselwort kann nicht innerhalb statische Funktion oder statische Blöcke verwendet werden
  • Dieses Schlüsselwort verwendet werden können beschatteten Variable Instanz zugreifen
  • Dieses Schlüsselwort kann verwendet werden, um das aktuelle Objekt als Parameter in Funktionsaufrufen zu übergeben.
  • Dieses Schlüsselwort kann verwendet werden, um die Konstruktorkette
zu erstellen

Quelle: http://javaandme.com/core-java/this-word

Verwandte Themen