412 Stimmen

Ist keine umschließende Klasse Java

Ich versuche, ein Tetris-Spiel zu machen, und bekomme den Compiler-Fehler, wenn ich versuche, ein Objekt zu erstellen

Shape ist keine umschließende Klasse

public class Test {
    public static void main(String[] args) {
        Shape s = new Shapes.ZShape();
    }
}

Ich benutze innere Klassen für jede Form. Hier ist ein Teil meines Codes

public class Shapes {
    class AShape {
    }
    class ZShape {
    }
}

Was mache ich falsch?

527voto

Peter Lawrey Punkte 511323

ZShape ist nicht statisch, daher benötigt es eine Instanz der äußeren Klasse.

Die einfachste Lösung ist es, ZShape und jede verschachtelte Klasse static zu machen, wenn möglich.

Ich würde auch alle Felder als final oder static final deklarieren, wenn dies möglich ist.

225voto

Vishal Kumar Punkte 4131

Angenommen, RetailerProfileModel ist Ihre Hauptklasse und RetailerPaymentModel ist eine Innere Klasse darin. Sie können ein Objekt der inneren Klasse außerhalb der Klasse wie folgt erstellen:

RetailerProfileModel.RetailerPaymentModel paymentModel
        = new RetailerProfileModel().new RetailerPaymentModel();

58voto

Amit Upadhyay Punkte 6661

Was ich vorschlagen würde, ist es, die nicht-statische Klasse nicht in eine statische Klasse umzuwandeln, da in diesem Fall Ihre innere Klasse nicht auf die nicht-statischen Elemente der äußeren Klasse zugreifen kann.

Beispiel :

class Outer
{
    class Inner
    {
        //...
    }
}

Also können Sie in einem solchen Fall etwas Ähnliches tun:

Outer o = new Outer();
Outer.Inner obj = o.new Inner();

21voto

Brennan Miller Punkte 219

Wie in den Dokumenten angegeben:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

10voto

Manoj Bhakar PCM Punkte 187

Manchmal müssen wir eine neue Instanz einer inneren Klasse erstellen, die nicht statisch sein kann, weil sie von einigen globalen Variablen der Elternklasse abhängt. In dieser Situation wird beim Versuch, eine Instanz einer nicht statischen inneren Klasse zu erstellen, ein Fehler nicht umgebende Klasse ausgelöst.

Angenommen, im Beispiel der Frage kann ZShape nicht statisch sein, weil es die globalen Variablen der Klasse Shape benötigt?

Wie können Sie eine neue Instanz von ZShape erstellen? So geht's:

Fügen Sie einen Getter in der Elternklasse hinzu:

public ZShape getNewZShape() {
    return new ZShape();
}

Rufen Sie ihn wie folgt auf:

Shape ss = new Shape();
ZShape s = ss.getNewZShape();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X