2016-05-16 19 views
0

Wir sagen, dass verschachtelte Klassen sind Mitglieder der einschließenden Klasse.Hat jede Instanz einer einschließenden Klasse eine eigene Kopie einer internen/nicht-statischen Klasse?

Bedeutet dies, dass jede Instanz der umgebenden Klasse seine eigene Kopie hat ein (n) Innen/nicht-statische verschachtelte Klasse, genau wie jede Instanz einer Klasse eine eigene Kopie einer nicht-statischen/Instanzmethode?


Meine Frage ist nicht ein Duplikat des question in dem Banner über meine Frage verknüpft.

Diese Frage diskutiert, ob eine innere Klasse automatisch einen Verweis auf die umschließende Klasse behält (auch wenn die Referenz nie verwendet wird).

Meine Frage ist, dass da alle Instanzen einer Klasse ihre eigenen Kopien aller Felder nicht statischen Mitglieds (und Methoden - ich Methoden nicht sicher bin) - im Gegensatz zu dem statischen Elementen, die nur eine Kopie haben, die verfügbar ist zu allen Instanzen der Klasse; und da wir sagen, dass verschachtelte Klassen sind Mitglieder von einschließenden Klassen, und dann innere Klassen würden nonstatic/instance-Mitglieder der umschließenden Klassen werden, richtig?

Also kann man schlussfolgern, dass jede Instanz der umschließenden Klasse ihre Kopie jeder inneren Klasse hat?

Ich finde nicht einmal die beiden Fragen ähnlich, geschweige denn Duplikate. Ich frage mich wirklich ernsthaft, welcher Teil meiner Frage sich auf eine innere Klasse bezieht, die einen Verweis auf die umschließende Klasse enthält.

Meine Frage wurde in der angenommenen Antwort tadellos genau beantwortet.

+3

warum nicht einfach ausprobieren? – Turing85

+1

"genau wie jede Instanz einer Klasse eine eigene Kopie einer nicht statischen/Instanz-Methode hat?" aber sie tun es nicht. – Kayaman

+1

Eine [single] einschließende Klasse kann * multiple * innere Klassen haben: was könnten diese Multiplizitäten implizieren? – user2864740

Antwort

3

Ich habe ein kleines Beispiel aus der Beschreibung erstellt, die Sie angegeben haben. Bitte korrigiere mich, wenn ich dich nicht richtig verstanden habe, aber das habe ich aus deiner Beschreibung gelesen.

public class Outer { 
    class Inner { 

    } 

    public Inner inner = new Inner(); 

    public static void main(String... args) { 
     Outer o1 = new Outer(); 
     Outer o2 = new Outer(); 

     System.out.println(o1.inner == o2.inner); 
     System.out.println(o1.inner.getClass() == o2.inner.getClass()); 
    } 

} 

Wenn Sie das Programm ausführen, können Sie sehen, dass die Fälle von Inner nicht gleich sind, aber die Klassen der inneren Instanzen sind. Hoffentlich beantwortet das deine Frage.

+0

Daraus kann ich schließen, dass die _inner-class_ für jede Instanz einer einschließenden Klasse immer gleich ist; aber jede Instanz einer einschließenden Klasse hat ihre eigene Kopie von jeder Instanz ihrer inneren Klasse - ist das richtig? – Solace

+1

Ja, das ist richtig. – Turing85

+0

Vielen Dank, und Sie hatten Recht, als Sie sagten, "warum nicht einfach ausprobieren" (deshalb habe ich den Kommentar upvoted), aber es kam mir einfach nicht vor, es so zu überprüfen. Ich habe noch nichts über Reflektion gelernt (getClass()). – Solace

0

Bedeutet dies, dass jede Instanz der umgebenden Klasse eines (n) Innen/nicht-statische verschachtelte Klasse,

Jede Instanz der umgebenden Klasse von Null seine eigene Kopie hat Bezug genommen werden kann oder mehr Instanzen einer inneren Klasse.

Jede Instanz einer inneren Klasse hat eine implizite Referenz auf genau eine Instanz der einschließenden Klasse. Eine innere Klasse ist übrigens eine verschachtelte Klasse, die nicht als statisch deklariert wird. "Innere Klasse" umfasst sowohl anonyme als auch nicht-statische verschachtelte Klassen.

+0

@vaxquis - Es war eine gültige Kritik an meiner früheren loser Sprache. Eine äußere Instanz verbindet sich nicht implizit mit einer inneren Instanz. Die Verwendung des Verbs "hat" bedeutet "ist referenziert von" ist ein bisschen eine Strecke. –

+0

@AndyThomas Es * ist * eine Strecke, wahr. Trotzdem sind sie im Referenzgraphen (GC etc.) implizit verbunden, aber natürlich stimme ich zu, dass man nicht einfach alle inneren Instanzen [ohne schwere VM-Magie] bekommen kann (http://docs.oracle.com/javase/ 1.5.0/docs/guide/jvmti/jvmti.html # IterateOverInstancesOfClass) oder ohne explizite Nachverfolgung. – vaxquis

Verwandte Themen