不是一个封闭的Java类

V S*_*ebi 347 java inner-classes

我正在尝试制作俄罗斯方块游戏而且我遇到了编译器错误

Shape is not an enclosing class

当我尝试创建一个对象时

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

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

public class Shapes {
    class AShape {
    }
    class ZShape {
    }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?

Pet*_*rey 476

ZShape 不是静态的,因此它需要外部类的实例.

最简单的解决方案是尽可能制作ZShape和任何嵌套类static.

我也会做任何领域finalstatic final你也可以.

  • @Cardano使它"静止"使它更容易,而不是更难. (17认同)
  • 使`ZShape``static`完全失败了他正在尝试做的目的,这实例化了一个'ZShape`的副本. (12认同)
  • 另一个简单的解决方案是使封闭类实例化内部类,即以这种方式获取ZShape:`ZShape myShape = new Shape().instantiateZShape();`.它暗示如果没有Shape,你得到的ZShape就不存在了,这就是这里的意图. (12认同)
  • 如果需要静态或实例,有两种情况。将其设置为静态将永远不会有帮助。 (2认同)
  • 这里的注释似乎表明人们不明白Java中的静态嵌套类是什么。使类静态并不意味着只有一个实例,它只是意味着“ZShape”不需要“Shapes”的实例存在。 (2认同)

小智 163

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

RetailerProfileModel.RetailerPaymentModel paymentModel
        = new RetailerProfileModel().new RetailerPaymentModel();
Run Code Online (Sandbox Code Playgroud)

  • 这个答案真的很有帮助,我从来不知道你可以连续两次打电话给新人(我已经用java做了8年多了!) (30认同)
  • 虽然这种语法非常复杂并且让我感到难过,但这应该是公认的答案。 (4认同)

Ami*_*yay 46

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

示例:

class Outer
{
    class Inner
    {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您可以执行以下操作:

Outer o = new Outer();
Outer.Inner obj = o.new Inner();
Run Code Online (Sandbox Code Playgroud)


小智 18

文档中所述:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();
Run Code Online (Sandbox Code Playgroud)


小智 10

有时,我们需要创建一个内部类的新实例,该实例不能是静态的,因为它依赖于父类的一些全局变量.在这种情况下,如果您尝试创建非静态的内部类的实例,not an enclosing class则会引发错误.

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

你怎么能创建新的实例ZShape?这是如何:

在父类中添加一个getter:

public ZShape getNewZShape() {
    return new ZShape();
}
Run Code Online (Sandbox Code Playgroud)

像这样访问它:

Shape ss = new Shape();
ZShape s = ss.getNewZShape();
Run Code Online (Sandbox Code Playgroud)


小智 6

Shape shape = new Shape();
Shape.ZShape zshape = shape.new ZShape();
Run Code Online (Sandbox Code Playgroud)