Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不是一个封闭类Java_Java_Inner Classes - Fatal编程技术网

不是一个封闭类Java

不是一个封闭类Java,java,inner-classes,Java,Inner Classes,我正在尝试制作一个俄罗斯方块游戏,我得到了编译器错误 形状不是封闭类 当我尝试创建一个对象时 public class Test { public static void main(String[] args) { Shape s = new Shapes.ZShape(); } } 我对每个形状使用内部类。这是我的部分代码 public class Shapes { class AShape { } class ZShape {

我正在尝试制作一个俄罗斯方块游戏,我得到了编译器错误

形状不是封闭类

当我尝试创建一个对象时

public class Test {
    public static void main(String[] args) {
        Shape s = new Shapes.ZShape();
    }
}
我对每个形状使用内部类。这是我的部分代码

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

我做错了什么?

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

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


我还可以将任何字段设置为
final
静态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.ZShape访问ZShape

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

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();

如果父类是singleton,请使用以下方法:

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

其中,
getInstance()
将返回父类singleton对象。

在阅读接受的答案时,我最初没有意识到,使内部类成为静态与将其移动到自己的单独类基本相同

因此,当得到错误时

xxx不是一个封闭类

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

  • static
    关键字添加到内部类,或
  • 将其移出到自己的单独类中
如以下文件所述:


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

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

如何创建
ZShape
的新实例?这就是为什么:

在父类中添加一个getter:

public ZShape getNewZShape() {
    return new ZShape();
}
按如下方式访问它:

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

为了满足问题的要求,我们可以将类放入接口:

public interface Shapes {
    class AShape{
    }
    class ZShape{
    }
}
然后按作者之前尝试的方式使用:

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


如果我们在寻找合适的“逻辑”解决方案,应该使用
fabric
design pattern

new Shape().new ZShape()。类
ZShape
需要实例化一个封闭实例。将内部类移动到单独的file@Dimmduh在这种情况下,注释应该是答案。它们不应该是内部类。移动它们可以识别存在的Shape类的其他问题。这里不回答这个问题,但我可以建议在这里使用继承,其中
AShape
ZShape
扩展基类
Shapes
。嵌套类对于这个问题不是一个很好的设计。使
ZShape
static
完全违背了他试图做的事情的目的,即实例化
ZShape
@Cardano的副本,使之变得
static
更容易,不难。另一个简单的解决方案是使封闭类实例化内部类,即通过以下方式获取ZShape:
ZShape myShape=new Shape().instantiationezShape()。这意味着你得到的ZShape没有形状是不存在的,这就是本文的目的。@Peter Lawrey你是如何意识到所有形状实例都必须使用相同的ZShape的?我不是从他的来源得到的。如果我们想要静态或实例,有两种情况。将其设为静态并不总是有帮助的。这个答案真的很有用,我从来不知道你可以连续调用new两次(我已经使用java 8年多了!)你当然可以调用new操作符任意次数,直到你不想保留该对象的引用为止。如果用这种方式创建内部类的对象,它是如何访问外部类的成员的?在内部类本身中,你可以使用OuterClass。这个。我认为没有办法从内部类的代码外部获取实例。当然,您始终可以引入自己的属性:public OuterClass getOuter(){return OuterClass.this;}适用于测试:
underTest=Mockito.mock(Outer.class).new innernnonstaticclass()错误的解决方案。逻辑错误。如果内部类(例如ZShape)需要设置任何字段,则必须在外部类的构造函数中获取该字段!公共形状(String field1_innerClass,int field2_innerClass…{zShape=new zShape(String field1_innerClass,int field2_innerClass…}}}关于Outer.Inner obj=(new Outer).new Inner()呢@Hussainkmrbeheste,不,那肯定不行。但是,这将起作用
Outer.Inner obj=new Outer().new Inner()但是阿米特,它对我有用。如果你能解释为什么它不应该工作,我会很高兴。@HussainKMRBehestee,解释:我只能猜测Java语法说,要实例化一个类,我们需要调用构造函数,而调用构造函数
()
是必须的。但是,C,C++不是必须的。这是一个不起作用的例子。而且,我发现了这个。这将进一步解释Java中的语法以及它们是如何被解析的。我很想看到一个示例,当这个语法对您有效时。哦,我的错,它是一个输入错误,Outer.Inner obj=(new Outer()).new Inner();希望这次没问题,谢谢你注意到。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。仅链接answ
public interface Shapes {
    class AShape{
    }
    class ZShape{
    }
}
public class Test {
    public static void main(String[] args) {
        Shape s = new Shapes.ZShape();
    }
}