以下陈述之间有什么区别
String name = "Tiger";
final String name ="Tiger";
虽然String
类是final
类,为什么我们需要创建一个String“CONSTANT”变量作为final?
答案 0 :(得分:52)
final
表示变量name
只能分配一次。再次为其分配不同的String
对象会导致编译错误。
我认为这里混淆的原因是final
关键字可以在几个不同的上下文中使用:
有关每个案例的例子,请参阅final in Java上的维基百科文章。
答案 1 :(得分:4)
“final”在两种情况下意味着不同。
java.lang.String类是final。这意味着你不能继承它。
变量“name”是final,这意味着您无法将其更改为指向不同的String实例。因此,非最终的String变量不是常量,因为您可以在两个不同的时间读取它并获得不同的值。
碰巧,Java字符串对象也是不可变的。这意味着您无法修改特定String对象表示的值。将其与数组进行比较 - 您可以使用不同的对象替换数组对象的第一个元素,但不能使用不同的char替换String对象的第一个字符。这就是String.replace()返回一个新字符串的原因 - 它不能修改旧字符串。
String是final的一个原因是防止实现可变行为的String子类的实例代替String传递。
但是,您是否可以修改特定对象,以及是否可以为变量分配不同的对象,这些概念完全不同。一个是String对象的属性,另一个是String变量的属性,它们是对String对象的引用。
答案 2 :(得分:2)
请记住Java final keyword在这种情况下有两个目的:
答案 3 :(得分:2)
查看The final word on the final keyword。
String name = "scott";
name = "tiger"; // OK
final String gender = "male";
gender = "female"; // won't compile you cannot reassign gender cause it's final
答案 4 :(得分:1)
你对最终的不可改变感到困惑。
字符串,如Integer和Long,是一个不可变类,因为内部数据通过封装得到保护,不会被修改。
然而,就像Ayman所说,final指的是指向字符串的指针。
答案 5 :(得分:0)
如果变量标记为 final ,则无法更改该变量的值,即最终关键字与变量一起使用时会使其成为常量。如果您尝试要在程序过程中更改该变量的值,编译器会给你一个错误。
注意: 如果将引用类型的变量标记为final,则该变量不能引用任何其他对象。但是,您可以更改对象的内容,因为只有引用本身是最终的。
答案 6 :(得分:0)
要推断默认情况下String对象是Final,本身就是一个模糊的语句。 Java的基础知识规定,如果实例变量未指向内存位置,则它有资格进行垃圾回收。 String对象也会发生相同的情况。它们是不可变的,但是它们的引用可以更改。为了克服这个问题,我们可以使用“ Final String s1 =” Final String“”,最终关键字将不允许对s1进行任何赋值,除非在首次声明时,使其真正不可变。
public class DemoStringF
{
String s1; //Declaring an Instance Variable to type String.
public static void main(String... args)
{
DemoStringF d = new DemoStringF ();
d.s1 = "Intializing s1 here"; //Initializing the s1
System.out.println("Value ref. by s1 is " +d.s1); //Displays the String
by which s1 is
initialized.
System.out.println("Value of s1 is " +d.s1.hashCode()); //Displays the
value of the s1.
d.s1 = d.s1.concat(" Adding String to s1"); //Changing the value ref. by
s1.
System.out.println("Value ref. by s1 after concat() is " +d.s1);
//Displays a new value of s1.
System.out.println("Value of s1 is " +d.s1.hashCode()); //Displays
the value of the s1.
}
}