我试图做一个俄罗斯方块游戏,我得到了编译器错误

Shape不是一个外围类

当我尝试创建一个对象时

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

我为每个形状使用内部类。这是我的部分代码

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

我做错了什么?


当前回答

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

其他回答

不需要将嵌套类设置为静态的,但它必须是公共的

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

假设RetailerProfileModel是Main类,RetailerPaymentModel是Main类中的一个内部类。你可以在类外部创建一个Inner类的对象,如下所示:

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

我也遇到过同样的问题。 我通过为每个内部公共类创建一个实例来解决这个问题。 至于你的情况,我建议你使用继承而不是内部类。

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
}

然后你可以新建Shape(); 通过shape.zShape访问ZShape;

ZShape不是静态的,所以它需要一个外部类的实例。

最简单的解决方案是使ZShape和任何嵌套类都是静态的。

我也会将任何字段设置为final或static final。

有时,我们需要创建一个内部类的新实例,它不能是静态的,因为它依赖于父类的一些全局变量。在这种情况下,如果您试图创建非静态的内部类的实例,则会抛出一个非封闭类错误。

以问题为例,如果ZShape不能是静态的,因为它需要Shape类的全局变量怎么办?

如何创建ZShape的新实例?是这样的:

在父类中添加一个getter:

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

像这样访问它:

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