关键字“new”是如何工作的,尤其是当我启动静态嵌套类时? [复制]

Posted

技术标签:

【中文标题】关键字“new”是如何工作的,尤其是当我启动静态嵌套类时? [复制]【英文标题】:How the keyword 'new' works especially when I initiate static nested class? [duplicate] 【发布时间】:2015-11-21 12:00:29 【问题描述】:
public class NestedClassTest 
    public static void main(String[] args)
        OuterClass.NestedClass nestedObject = new OuterClass.NestedClass();
        nestedObject.printX();

        OuterClass outerObject = new OuterClass();
        //OuterClass.InnerClass innerObject = new outerObject.InnerClass(); //Error!
        OuterClass.InnerClass innerObject = outerObject.new InnerClass();
        innerObject.printY();

        //OuterClass.NestedClass objectOfNested2 = outerObject.new NestedClass(); //Error!
    


class OuterClass
    static int x = 10;
    int y = 100;

    static class NestedClass
        void printX()
        System.out.println(x);
        
    

    class InnerClass
        void printY()
            System.out.println(y);
        
    

我在处理嵌套类和内部类。困难的部分是当我尝试使用关键字new 启动内部类时。

我预计 new outerObject.InnerClass() 会像 new OuterClass.NestedClass() 做到了。它没有用,但只有outerObject.new InnerClass() 有效。对我来说,关键字new 出现在一个变量之后(在我的例子中是outerObject)看起来非常诡异和混乱。为什么会这样?这背后的逻辑是什么?

此外,outerObject.new NestedClass() 不起作用,这对我来说意味着更多的谜团。

请有人帮我详细了解关键字new 的工作原理。

【问题讨论】:

【参考方案1】:

内部类的实例属于外部类的特定实例(这就是它不同于静态嵌套类的原因)。你必须说 outerInstance.new InnerClass() 来告诉 Java 是哪个外部实例。

另一方面,静态类没有关联的外部实例,所以你通常只需用new指定类名(实际上你可以直接导入嵌套类,然后你可以直接说@ 987654323@).

【讨论】:

以上是关于关键字“new”是如何工作的,尤其是当我启动静态嵌套类时? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

线程的生命周期

如何避免 Qt 快捷方式歧义(尤其是当快捷方式有不同的上下文时)?

重新启动后应用程序重置

javapote如何实现方法调用

啃碎并发:Java线程的生命周期

new 运算符在 JavaScript 中是如何工作的?