创建内部类的实例如何工作?

Posted

技术标签:

【中文标题】创建内部类的实例如何工作?【英文标题】:How creation an instance of inner class works? 【发布时间】:2019-06-20 07:17:04 【问题描述】:

当我创建内部类的实例时,我使用了这段代码。

OuterClass outerClass = new OuterClass();
OuterClass.InnerClass inerClass = outerClass.new InnerClass();

但我不明白outerClass.new InnerClass() 是如何工作的,为什么我们使用.new 就像新的内部类一样,我知道不是,但我不明白语法。

【问题讨论】:

这可能对Strange syntax for instantiating an inner class有帮助 内部类的实例隐式引用其所有者类实例。如果你只是使用new OuterClass.InnerClass(),编译器怎么知道将哪个外部类实例传递给内部类实例?因此,Java 设计者必须决定一种语法,允许在新建内部类时指定外部类实例,这就是他们选择的语法。您在实践中很少使用该语法,因为内部实例通常是从外部类的方法/构造函数创建的。 查看这个 oracle 文档,你会得到清晰的概念。 (docs.oracle.com/javase/tutorial/java/javaOO/nested.html) 【参考方案1】:

内部类是 POJO。因此,当您查看目标目录时,您会看到 2(两个)类文件。 因此,要创建 内部类 的实例,请使用 new。

OuterClass outerClass = new OuterClass();  // create instance
OuterClass.InnerClass inerClass = outerClass.new InnerClass();  // innerClass has `this` to outerClass instance

这意味着InnerClass 不是静态的(即this 引用了OuterClass 的对象)并且应该在它之前创建OuterClass 的实例。

OuterClass.InnerClass inerClass = new OuterClass.InnerClass();

这意味着InnerClass 是一个静态的(即没有this 引用Outerlass 的对象),这意味着,这绝对是相同的(从JVM 的角度来看)就像两个单独的文件与@987654330 @ 和class InnterClass

【讨论】:

以上是关于创建内部类的实例如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

成员内部类

java内部类可以访问外部类的静态方法吗

内部类

在静态方法中new 一个内部类对象和new 一个外部类对象的区别

内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

Java入土---常用类