我们已经明白,非静态内部类不能有任何带有 static
关键字的成员。然而我们看到,带有final
的static
成员变量正在被使用和鼓励。谁能解释一下为什么吗?
另一个观察:
final static String abc = "I Love Food"; //works fine
而:
final static String abc = null; //is discouraged and gives error.
最佳答案
阅读以下内容JLS section (§8.1.3)有关在内部类中使用静态/非静态成员的规则。
Inner classes may not declare static initializers (§8.7) or member interfaces, or a compile-time error occurs.
Inner classes may not declare static members, unless they are constant variables (§4.12.4), or a compile-time error occurs.
请注意上面的这一行 - “除非它们是常量变量”,它回答了您的问题。当您将基元或字符串声明为 public static final
时,它就变成了“常量变量”,因此您可以在非静态内部类中使用它,因为它不违反编译规则。
现在,为什么它不会违反编译规则,因为当您声明一个常量变量并初始化它时,编译器可以确定性地说这将是该变量的值,而如果您不初始化它,则编译器无法确定性地说这将是该变量的值,并且不确定它是否可以在运行时修改,并且一旦分配了最终值,您就无法更改它。
阅读此JLS section (§4.12.4)中与final变量相关的规则
关于java - 为什么Java允许静态变量在非静态内部类中是FINAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44159510/