在 java 中使用最终的局部变量

2022-09-01 06:22:24

我想知道使用最终局部变量是否有任何可用性。当继承进入画面时,变量无论如何都不会被覆盖。例如,如下简单代码

public static void main(String args[]) {
    final String data = "Hello World!";
    System.out.println(data);
}

该示例非常简单,可能不是相关代码,但问题更通用。我见过很多代码(全部合并到具有最终局部变量的main函数中)除了不能在同一函数本身中编辑它们之外,将局部变量声明为最终变量是否有任何可用性?


答案 1

首先,关于变量被“覆盖”的部分 - 有两个非常不同的含义。对于类和方法,它是关于继承的;对于变量,它是关于只读的。final

最终局部变量有一个重要的“特征”:它们可以在局部(通常是匿名的)内部类中使用。非最终局部变量不能。根据我的经验,这是局部变量的主要用途。final

public void foo() {
    final String x = "hello";
    String y = "there";

    Runnable runnable = new Runnable() {
        @Override public void run() {
            System.out.println(x); // This is valid
            System.out.println(y); // This is not
        }
    };
    runnable.run();
}

请注意,作为样式问题,有些人喜欢使用,即使他们没有在局部内部类中捕获变量。我当然愿意成为默认值,但是“非最终”使用不同的修饰符,但我发现在任何地方显式添加修饰符太分散注意力了。finalfinal


答案 2

最终局部变量可以从匿名内部子类访问,而非最终局部变量则不能。


推荐