当我们不初始化它们时,为什么 java 编译器不会为方法级局部最终变量给出任何编译时错误?
(但在实例级最终变量未初始化时会给出错误)。
public class FinalKeyword
{
final int j; // error: the blank final field j may not have been initialized.
public static void main(String[] args)
{
final int k; // not giving any Compile time error!
}
}
事情是:一旦您将 main()
方法更改为
final int k;//Not Giving any Compile time error
System.out.println(k); //different story now!
你也收到关于 k 未被初始化的错误!
重点是:
- 编译器必须确保当前不可见的其他源代码......能够毫无问题地执行
new FinalKeyword()
。因此它不能让您保持 j
未初始化。
- 但是那个
main()
方法......即使另一个方法调用这个 main()
方法 - 这很好。该方法没有任何作用!换句话说 - 定义一个不在方法中使用的变量不是问题!因为您没有方法可以获取该变量!
编译器必须防止您陷入“绊倒”未初始化变量的情况。当您调用具有此类变量的方法时...但从不使用它们 - 这只是“不关心”。
惊喜:当我们一起去
public class FinalTest {
public static void main(String args[]) {
final int k;
}
}
然后编译;然后我们使用 javap 来反编译字节码:
public static void main(java.lang.String[]);
Code:
0: return
这是 javac 进行一些优化的罕见情况之一 - 通过简单地丢弃未使用的变量。额外有趣的事实:即使将我的示例更改为 k=5;
- 您会发现类文件仍然只包含 return
!