2014-03-07 35 views
12

Ich bin derzeit lesen ein Java-Tutorial von Oracle in der inneren Klasse Abschnitt.Dieses Schlüsselwort in Java

verweisen auf this link

Es gibt einige Code ist, dass ich im Tutorial nicht verstehen.

Kann mir bitte jemand erklären, wie dieser Code unten in der DataStructure Klasse funktioniert?

DataStructureIterator iterator = this.new EvenIterator(); 

Sollte die äußere Klasse nicht vor DataStructureIterator iterator und this.new EvenIterator() wie unten:

DataStructure.DataStructureIterator iterator = DataStructure.this.new EvenIterator(); 

ich für eine Weile gesucht haben, aber ich habe keine Antwort gefunden.

+1

@ Ɍ.Ɉ: Ich bin mir nicht sicher, ob ich das noch kaufe ... ja, es benutzt 'das', aber es benutzt es auf unkonventionelle Weise. Ich habe nicht einmal gemerkt, dass du das mit "diesem" tun kannst. – Makoto

+0

Wo ist der Code, der diese Zeile ausführt? 'this' ist die umschließende Instanz, die für die Erstellung einer inneren Klasseninstanz benötigt wird. –

+8

Wow, wie lange haben Sie gebraucht, um das gesamte Internet zu durchsuchen? Musstest du es zuerst auf eine Diskette herunterladen? –

Antwort

6

Die Deklaration DataStructure.DataStructureIterator iterator = DataStructure.this.new EvenIterator(); ist gültig, aber im Kontext dieser Methode redundant.

Betrachten Sie dieses Szenario, wo es widersprüchliche innere Klassen

public void printEven() { 
    Thread t = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      //Makes EvenIterator point to DataStructure's implementation 
      DataStructureIterator itr = DataStructure.this.new EvenIterator(); 
     } 

     class EvenIterator implements DataStructureIterator { 

      @Override 
      public boolean hasNext() { 
       return false; 
      } 

      @Override 
      public Integer next() { 
       return null; 
      } 

      @Override 
      public void remove() { 
      } 

     } 
    }); 
} 

Wie Sie die anonyme Klasse sehen Runnable innere Klasse hat EvenIterator genannt (die gleichen Namen wie Outer Klasse Innenklasse). So schreibt nur

DataStructureIterator itr = this.new EvenIterator(); //OR DataStructureIterator itr = new EvenIterator(); 

zu Runnable ‚s EvenIterator beziehen. Punkt auf DataStructure ‚s EvenIterator, möchten Sie vielleicht

DataStructureIterator itr = DataStructure.this.new EvenIterator(); 

schreiben, die sagt, ich will EvenIterator zu erstellenden auf aktuellen Instanz von DataStructure, nicht aktuelle Instanz von Runnable

1
public class DataStructure { 
    /** omitted */ 

    public void printEven() { 
     //#1 
     DataStructureIterator iterator = this.new EvenIterator(); 
     /** Omitted */ 
    } 

    //#2 
    private class EvenIterator implements DataStructureIterator { 
     /** Omitted */ 
    } 
} 

Das ist also das Problem mit den Knochen.

Mal sehen, was wir haben:

  1. Eine Klasse DataStructure, die eine nicht-statische Methode printEven hat. Das Schlüsselwort this in dieser Klasse wird immer repräsentieren die aktuelle Instanz/Objekt dieser Klasse: DataStructure.

  2. Eine innere Klasse, die privat ist. Dies bedeutet, dass diese Klasse außerhalb nicht sichtbar ist. Es ist nicht statisch, was bedeutet, dass Sie eine Instanz der äußeren Klasse benötigen, um dieses Klassenmitglied (auch innere Klasse genannt) instanziieren zu können.

So wollen wir eine Instanz von EvenIterator schaffen, werden wir eine brauchen. eine Instanz der äußeren Klasse, b. rufe einen Konstruktor der inneren Klasse auf.

DataStructureIterator iterator = this.new EvenIterator(); 
            |  `---- Call to constructor 
            `-------------- instance of outer class 

DataStructure.this in DataStructure zu tun, ist überflüssig.Weil wir wissen, dass wir im Bereich DataStructure sind, so wird nur this tun. Wenn Sie jedoch in der inneren Klasse EvenIterator sind und explizit auf die Instanz der äußeren Klasse zugreifen möchten, müssen Sie DataStructure.this ausführen, da in der inneren Klasse this die Instanz EvenIterator bedeutet.

1

Das Schlüsselwort this ist tatsächlich in der äußeren Klasse geschrieben, nicht die innere Klasse, in Ihrem konkreten Beispiel. Daher ist es in keiner Weise mehrdeutig - es kann nur auf die DataStructure Instanz verweisen. Es ist daher unnötig (aber legal), es in diesem Fall als DataStructure.this zu qualifizieren. Wenn Sie innerhalb der inneren Klasse this verwendet haben und Sie sich auf die DataStructure Instanz beziehen wollten, müssten Sie DataStructure.this schreiben.

Nach dem Java Language Specification 15.8.3 -

Der Typ dieser ist die Klasse C, in dem das Schlüsselwort dies geschieht.

2

"das Schlüsselwort" auf den Umfang einer Objektklasse beziehen sich so:

public class Test { 
    public void method1(){ 
     this. //this in here refer to "Test" class 
    } 

    public class InnerTest { 
     public void method2(){ 
      this. //this in here refer to "InnerTest" class 
     } 
    } 
} 

nun einen Blick auf "diesem Begriff" nehmen in diesem Beispiel:

public class Test { 
    public void method1(){ 

     InnerTest innerTest = this.new InnerTest(); //within the scope of Test class, there's a inner class call InnerTest. create an instance of it ! 
     //OR 
     TestInterface innerTest2 = this.new InnerTest(); //within the scope of Test class, there's a inner class call InnerTest. create an instance of it ! 
    } 

    public class InnerTest implements TestInterface{ 
     public void method2(){ 
      Test.this.method1(); //within the scope of "Test" class call the method method1 
     } 
    } 
} 

beachten Sie, dass Sie können dieses Schlüsselwort auch verwenden, um den Konstruktor einer Klasse zu verketten. werfen Sie einen Blick auf dieses Beispiel:

public class Test { 

    public Test() { 
     this(0); 
    } 

    public Test(int r) { 
     // Do Something Here 
    } 
} 

Fazit:

Keyword „this“ wirkt wie ein Zeiger auf den Umfang einer Klasse und mit „this“ Sie zu einer bestimmten Klasse zeigen kann und mach was du willst.

Sie können auch "dieses" Schlüsselwort zu Kettenklasse Konstruktoren auch verwenden!

Verwandte Themen