在Java中使用最终局部变量


问题内容

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

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

这个例子很简单,可能不是一个相关的代码,但是问题比较笼统。我已经看到了很多代码(全部都包含在具有最终局部变量的main函数中)是否有将局部变量声明为final
other的可用性。不能在同一功能中进行编辑?


问题答案:

首先,关于变量被“覆盖”的部分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();
}

请注意,就样式而言,final即使 没有 在本地内部类中捕获变量,某些人还是喜欢使用。我当然愿意成为final默认值,但是对于“ non-
final”使用不同的修饰符,但是我发现在所有地方显式添加修饰符会让人分心。