2017-04-02 1 views
2

Ich habe meine Antwort in den Fragen, die ich gesucht habe, nicht gefunden, darum frage ich sie.Nicht in der Lage, die Logik des Teils rechts vom Zuweisungsoperator zu verstehen, wenn Objekt der inneren Klasse erstellt wird

class outer 
{ 
class inner // non static . 
{ 
} 
} 

For creating object of inner class I am unable to understand the logic of the part to the right of assignment operator . 

outer o = new outer() ; 
outer.inner y = o. new inner() ; // I have doubt in this line . 

Hier ist äußere.inner der Rückgabetyp aber was ist mit dem richtigen Teil?

Ich weiß: Wir können nicht schreiben äußere.inner y = new outer.inner(); da inner ist nicht statisch.

+1

Bitte beachten Sie die Java-Namenskonventionen. –

+0

Versucht, dass vorherige Forschungssache? – GhostCat

Antwort

0
outer o = new outer() ; 
outer.inner y = o. new inner() ; 

So ist der erste Teil outer.inner der Rückgabetyp, wie Sie gesagt haben.

Zweitens ist die o eine Referenz auf das äußere Objekt, das das innere Objekt enthält. Sie werden nur auf das innere Objekt zugreifen, wenn Sie einen Verweis auf das äußere Objekt haben. jetzt o. new inner() ; sagt einfach "gehen Sie in das Objekt o, dann erstellen Sie ein Objekt des Typs inner".

-1

Das Problem ist, dass eine nicht-static innere Klasse an eine bestimmte Instanz der enthaltenden Klasse gebunden ist. Es ist wie, wenn die Klassendefinition hat ein verstecktes Referenzelement, Art:

class Outer { 
    class Inner { 
    private final Outer outer; 
    Inner(Outer outer) { this.outer = outer; } 
    } 
} 

Das ist, was outer.inner y = o.new inner() geschieht, da inner ist nicht static es ein outer erfordert instanziiert werden und dass Syntax verwendet wird, die versteckt passierte outer Referenz auf die Instanz.

Wenn Innerstatic wird, dann wird keine qualifizierende Instanz mehr benötigt, der Name der äußeren Klasse ist ausreichend, zB: new Outer.Inner().

+0

Wenn "Inner" "statisch" wäre, wäre es keine innere Klasse und somit wäre der Klassenname hoffnungslos verwirrend. –

+0

@LewBloch: das ist nur Terminologie, es wäre stattdessen eine geschachtelte Klasse, aber das ist nur ein Sophismus. Ich weiß nicht, warum sie intern von verschachtelt trennen mussten, wenn das static-Schlüsselwort das bereits tut. – Jack

+1

Unabhängig von Ihrer persönlichen Meinung oder den Pejorativen, die Sie anwenden, ist die Tatsache (!), Dass eine innere Klasse in Java eine verschachtelte Klasse ist, die nicht "statisch" ist. Das ist kein "Sophismus", das ist die Java Language Specification. Ich rate Ihnen, über Ihre Meinung, @Jack, hinwegzukommen und mit den Fakten umzugehen. –

Verwandte Themen