以下示例类无法编译:
class Test {
final int x; // Compilation error: requires initialization.
}
此代码的编译错误消息是:
..\src\pkgs\main\Test.java:3: error: variable x might not have been initialized
class Test {
^
但是,Java不会为包含以下方法的类生成任何错误消息:
class Test {
void method() {
final int x; // Compiles OK; has no initialization.
}
}
关于初始化及其要求,为什么Java会以不同方式处理最终实例变量和最终局部变量?谢谢。
答案 0 :(得分:2)
实例隐式使用实例变量。您给出的局部变量示例不使用局部变量,因此没有错误(不使用该变量)。
如果您尝试使用 x
,您的本地变量示例将无法编译(具有相同的错误):
class Test {
Test() {
final int x;
System.out.println(x); // <== Compilation error - "variable x might not have been initialized"
}
}
同样,你的第一个例子很好,只要你在某个时候初始化变量,不一定在声明中:
class Test {
final int x;
Test() {
this.x = 10;
}
}
答案 1 :(得分:1)
使用,即读取第二个案例将给你一个error。但未使用的变量算作警告,而不是错误;运行的代码的含义是明确的,如果很可能是错误的。
对于构造函数的情况,编译器没有执行那种未使用的变量分析,只是因为(除了私有字段之外的任何东西)它可能在另一个文件中读取,编译器没有进入。
因此,它需要被捕获为错误,以避免运行时行为,最终取决于未指定的JVM实现细节。
答案 2 :(得分:0)
最终的attricutes应该在构造函数中初始化,这就是为什么它不能在你的例子中编译。 最终变量也应在使用前初始化。没有初始化声明它的方法很好。