以下语句之间有什么区别
String name ="Tiger";
final String name ="Tiger";
尽管String类是final类,但是为什么我们需要创建String" CONSTANT"变量作为最终变量?
它是对此处最终定型的字符串的引用,而不是字符串本身。
在上下文中,final表示变量name只能分配一次。再次为其分配不同的String对象会导致编译错误。
我认为这里混淆的根源是final关键字可以在几种不同的上下文中使用:
最终类别:该类别不能被子类别化。
最终方法:该方法不能被覆盖。
最终变量:该变量只能分配一次。
有关每种情况的示例,请参见有关Java最终版本的Wikipedia文章。
不过,请记住final也与其他线程的安全发布有关(请参阅下面的答案)。
在两种情况下,"最终"意味着不同的事物。
java.lang.String类是最终的。这意味着您不能从中继承。
变量"名称"是最终的,这意味着您不能将其更改为指向String的其他实例。因此,非最终String变量不是常量,因为您可以在两个不同的时间读取它并获得不同的值。
碰巧的是,Java字符串对象也是不可变的。这意味着您不能修改特定String对象表示的值。将此与数组进行比较-您可以将数组对象的第一个元素替换为其他对象,但是不能将String对象的第一个字符替换为其他字符。这就是String.replace()返回新字符串的原因-它无法修改旧字符串。
String是final的一个原因是要防止传递实现可变行为的String子类实例来代替String。
但是,是否可以修改特定的对象以及是否可以将不同的对象分配给变量是完全不同的概念。一个是String对象的属性,另一个是String变量的属性,这些变量是对String对象的引用。
看看final关键字上的final单词。
String name ="scott";
name ="tiger"; // OK
final String gender ="male";
gender ="female"; // won't compile you cannot reassign gender cause it's final
请记住,在这种情况下,Java final关键字有两个作用:
这意味着不能将引用设置为另一个字符串-即,您以后不能再执行"名称= ...";
但至关重要的是,这意味着该引用已正确发布到其他线程(有关更多详细信息,请参见链接的文章,或诸如Goetz等人的" Java Concurrency in Practice"之类的著作。
是的,final的语义在并发应用程序中非常重要,而在普通的Java应用程序中则不那么重要,因为Java程序员倾向于拥抱可变性。
您将一成不变与final混淆了。
像Integer和Long一样,String是一个不可变的类,因为内部数据受到保护,无法通过封装进行修改。
但是,就像Ayman所说的那样,final是指向字符串的指针。
如果将变量标记为final,则该变量的值无法更改,即与变量一起使用时,final关键字使其变为常数。而且,如果您在程序执行过程中尝试更改该变量的值,则编译器将给您一个错误。
注意 :
如果将引用类型的变量标记为final,则该变量不能引用任何其他对象。但是,您可以更改对象的内容,因为只有引用本身是最终的。
消息来源:Java中的最终关键字