2011-10-01 491 views
31

我正在Netbeans中开发一个小型桌面应用程序。这是我的第一个程序,我面临着一个非常奇怪的错误类型。我知道我做了一些事情不对,但无法追踪我在做什么错:(如何解决“需要包含X.Y的封闭实例”?

请帮我解决这个错误

描述: 我有一个默认的包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 
} 

现在我需要在存在于同一个包中的一些其他类来创建内部类的一个实例,像这样:

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

,但我收到以下错误:

an enclosing instance that contains X.Y is required

请帮我解决这个错误。

+0

可能重复的[包含一个外围实例<我的参考>需要](HTTP:/ /stackoverflow.com/questions/4297857/an-enclosing-instance-that-c​​ontains-my-reference-is-required) –

回答

68

首先你必须创建一个X类的对象(外部类),然后用语法来创建一个Y类的对象。

尝试,

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

哇!我今天倾斜了一些东西!奇怪的语法。非常好! +1 –

+1

有人知道他们为什么用这种方式制造这种语言吗?这有什么用途? – wonton

+0

对不起,在这里的延迟响应,我相信它能够支持静态嵌套类和非静态嵌套类。我不是专家,但从我正在阅读的内容来看,我相信这是强制下级类成为父级实例的成员(非静态),并为不需要的下级类创建不同的语法父母(静态)。 https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html – joelc

31

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

+0

为什么? – Mahesh

+2

因为OP没有提到它需要保持非静态。如果他需要封闭的实例,他会对编译器的错误发表评论,将其变为静态,并从他的问题中进一步学习。 –

+2

对此答案+1 - 接受的答案并不完全完整,因为它假设该类是从非静态上下文中要求的。就我而言,这是不正确的。 – jazzbassrob

7

声明ý为静态,以避免X的创建实例

public class X 
{ 
    public static class Y { 
    } 
}