以下语句之间有什么区别
String name = "Tiger";
final String name ="Tiger";
尽管String
类是final
类,为什么我们需要创建一个字符串“ CONSTANT”变量作为最终变量?
final
在此情况下意味着变量name
只能分配一次。再次为其分配不同的String
对象会导致编译错误。
我认为这里的困惑之处在于,final
关键字可以在几种不同的上下文中使用:
有关每种情况的示例,请参阅final in Java上的Wikipedia文章。
“ final”在两种情况下的含义不同。
java.lang.String类是最终的。这意味着您不能从中继承。
变量“名称”是最终的,这意味着您无法将其更改为指向String的其他实例。因此,非最终String变量不是常量,因为您可以在两个不同的时间读取它并获得不同的值。
碰巧,Java字符串对象也是不可变的。这意味着您不能修改特定String对象表示的值。将此与数组进行比较-您可以将数组对象的第一个元素替换为其他对象,但是不能将String对象的第一个字符替换为其他字符。这就是为什么String.replace()返回一个新字符串-它无法修改旧字符串的原因。
String是最终值的一个原因是,它防止实现可变行为的String子类的实例代替String传递。
但是,是否可以修改特定对象,以及是否可以将其他对象分配给变量,则是完全不同的概念。一个是String对象的属性,另一个是String变量的属性,这些变量是对String对象的引用。
请记住,在这种情况下,Java final keyword有两个作用:
您将不可变与final混淆。
如果变量被标记为final
推断默认情况下String对象为Final对象本身就是一个模糊的语句。 Java的基础知识规定,如果实例变量未指向内存位置,则它有资格进行垃圾回收。 String对象也会发生相同的情况。它们是不可变的,但是它们的引用可以更改。为了克服这个问题,我们可以使用“ Final String s1 =” Final String“” final关键字不允许对s1进行任何赋值,除非在首次声明时,使其真正不可变。