1 回答
TA贡献1788条经验 获得超4个赞
非静态内部类有一些特别之处。
静态内部类没有。顶级课程没有它。任何内部接口或枚举都没有。
那个特殊的东西是一个看不见的领域。
这个不可见的字段是类型Outer,它是final。它在其构造函数中被初始化为第一件事,并且,是的,非静态内部类的每个构造函数都有一个神奇的不可见参数,类型为 ,用作Outer此字段。
所以,当你写:
public class Outer {
public class Inner {
}
}
编译器将像您实际编写的那样编译此代码:
public class Outer {
public static class Inner {
private final Outer I_AM_MAGIC;
public Inner(Outer outer) {
this.I_AM_MAGIC = outer;
}
}
}
你可以使用javap反编译工具看到这个隐藏的魔法;通过-verbose,-private你会看到这些。这种魔法存在的原因是您可以从内部调用外部的实例方法,但是..您在什么实例上调用这些外部方法?在那个隐藏的实例上!
请注意,这段奇异的、看似怪异的代码:someOuter.new Inner()实际上是合法的 Java 代码。当new Inner()从 中的非静态上下文中调用时Outer,this实例作为不可见参数传递给该构造函数,但如果您不在那里,代码根本不会编译......除非您使用语法outer.new Inner()。
编译器会阻止您添加静态方法的原因是Inner它被认为会导致一些混乱。基本上,你的问题的答案是:“没有充分的理由......只是......规范说java编译器不能允许它,因此,javac不允许它”。
请注意,实际上这些非静态内部类是令人困惑的东西。我强烈建议你教自己总是做你的内部课程static,除非你真的知道你在做什么。即使那样,也要三思。然后再三思。然后也许考虑制作一个非静态内部类。
添加回答
举报