如果一个类被定义为final
并且我们声明了最终类的实例......它会有什么不同吗?或final
在这种情况下是多余的?
final String s = "Hello World"
与
相同String s = "Hello World"
答案 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。)