Is geen omsluitende klasse Java

Ik probeer een Tetris-spel te maken en ik krijg de compilerfout

Shape is not an enclosing class

wanneer ik een object probeer te maken

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

Ik gebruik innerlijke klassen voor elke vorm. Hier is een deel van mijn code

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

Wat doe ik verkeerd?


Antwoord 1, autoriteit 100%

ZShapeis niet statisch, dus het vereist een instantie van de buitenste klasse.

De eenvoudigste oplossing is om ZShape en elke geneste klasse staticte maken als je kunt.

Ik zou ook alle velden finalof static finalmaken die jij ook kunt.


Antwoord 2, autoriteit 38%

Stel dat RetailerProfileModel uw hoofdklasse is en RetailerPaymentModel een innerlijke klasse daarbinnen. U kunt als volgt een object van de klasse Inner buiten de klasse maken:

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

Antwoord 3, autoriteit 10%

Wat ik zou willen voorstellen is om de niet-statische klasse niet te converteren naar een statische klasse, omdat in dat geval je innerlijke klasse geen toegang heeft tot de niet-statische leden van de buitenste klasse.

Voorbeeld:

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

Dus in dat geval kun je zoiets doen als:

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

4, Autoriteit 4%

Zoals vermeld in de docs :

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

5

Shape shape = new Shape();
Shape.ZShape zshape = shape.new ZShape();

6

Ik ben hetzelfde probleem tegengekomen.
Ik heb opgelost door een instantie te creëren voor elke innerlijke publieke klasse.
Wat betreft u Situatie, stel ik aan dat u ergens anders dan innerlijke klassen gebruikt.

public class Shape {
    private String shape;
    public ZShape zShpae;
    public SShape sShape;
    public Shape(){
      int[][] coords =  noShapeCoords;
      shape = "NoShape";
      zShape = new ZShape();
      sShape = new SShape();
    }
    class ZShape{
      int[][] coords =  zShapeCoords;
      String shape = "ZShape";
    }
    class SShape{
      int[][] coords = sShapeCoords;
      String shape = "SShape";
    }
 //etc
}

dan kunt u nieuwe vorm ();
en bezoek zshape door vorm.zshape;


7

Niet nodig om de geneste klasse zo statisch te maken, maar het moet openbaar zijn

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

8

Eén ding dat ik in het begin niet heb gewonnen tijdens het lezen van het geaccepteerde antwoord was dat het maken van een innerlijke klasse statisch in feite hetzelfde is als het verplaatsen naar zijn eigen afzonderlijke klasse.

Dus, bij het verkrijgen van de fout

xxx is geen closing class

U kunt het op een van de volgende manieren oplossen:

  • Voeg de statictrefwoord toe aan de binnenklasse of
  • Verplaats het naar zijn eigen afzonderlijke klasse.

9

Als als ouderklasse Singleton is, gebruik dan volgende manier:

Parent.Child childObject = (Parent.getInstance()).new Child();

waar getInstance()retourneert de bovenliggende Singleton-object.


10

Om de vereiste van de vraag te bereiken, kunnen we klassen in de interface plaatsen:

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

en gebruik vervolgens als auteur eerder geprobeerd:

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

Als we op zoek zijn naar de juiste “logische” oplossing, moeten worden gebruikt fabricontwerppatroon

Other episodes