最终String s =“Hello World”与String s =“Hello World”相同吗?
如果一个类被定义为final
,我们声明一个最终类的实例……它会有什么不同吗? 或者在这种情况下是final
是多余的?
final String s = "Hello World"
与…一样
String s = "Hello World"
在变量上使用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.(FinalExample.java:7) at FinalExample.main(FinalExample.java:12)
现在,我想你想知道在String
数据类型的前面是否具有final
是否重要。 虽然您可能听说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
如果您想确保没有人可以更改您的String
引用,那么final
声明很有用。 您也可以将final
用于其他数据类型,以防止更改引用 。
变量上的final
与该类是否为final
是无关的 。
final String s = "Hello World"; s = "Goodbye"; // illegal String s2 = "Hello World"; s2 = "Goodbye"; // legal
最终变量不能绑定到另一个实例,因此这是无效的:
final String s = "123"; s = "234"; // doesn't work!
最后一堂课不能延期
final class A { } class B extends A { // does not work! }
并且这两者都不要与不可变类(如String
)混淆。 不可变类的实例不会改变它们的状态。 (对于不可变类没有直接的语言支持,但实际上大多数情况下,不可变类的所有属性都被声明为final。)