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

Shape不是一个外围类

当我尝试创建一个对象时

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

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

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

我做错了什么?


当前回答

在阅读公认的答案时,我一开始没有意识到的一件事是,使内部类静态基本上与将它移动到它自己的单独类是一样的。

因此,当得到错误时

XXX不是一个外围类

你可以用以下两种方法来解决:

将static关键字添加到内部类或 将它移到单独的类中。

其他回答

如文件所述:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

如果父类是单例的,使用以下方法:

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

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

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

为了达到问题的要求,我们可以把类放到接口中:

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

然后使用作者之前尝试过的方法:

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

如果我们寻找合适的“逻辑”解决方案,应该采用面料图案设计

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

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

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

在父类中添加一个getter:

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

像这样访问它:

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