是最终的String s =" Hello World"与String s =" Hello World"?相同

时间:2014-06-03 21:04:08

标签: java string class final

如果一个类被定义为final并且我们声明了最终类的实例......它会有什么不同吗?或final在这种情况下是多余的?

final String s = "Hello World" 

相同
String s = "Hello World"

3 个答案:

答案 0 :(得分:6)

对变量使用final时,表示无法重新分配。请考虑以下示例:

public class FinalExample {
    private final String a = "Hello World!"; // cannot be reassigned
    private String b = "Goodbye World!"; // can be reassigned

    public FinalExample() {
        a = b; // ILLEGAL: this field cannot be re-assigned
        b = a; 
    }

    public static void main(String[] args) {
        new FinalExample();
    }
}

如果您尝试运行它,则会在a=b上收到错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The final field FinalExample.a cannot be assigned

    at FinalExample.<init>(FinalExample.java:7)
    at FinalExample.main(FinalExample.java:12)

现在,我想你想知道在final数据类型前面是否String是否重要。虽然您可能听说String是不可变的,但您仍然可以将String s = "Hello World!";之类的内容重新分配给另一个字符串值。这种区别是由于您实际上正在将String s的引用重新分配给新字符串。因此,以下内容有效:

String s = "Hello World";
s = "Goodbye World!";
System.out.println(s);

Output: Goodbye World!

但您可以使用final声明来阻止此更改:

final String s = "Hello World";
s = "Goodbye World!";
System.out.println(s);

Output: 
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The final local variable s cannot be assigned. It must be blank and not using a compound assignment

如果您想确保没有人可以更改您的final参考,那么String声明很有用。您也可以将final用于其他数据类型,以防止更改引用

答案 1 :(得分:5)

final对变量的与该类是否为final有关。

final String s = "Hello World";
s = "Goodbye";  // illegal

String s2 = "Hello World";
s2 = "Goodbye";  // legal

答案 2 :(得分:4)

最终变量不能绑定到另一个实例,因此无效:

final String s = "123";
s = "234"; // doesn't work!

最后一堂课无法延期

final class A {
}

class B extends A { // does not work!
}

这两个都不能与immutable类混淆(如String)。不可变类的实例不会改变它们的状态。 (对于不可变类没有直接的语言支持,但实际上大多数情况下,不可变类的所有属性都被声明为final。)