不是一个封闭类Java

我试图做一个俄罗斯方块游戏,当我尝试创build一个对象时,我得到“形状不是一个封闭的类”

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

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

 public class Shape { private String shape; private int[][] coords; private int[][] noShapeCoords = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; private int[][] zShapeCoords = { { 0, -1 }, { 0, 0 }, { -1, 0 }, { -1, 1 } }; private int[][] sShapeCoords = { { 0, -1 }, { 0, 0 }, { 1, 0 }, { 1, 1 } }; private int[][] lineShapeCoords = { { 0, -1 }, { 0, 0 }, { 0, 1 }, { 0, 2 } }; private int[][] tShapeCoords = { { -1, 0 }, { 0, 0 }, { 1, 0 }, { 0, 1 } }; private int[][] squareShapeCoords = { { 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 } }; private int[][] lShapeCoords = { { -1, -1 }, { 0, -1 }, { 0, 0 }, { 0, 1 } }; private int[][] mirroredLShapeCoords = { { 1, -1 }, { 0, -1 }, { 0, 0 }, { 0, 1 } }; public Shape(){ int[][] coords = noShapeCoords; shape = "NoShape"; } class ZShape { int[][] coords = zShapeCoords; String shape = "ZShape"; } class SShape { int[][] coords = sShapeCoords; String shape = "SShape"; } //etc } 

我究竟做错了什么 ?

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

最简单的解决scheme是使ZShape和任何嵌套的类static如果可以的话。

我也会让任何领域的finalstatic final ,你也可以。

假设RetailerProfileModel是您的Main类,RetailerPaymentModel是其中的内部类。 您可以在类之外创buildInner类的对象,如下所示:

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

我会build议不是将非静态类转换为静态类,因为在这种情况下,您的内部类不能访问外部类的非静态成员。

例如:

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

所以,在这种情况下,你可以做一些事情:

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

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

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

如果父类是单例使用以下方式:

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

getInstance()将返回父类的单例对象。

有一件事我在开始阅读被接受的答案的时候并没有意识到,静态内部类与把它移动到自己的类中基本是一样的。

因此,当得到错误

xxx不是封闭类

您可以通过以下任何一种方式解决它:

  • static关键字添加到内部类或
  • 把它移到它自己的单独的类。

我遇到了同样的问题。 我通过为每个内部公共类创build一个实例来解决问题。 至于你的情况,我build议你使用除了内部类以外的inheritance。

 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 } 

那么你可以新buildShape(); 并通过shape.zShape访问ZShape;