java编译错误取决于静态变量名是否合格?

Arc*_*hie 9 java javac

为什么这个java程序不能编译:

public class xx {
    public static final Object obj;
    static {
//        obj = null;       // this compiles
        xx.obj = null;      // this doesn't
    }
}
Run Code Online (Sandbox Code Playgroud)

有这个错误:

$ javac xx.java
xx.java:5: cannot assign a value to final variable obj
        xx.obj = null;      // this doesn't
          ^
1 error
$ javac -version
javac 1.6.0_33
Run Code Online (Sandbox Code Playgroud)

的时候,如果我取代xx.obj = nullobj = null(如评论提到),它编译.

我认为xx.类名前缀或多或少只是语法...这是编译器或语言规范中的错误吗?:)

fas*_*ava 7

当你这样做时xx.obj,意味着该类已经初始化.所以final obj不能再次初始化.这是编译时错误.编译器可能已检查obj尚未初始化.很难检查,但从理论上说这是可能的.但这不是Java编译器的工作方式.

  • 仍然不明白......你是什么意思:"当你做xx.obj时,它意味着该类已经初始化"?类初始化在运行时发生; 这是一个编译时问题.当然,最终字段不能初始化两次,但这不是这里发生的事情.编译器确实可以检查它,因为备用版本(`obj = null`而不是`xx.obj = null`)编译得很好. (3认同)
  • 这对我来说毫无意义.此代码是静态初始化程序的一部分,因此在运行代码时正在进行类初始化; java旨在正确处理(否则会是什么)递归类初始化. (2认同)