字符串和最终

以下陈述之间有什么区别

String name = "Tiger"; final String name ="Tiger"; 

虽然String类是final类,但为什么我们需要创建一个String“CONSTANT”变量作为final?

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

我认为这里混淆的原因是final关键字可以在几个不同的上下文中使用:

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

有关每种情况的示例,请参阅维基百科关于Java最终版的文章。

“最终”在两种情况下意味着不同的东西。

java.lang.String类是final。 这意味着你无法inheritance它。

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

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

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

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

请记住,在这种情况下, Java final关键字有两个用途:

  • 这意味着引用不能设置为另一个字符串 – 即你不能随后做“name = …”;
  • 但至关重要的是,它意味着引用正确发布到其他线程 (有关更多详细信息,请参阅链接文章,或Goetz等人的着作“Java Concurrency in Practice”)。

看看最终关键字的最后一个字 。

 String name = "scott"; name = "tiger"; // OK final String gender = "male"; gender = "female"; // won't compile you cannot reassign gender cause it's final 

你对最终的不可改变感到困惑。

字符串,如Integer和Long,是一个不可变类,因为内部数据通过封装得到保护,不会被修改。

但是,就像Ayman所说,final指的是指向字符串的指针。

如果变量标记为final,则不能更改该变量的值,即与变量一起使用时的final关键字使其成为常量。 如果您尝试在程序过程中更改该变量的值,编译器将给您一个错误。

注意: 如果将引用类型的变量标记为final,则该变量不能引用任何其他对象。 但是,您可以更改对象的内容,因为只有引用本身是最终的。

消息来源: Java中的最终关键字