实例级最终变量的 Java 编译时错误,而不是方法级局部变量的错误

标签 java

<分区>

当我们不初始化它们时,为什么 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!

关于实例级最终变量的 Java 编译时错误,而不是方法级局部变量的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45329696/

相关文章:

java - 为 Web 服务编写 Java 客户端的最佳方法是什么?

java - **线程 "main"java.util.InputMismatchException 中出现异常**

java - 如何在 Spring 中为 JSP 表单使用绝对路径?

java - 将 JAVA 库重定位到 Tomcat Lib 文件夹后出现的问题

java - 为什么即使是最简单的 Swing 程序 Java 也会崩溃?

Java Math.random 周期

java - postgresql(set role user)命令在SSM项目中如何使用?

java - 在 listitem click 和 myactivity 在 Tabactivity 中使用该文本时,文本到语音不起作用

java - Android 中的 Log.e

javascript - 将servlet中的字符串转换为json数据并传递给javascript : ajax