Ich habe folgenden Code:
class Hello {
class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
Ich weiß, Thing
macht nichts, aber mein Hello, World-Programm lässt sich ohne es gut kompilieren. Es sind nur meine definierten Klassen, die bei mir versagen.
Und es weigert sich zu kompilieren. Ich komme No enclosing instance of type Hello is accessible."
an die Linie, die eine neue Sache schafft. Ich vermute auch:
- Ich habe Probleme auf Systemebene (entweder in DrJava oder in meiner Java-Installation) oder
- Ich habe einige grundlegende Missverständnisse darüber, wie man ein Arbeitsprogramm in Java erstellt.
Irgendwelche Ideen?
java
inner-classes
coolpapa
quelle
quelle
Antworten:
static class Thing
wird Ihr Programm zum Laufen bringen.So wie es ist, haben Sie
Thing
eine innere Klasse, die (per Definition) einer bestimmten Instanz von zugeordnet istHello
(auch wenn sie diese nie verwendet oder darauf verweist), was bedeutet, dass es ein Fehler ist, zu sagen,new Thing();
ohne eine bestimmteHello
Instanz zu haben Umfang.Wenn Sie es stattdessen als statische Klasse deklarieren, handelt es sich um eine "verschachtelte" Klasse, für die keine bestimmte
Hello
Instanz erforderlich ist .quelle
outer class
, dasnon-static inner class
auch erstellt wird, selbst wenn ich es nirgendwo benutze?Sie haben die Klasse
Thing
als nicht statische innere Klasse deklariert . Das heißt, es muss einer Instanz derHello
Klasse zugeordnet sein.In Ihrem Code versuchen Sie, eine Instanz von
Thing
aus einem statischen Kontext zu erstellen . Darüber beschwert sich der Compiler.Es gibt einige mögliche Lösungen. Welche Lösung verwendet werden soll, hängt davon ab, was Sie erreichen möchten.
Verlasse
Thing
dieHello
Klasse.Ändern Sie
Thing
, um einestatic
verschachtelte Klasse zu sein.Erstellen Sie eine Instanz von,
Hello
bevor Sie eine Instanz von erstellenThing
.Die letzte Lösung (eine nicht statisch verschachtelte Klasse) wäre obligatorisch, wenn eine Instanz von
Thing
einer Instanz abhängtHello
, um sinnvoll zu sein. Zum Beispiel, wenn wir hätten:Jeder rohe Versuch, ein Klassenobjekt zu erstellen
Thing
, wie in:wäre problematisch, da es keinen offensichtlichen
enormous
Wert gäbe , 31 dagegen zu testen. Eine Instanzh
derHello
äußeren Klasse ist erforderlich, um diesenh.enormous
Wert bereitzustellen :Weil es nicht bedeutet,
Thing
wenn es kein hatHello
.Weitere Informationen zu verschachtelten / inneren Klassen: Verschachtelte Klassen (Die Java-Tutorials)
quelle
Thing thing1 <<HelloInstantiation>>.new Thing()
der Schlüssel. Ich war ein paar Minuten verwirrt mit der SyntaxThing thing1 new <<HelloInstantiation>>.Thing()
. = PNun ... so viele gute Antworten, aber ich möchte noch mehr hinzufügen. Ein kurzer Blick auf die innere Klasse in Java-Java ermöglicht es uns, eine Klasse innerhalb einer anderen Klasse zu definieren. Die Möglichkeit, Klassen auf diese Weise zu verschachteln, hat bestimmte Vorteile:
Es kann die Klasse vor anderen Klassen verbergen (es erhöht die Kapselung) - besonders relevant, wenn die Klasse nur von der Klasse verwendet wird, in der sie enthalten ist. In diesem Fall muss die Außenwelt nichts darüber wissen.
Dadurch kann Code besser gewartet werden, da die Klassen logisch dort gruppiert werden, wo sie benötigt werden.
Die innere Klasse hat Zugriff auf die Instanzvariablen und Methoden ihrer enthaltenden Klasse.
Wir haben hauptsächlich drei Arten von
Inner Classes
Einige der wichtigsten Punkte, an die Sie sich erinnern sollten
Versuchen wir, die obigen Konzepte praktisch zu sehen.
Ich hoffe, das wird allen helfen. Bitte beziehen Sie sich auf mehr
quelle
Thing
ist eine innere Klasse mit einer automatischen Verbindung zu einer Instanz vonHello
. Sie erhalten einen Kompilierungsfehler, da keine InstanzHello
zum Anhängen vorhanden ist. Sie können es am einfachsten beheben, indem Sie es in eine statisch verschachtelte Klasse ändern, die keine Verbindung hat:quelle
Verstehen wir es anhand des folgenden einfachen Beispiels. Dies geschieht, weil dies eine NICHT STATISCHE INNERE KLASSE ist. Sie sollten die Instanz der äußeren Klasse benötigen.
quelle