String and Final

问题描述 投票:28回答:7

以下语句之间有什么区别

String name = "Tiger";

final String name ="Tiger";

尽管String类是final类,为什么我们需要创建一个字符串“ CONSTANT”变量作为最终变量?

java string variables final
7个回答
53
投票

final在此情况下意味着变量name只能分配一次。再次为其分配不同的String对象会导致编译错误。

我认为这里的困惑之处在于,final关键字可以在几种不同的上下文中使用:

  • 最终类:该类不能被子类化。
  • 最终方法:该方法不能被覆盖。
  • 最终变量:该变量只能分配一次。

有关每种情况的示例,请参阅final in Java上的Wikipedia文章。


4
投票

“ final”在两种情况下的含义不同。

java.lang.String类是最终的。这意味着您不能从中继承。

变量“名称”是最终的,这意味着您无法将其更改为指向String的其他实例。因此,非最终String变量不是常量,因为您可以在两个不同的时间读取它并获得不同的值。

碰巧,Java字符串对象也是不可变的。这意味着您不能修改特定String对象表示的值。将此与数组进行比较-您可以将数组对象的第一个元素替换为其他对象,但是不能将String对象的第一个字符替换为其他字符。这就是为什么String.replace()返回一个新字符串-它无法修改旧字符串的原因。

String是最终值的一个原因是,它防止实现可变行为的String子类的实例代替String传递。

但是,是否可以修改特定对象,以及是否可以将其他对象分配给变量,则是完全不同的概念。一个是String对象的属性,另一个是String变量的属性,这些变量是对String对象的引用。


2
投票

请记住,在这种情况下,Java final keyword有两个作用:

  • 这意味着引用不能设置为另一个字符串-即,您以后不能再执行“ name = ...”;]]
  • 但至关重要的是,这意味着该引用已正确发布到其他线程
  • (有关更多详细信息,请参见链接的文章,或诸如Goetz等人的“ Java Concurrency in Practice”之类的著作。


1
投票

您将不可变与final混淆。


0
投票

如果变量被标记为final


0
投票

推断默认情况下String对象为Final对象本身就是一个模糊的语句。 Java的基础知识规定,如果实例变量未指向内存位置,则它有资格进行垃圾回收。 String对象也会发生相同的情况。它们是不可变的,但是它们的引用可以更改。为了克服这个问题,我们可以使用“ Final String s1 =” Final String“” final关键字不允许对s1进行任何赋值,除非在首次声明时,使其真正不可变。

© www.soinside.com 2019 - 2024. All rights reserved.