最终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。)