java - ParentClass.NestedClass 是否 nc= new NestedClass();隐式实例化父类实例?

标签 java nested inner-classes

我有课本上的代码:

public class Question_3_4 {
  public static class Inner {
    private void doIt() {
      System.out.println("doIt()");
    }
  }
  public static void main(String[] args) {
    Question_3_4.Inner i = new Inner();
    i.doIt();
  }
}

好吧,内部类是静态的,所以我假设上面的代码隐式实例化了 Question_3_4 的实例?

Question_3_4.Inner i = new Question_3_4.Inner();

产生与上述代码相同的结果。

所以我认为

  Question_3_4.Inner i = new Question_3_4.Inner();   

  Question_3_4.Inner i = new Inner();

是同一件事。

如果我的假设是错误的,我在这里遗漏了什么?

最佳答案

首先,您没有使用正确的术语。

你没有声明一个内部类,而是一个静态嵌套类。

Terminology: Nested classes are divided into two categories: static and non-static. Nested classes that are declared static are called static nested classes. Non-static nested classes are called inner classes.

您可以获得有关术语以及如何以及为何在 Java Oracle Nested Classes tutorial 上使用嵌套类的可访问且有用的信息:

关于你的问题:

Well, Inner class is static, so I assume the above code implicitly instantiates Question_3_4's instance ?

你不需要实例化外部类来实例化一个嵌套类或者也可以说是一个static嵌套类。
此外,如果需要,编译器不会为您实例化外部类,而是会发出编译错误。

仅在内部类的情况下才需要实例化外部类(没有 static 嵌套类)。

例如,删除嵌套类的 static 修饰符,将根据需要为 Question_3_4.Inner i = new Inner(); 行产生编译错误有一个外部类的实例被实例化。

public class Question_3_4 {

     public class Inner {
             private void doIt() {
                     System.out.println("doIt()");
             }
     }
     public static void main(String[] args) {
             Question_3_4.Inner i = new Inner(); 
             ^--- error: non-static variable this cannot be referenced from a static context              
             i.doIt();
     }

}

关于java - ParentClass.NestedClass 是否 nc= new NestedClass();隐式实例化父类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45499143/

相关文章:

java - 如何重新提示允许用户继续转换值?

python在嵌套列表中找到最大的自由方 block

c# - 允许访问但阻止外部类实例化嵌套类

java - 为什么我不能在 Java 的内部类中创建枚举?

Java 空指针异常 - 堆栈跟踪 Null

java - 设计困境——背景还是契约? (Java/ Kotlin )

python - 从平面 csv 创建嵌套的 JSON

java - 为什么匿名类不能直接实现多个接口(interface)?仅仅是因为语法还是有其他原因?

java - 在 IntelliJ IDEA 中启用静态数据重新加载

javascript - 如何在AngularJS中观察对象内的对象