不是一个封闭的Java类

时间:2013-11-27 20:44:17

标签: java inner-classes

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

  

Shape is not an enclosing class

当我尝试创建对象时

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

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

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

我做错了什么?

10 个答案:

答案 0 :(得分:448)

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

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

我还可以制作任何字段finalstatic final

答案 1 :(得分:42)

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

示例:

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

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

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

答案 2 :(得分:15)

docs中所述:

    private bool AllowAnonymousAccess(HttpRequestMessage request)
    {
        IHttpControllerSelector selector = GlobalConfiguration.Configuration.Services.GetHttpControllerSelector();
        HttpControllerDescriptor descriptor = selector.SelectController(request);
        Type controllerType = descriptor.ControllerType;
        return controllerType.GetCustomAttribute<AllowAnonymousAttribute>(true) != null;
    }

答案 3 :(得分:10)

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

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

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

在父类中添加一个getter:

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

像这样访问它:

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

答案 4 :(得分:5)

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

答案 5 :(得分:1)

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

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;

答案 6 :(得分:1)

无需将嵌套类设为静态类,但必须是公共的

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

答案 7 :(得分:1)

如果父类是单身,请使用以下方式:

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

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

答案 8 :(得分:1)

在阅读已接受的答案时,我最初没有意识到的一件事是,将内部类静态化与将其移动到自己的单独类中基本相同。

因此,在收到错误时

  

xxx不是封闭类

您可以通过以下任一方式解决此问题:

  • static关键字添加到内部类,或
  • 将其移至自己独立的班级。

答案 9 :(得分:0)

要达到问题的要求,我们可以将类放入接口:

::ng-deep .mat-horizontal-stepper-header-container {
        display: none ;
      }

,然后以以前尝试的作者身份使用:

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

如果我们正在寻找合适的“逻辑”解决方案,则应使用public class Test { public static void main(String[] args) { Shape s = new Shapes.ZShape(); } } 设计模式