【发布时间】:2021-03-21 15:48:41
【问题描述】:
我对原因的解释有点困惑,因为内部类不能包含静态字段或方法。我读到,“内部类与外部类密切相关,当我们在内部类中声明静态字段/方法时,这个要求没有得到满足” 但它的背后是什么?谁能详细解释一下?
【问题讨论】:
-
他们在谈论非静态内部类。这样的类只存在于外部类实例的上下文中。所以静态属性对他们来说没有多大意义。
标签: java oop inheritance inner-classes
我对原因的解释有点困惑,因为内部类不能包含静态字段或方法。我读到,“内部类与外部类密切相关,当我们在内部类中声明静态字段/方法时,这个要求没有得到满足” 但它的背后是什么?谁能详细解释一下?
【问题讨论】:
标签: java oop inheritance inner-classes
你可以从doc搞清楚
As with instance methods and variables, an inner class is associated with an instance of its enclosing class and has direct access to that object's methods and fields. Also, because an inner class is associated with an instance, it cannot define any static members itself.
InnerClass 的实例只能存在于 OuterClass 的实例中,并且可以直接访问其封闭实例的方法和字段。这就是为什么你不能在内部类中声明静态字段的原因
编辑:similar question 可以帮助你
【讨论】:
在幕后,内部类隐式引用了外部类。您可以通过OuterClassName.this 访问它。编译器会为您处理幕后的工作,但本质上与您在内部类中声明一个具有外部类类型的字段相同。它只是为您节省了两行代码的语法糖。
相关的部分是,没有外部类就不能存在内部类。这纯粹是一个设计选择,是 Java 设计者有意做出的。
另一方面,如果内部类声明为static,编译器将不会生成并强制执行外部类的实例。在这种情况下,外部类的行为非常像一个包——它只是一个占位符。在这种情况下,内部类也可以有静态字段,所以限制不适用。
【讨论】:
您不能在内部类中使用静态声明是一个不必要的限制,但是已经添加了对内部类中的静态方法和字段的支持,并支持在 JDK16 中添加记录的工作。
除非使用JDK16或更高版本,否则该类不会编译和运行:
public class Launch {
public static void main(String[] args) {
System.out.println("Launch main says Y.xxx="+Y.xxx);
aaa();
Y.zzz();
}
public static void aaa() {
System.out.println("aaa()");
}
class Y {
public static final String xxx= "yyY";
public static void zzz() {
System.out.println("zzz()");
}
public static void main(String[] args) {
System.out.println("Inner class Y main says xxx="+xxx);
zzz();
aaa();
}
}
}
编译上述内部类main() 后,可以使用类名Launch$Y 独立于外部类的主类启动。例如:
java Launch$Y
=> prints:
Inner class Y main says xxx=yyY
zzz()
aaa()
java Launch
=> prints:
Launch main says Y.xxx=yyY
aaa()
zzz()
【讨论】: