Java 在实例上调用new,比如pc.new InnerClass()--发生了什么?

Java 在实例上调用new,比如pc.new InnerClass()--发生了什么?,java,syntax,Java,Syntax,我对在一个实例上调用new的可能性感到困惑,比如 InnerClass sc = pc.new InnerClass(); 我知道如何使用它,但我的问题是如何充分理解这一点。比如: JAVA文档中在哪里描述了它 这是应该使用的推荐解决方案,还是有更好的方法 为什么一个简单的“新的”不起作用 我在一个代码示例中看到了这一点,并且我已经充分了解到我无法在静态上下文中使用简单的“new” 以下是可运行示例的完整上下文: class ParentClass{ ParentClass(){

我对在一个实例上调用new的可能性感到困惑,比如

InnerClass sc = pc.new InnerClass();
我知道如何使用它,但我的问题是如何充分理解这一点。比如:

  • JAVA文档中在哪里描述了它

  • 这是应该使用的推荐解决方案,还是有更好的方法

  • 为什么一个简单的“新的”不起作用

我在一个代码示例中看到了这一点,并且我已经充分了解到我无法在静态上下文中使用简单的“new”

以下是可运行示例的完整上下文:

class ParentClass{
    ParentClass(){
    }
    public static void main(String[] args){
        ParentClass pc = new ParentClass();
        InnerClass sc = pc.new InnerClass();
    }
    class InnerClass {
        InnerClass() {
            System.out.println("I'm OK");
        }
    }
}免责声明:您在示例中使用的术语“父类”和“子类”不正确,因此我下面的示例将使用正确的术语“外部类”和“内部类”(感谢@eis的提示)


JAVA文档中在哪里描述了它

有关链接,请参见@eis对我答案的评论

这是应该使用的推荐解决方案,还是有更好的方法

这取决于你需要它做什么。 如果
子类
不需要
父类
实例的任何信息,则可以(而且应该)将其设置为静态的,或者将其提取为不再是内部类。在这种情况下,您只需在其上调用
new
,而无需使用
ParentClass
的实例

为什么一个简单的“新的”不起作用

因为
子类
可能引用周围实例的信息,这要求您指定该实例。它不是扩展父类的子类,而是它的类型成为外部类的成员

考虑这一点(并将其付诸实施):


如果您能够简单地执行
new InnerClass()
,就无法知道
getOuterClassField
应该返回什么,因为它连接到其周围类型的实例(而不仅仅是类型本身)。

@MarounMaroun这不是非法的。@MarounMaroun不,当然不是。我误解了这个问题,抱歉,内部类被视为外部类的成员。正如您所知,如何使用访问成员(变量和方法)。点运算符,以便可以访问内部类对象,如Parent.SubClass sub=new Parent().new SubClass();如果这些行在实例方法之外,则可以创建类似SubClass sub=new SubClass()的类@eis是对代码的最小编辑,以澄清它是关于内部类而不是继承/子类的。您应该注意术语。即使OP称它为子类,它也不是子类,它是一个内部类。例如,OP所问的第一点是关于这个主题的官方文档。非常快速的回答,在细节上非常合作。我需要一些时间来掌握这一切,但所有的细节都在那里!正确的关于内部类。子类是一个我不认识的令人困惑的细节。我会考虑重构这个问题。
public class OuterClass {
    private int field;

    public OuterClass(int field) {
        this.field = field;
    }

    class InnerClass {
        public int getOuterClassField() {
            // we can access the field from the surrounding type's instance!
            return OuterClass.this.field;
        }
    }

    public static void main(String[] args) throws Exception {
        OuterClass parent = new OuterClass(42);

        // prints '42'
        System.out.println(parent.new InnerClass().getOuterClassField());

        // cannot work as it makes no sense
        // System.out.println(new InnerClass().getOuterClassField());
    }
}