我有一本来自教科书的代码:
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();
是一回事。
如果我的假设错了,我在这里缺少什么?
答案 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();