不是Java的外围类吗

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

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 {
}
}

我做错了什么?

368892 次浏览

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

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

我还将使任何字段finalstatic final,你也可以。

我也遇到过同样的问题。 我通过为每个内部公共类创建一个实例来解决这个问题。 至于你的情况,我建议你使用继承而不是内部类
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;

假设RetailerProfileModel是Main类,RetailerPaymentModel是Main类中的一个内部类。你可以在类外部创建一个Inner类的对象,如下所示:

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

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

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

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

例子:

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

所以,在这种情况下,你可以这样做:

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

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

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

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

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

因此,当得到错误时

XXX不是一个外围类

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

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

文档中所述:

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

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

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

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

在父类中添加一个getter:

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

像这样访问它:

Shape ss = new Shape();
ZShape s = ss.getNewZShape();
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();
}
}

如果我们寻找合适的“逻辑”解决方案,应该使用fabric设计模式

如果有人有这个问题,试图实例化第三方组件。

在我的情况下,做一个单元测试使用这个组件:ChannelSftp。LsEntry

做通常的实例化给我的问题: enter image description here < / p >

解决方案是:

    ChannelSftp channelSftp =  new ChannelSftp();
Constructor<ChannelSftp.LsEntry> constructor = (Constructor<ChannelSftp.LsEntry>) ChannelSftp.LsEntry.class.getDeclaredConstructors()[0];
constructor.setAccessible(true);
ChannelSftp.LsEntry lsEntry = constructor.newInstance(channelSftp, "file1.txt", null);

我找到了原始代码在这里