2017-10-24 4 views
0

Ich habe eine äußeree Klasse und eine statische verschachtelte Klasse als.class-Datei der statischen geschachtelten Klasse beim Kompilieren Die äußere Klasse kann nicht über Assoziation verwendet werden, sondern kann über Vererbung verwendet werden. Warum?

class Outer { 
    static int x = 20; 
    static class Nested { 
    static void show() { 
     System.out.println(x); 
    } 
    } 
} 

auf dieses Programm kompiliert, habe ich zwei .class Dateien mit dem Namen bekommt: Outer.class und Outer $ Nested.class.

Jetzt ist meine Frage, ich versuche, die äußere $ Nested.class in meiner anderen Klasse Test1 (mit Zuordnung) zu verwenden.

Es gibt mir Kompilierzeit Fehler: kann nicht finden Outer $ Nested. Und ich weiß, dass wir statische verschachtelte Klasse direkt als Outer.Nested verwenden können, aber ich versuche es gerade. Aber wenn ich versuche, diese Klasse über Vererbung zu verwenden, dann kompiliert es und läuft gut.

class Temp2 extends Outer$Inner { 
    public static void main(String... args) { 
    show(); 
    } 
} 

Jetzt Kompilieren und Ausführen in Ordnung, Ausgang: 20

So ist meine Frage, warum es passiert, dass wir Outer $ Nested über Assoziation und Ereignis nicht in der Lage sind verwenden wir keine Variable deklarieren können, kann aber über Vererbung nutzen?

+0

Versuchen Sie es mit „Outer.Nested i = new Outer. Verschachtelt(); " –

+0

Ich weiß, wie verschachtelte Klasse zu instantiieren, aber ich frage nur, wie dies passiert, dass ich fragte –

+0

Ich finde nur heraus, dass wenn die Befehlszeile 'javac' anstelle von Eclipse zu kompilieren, der zweite Fall kompiliert werden kann. Für den ersten Fall, wenn Sie es in 'new Outer $ Nested(). Show();' ändern, kann es auch kompiliert und ausgeführt werden. Das ist komisch. Im Normalfall verwenden wir diesen Namen jedoch nicht in der Codierung. – Alex

Antwort

0

Ich wusste nicht, wie die Vererbung Konzepte wie Ihre Art und Weise funktioniert, wollen aber Instanz der inneren geschachtelten Klasse Verwendung zu erstellen, um diese Zeilen Code

public static void main(String[] args){ 
    Outer.Nested obj= new Outer.Nested(); 
    obj.show(); 
} 
+0

Ich weiß, wie man verschachtelte Klassen instanziiert, aber ich frage nur, wie das passiert. Warum dieses Verhalten von Java? –

+0

Es ist eine Möglichkeit zum logischen Gruppieren von Klassen, die nur an einem Ort verwendet werden, Es erhöht die Kapselung, Es kann zu besser lesbaren und wartbaren Code führen. Weitere Informationen und Verhalten von Java geschachtelt finden Sie unter https://docs.oracle .com/javase/tutorial/java/java00/nested.html – Lee

Verwandte Themen