java - 为什么Java允许静态变量在非静态内部类中是FINAL

标签 java static inner-classes

我们已经明白,非静态内部类不能有任何带有 static 关键字的成员。然而我们看到,带有finalstatic成员变量正在被使用和鼓励。谁能解释一下为什么吗?

另一个观察:

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/

相关文章:

java - 关于构造一个不使用 super() 扩展抽象类构造函数的子类的问题

java - Android Studio Activity 启动延迟

c# - 除了减少内存使用量之外,C# 静态函数是否比非静态函数执行得更好?

c - 如何在 C 静态函数上设置 VxWorks 断点?

ruby - Ruby 中的类静态实例初始值设定项(即工厂方法)

java - 为什么内部类可以访问私有(private)方法?

java - 如何实例化多个嵌套的非静态内部类 - java

c++ - 类体内的前向声明是否被视为不同的类型?

java - 光栅图像的 sRGB IEC61966-2.1 ColorModel

java - JPA Cascade注解和Hibernate Cascade注解的区别