不是一个封闭类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
如果可以的话。
我也会让任何领域的final
或static 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;