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.
我也会做任何领域final或static final你也可以.
小智 163
假设RetailerProfileModel是您的Main类,RetailerPaymentModel是其中的内部类.您可以在类外创建Inner类的对象,如下所示:
RetailerProfileModel.RetailerPaymentModel paymentModel
= new RetailerProfileModel().new RetailerPaymentModel();
Run Code Online (Sandbox Code Playgroud)
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)