字符串和最终

2022-09-01 12:41:05

以下语句之间的区别是什么

String name = "Tiger";

final String name ="Tiger";

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


答案 1

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

我认为这里混淆的根源在于关键字可以在几种不同的上下文中使用:final

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

请参阅维基百科上关于Java中final的文章,了解每种情况的示例。


答案 2

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

java.lang.String 类是最终类。这意味着您无法从中继承。

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

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

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

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