如何解决“需要包含 X.Y 的封闭实例”问题?

40

我正在使用Netbeans开发一个小型桌面应用程序。这是我的第一个程序,我遇到了一种非常奇怪的错误。我知道我做错了什么,但无法追踪出我做错了什么 :(

请帮助我解决这个错误。

描述: 我有一个默认的包 Src ,并根据需要在此包中创建新的Java类。除其他类之外,我制作了一个像这样的类 X

public class X
{
    public class Y
    {//some member functions and variables exist here}

    public class Z
    {//some member functions and variables exist here}

    //some member functions and variables exist here
}

现在我需要在同一 package 中的另一个类中创建一个内部类的实例,就像这样:

public X.Y oY = new X.Y();

但我遇到了如下错误:

需要包含X.Y的封闭实例

请帮助我解决这个错误。


可能是重复的问题:需要包含<我的引用>的封闭实例 - Joshua Taylor
3个回答

85

首先,您需要创建一个X类(外部类)的对象,然后使用objX.new InnerClass()的语法来创建Y类的对象。

尝试一下:

X x=new X();
X.Y y=x.new Y();

8
哇!今天我学到了东西!奇怪的语法,非常好!+1 - Martijn Courteaux
2
有人知道为什么他们以这种方式设计了这门语言吗?这样做有什么目的? - wonton
抱歉回复晚了,我认为这是为了支持静态嵌套类和非静态嵌套类。虽然我不是专家,但从我所阅读的内容来看,我认为这是为了强制子类成为父类实例的成员(非静态),并为不需要父类的子类创建不同的语法(静态)。https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html - joelc

36

您想声明静态内部类:public static class Y


2
因为OP没有提到它需要保持非静态。如果他需要封闭实例,他会在评论中提到编译器错误,并从他的问题中获得更多的知识。 - Philipp Reichart
2
+1 对于这个答案 - 被接受的答案并不完全正确,因为它假设类是从非静态上下文中需要的。在我的情况下,这并不是真的。 - devrobf

10

将Y声明为静态的,以避免创建X的实例。

public class X
{
    public static class Y {
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接