Ich habe den folgenden Code:
public class MyClass {
class Inner {
int s, e, p;
}
public static void main(String args[]) {
Inner in;
}
}
Bis zu diesem Teil ist der Code in Ordnung, aber ich bin nicht in der Lage, 'in' innerhalb der Hauptmethode zu instanziieren, wie in = new Inner()
es gezeigt wird non static field cannot be referenced in static context
.
Wie kann ich das machen? Ich möchte meine Inner
Klasse nicht statisch machen .
java
static
inner-classes
Victor Mukherjee
quelle
quelle
Antworten:
Sie müssen auch einen Verweis auf die andere äußere Klasse haben.
Wenn Inner statisch wäre, wäre es das auch
quelle
OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass()
. Verschachtelte KlassenEine "reguläre" innere Klasse hat einen versteckten (impliziten) Zeiger auf eine Instanz der äußeren Klasse. Auf diese Weise kann der Compiler den Code generieren, um den Zeiger für Sie zu verfolgen, ohne dass Sie ihn eingeben müssen. Wenn es beispielsweise eine Variable "a" in der äußeren Klasse gibt, kann der Code in Ihrer inneren Klasse nur "a = 0" ausführen, aber der Compiler generiert Code für "OuterPointer.a = 0", wobei der versteckte Zeiger unter beibehalten wird die Abdeckungen.
Das heißt, wenn Sie eine Instanz einer inneren Klasse erstellen, müssen Sie eine Instanz einer äußeren Klasse haben, mit der Sie sie verknüpfen können. Wenn Sie diese Erstellung innerhalb einer Methode der äußeren Klasse durchführen, kann der Compiler "this" als impliziten Zeiger verwenden. Wenn Sie eine Verknüpfung zu einer anderen äußeren Instanz herstellen möchten, verwenden Sie eine spezielle "neue" Syntax (siehe Codefragment unten).
Wenn Sie Ihre innere Klasse "statisch" machen, gibt es keinen versteckten Zeiger und Ihre innere Klasse kann nicht auf Mitglieder der äußeren Klasse verweisen. Eine statische innere Klasse ist identisch mit einer regulären Klasse, ihr Name ist jedoch innerhalb des übergeordneten Elements festgelegt.
Hier ist ein Codeausschnitt, der die Syntax zum Erstellen statischer und nicht statischer innerer Klassen demonstriert:
quelle
Wenn Sie
new Inner()
aus einer Methode heraus erstellen möchten , führen Sie dies aus einer Instanzmethode der Klasse ausMyClass
:quelle
Alexei Kaigorodovs ist die richtige Antwort. Mit seiner Lösung können Sie innere Klassen aus einer statischen Methode heraus instanziieren, z. B. aus main () derselben Klasse. Andernfalls können Sie eine innere Klasse innerhalb einer statischen Methode nicht instanziieren. Es wird nicht kompiliert. Die Lösung von Alexei wird kompiliert und ermöglicht es Ihnen, innere Klassen mithilfe einer statischen Methode zu instanziieren. Die anderen Antworten sind interessante Randnotizen, aber ich finde sie nicht als Antwort auf die eigentliche Frage.
quelle