创建内部类的实例如何工作?
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
。
【讨论】:
以上是关于创建内部类的实例如何工作?的主要内容,如果未能解决你的问题,请参考以下文章
在静态方法中new 一个内部类对象和new 一个外部类对象的区别