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

时间:2017-08-04 05:52:25

标签: 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();
  }
}

嗯,Inner类是静态的,所以我假设上面的代码隐式实例化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();

是一回事。

如果我的假设错了,我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

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

您没有声明内部类,而是声明静态嵌套类。

  

术语:嵌套类分为两类:静态   和非静态的。调用声明为static的嵌套类   静态嵌套类。非静态嵌套类称为 inner   类

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

关于您的问题:

  

嗯,Inner类是静态的,所以我隐含地假设上面的代码   实例化Question_3_4的实例?

您不需要实例化外部类来实例化嵌套类,也不需要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();
     }

}

答案 1 :(得分:2)

在这种情况下没有(因为内部是静态的,你不需要partent类的实例来创建内部实例)...没有实例化父类......

您可以通过编写父类的构造函数并检查它是如何从未被调用来验证...

public class Calculator {
    public Calculator() {
        System.out.println("Hello Constructor Calc");
    }

    public static class Inner {
        private void doIt() {
            System.out.println("doIt()");
        }
    }

    public static void main(String[] args) {
        Calculator.Inner i = new Inner();
        i.doIt();
        Calculator.Inner i2 = new Calculator.Inner();
        i2.doIt();
    }
}

实例i和i2都只生成

  

doIt方法()

     

doIt方法()

答案 2 :(得分:1)

没有。您不需要外部类引用来访问静态内部类。

静态嵌套类就像任何其他顶级类一样,只是为了保持关系而分组。它根本不是外类的成员。您可以直接访问它。

  

注意:static nested class与其他类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。

然而在非静态内部类中,你说的是正确的。

  

nested class是其封闭类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无权访问封闭类的其他成员。

要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();