<分区>
我刚开始学习 Java,但我才刚刚开始了解值类型与引用类型。据我了解, String 是一种引用类型。然而,与其他引用类型不同的是,我可以打印一个字符串,而无需打印一些奇怪的字母和数字组合。这是为什么?此外,假设我有代码
String s1 = "x";
String s2 = s1;
s1 = "xyz";
System.out.println(s2);
它将打印“x”,而不是“xyz”,即使我更改了 s2 所指的对象。当我更改数组时,这不会发生。为什么字符串很特别?
<分区>
我刚开始学习 Java,但我才刚刚开始了解值类型与引用类型。据我了解, String 是一种引用类型。然而,与其他引用类型不同的是,我可以打印一个字符串,而无需打印一些奇怪的字母和数字组合。这是为什么?此外,假设我有代码
String s1 = "x";
String s2 = s1;
s1 = "xyz";
System.out.println(s2);
它将打印“x”,而不是“xyz”,即使我更改了 s2 所指的对象。当我更改数组时,这不会发生。为什么字符串很特别?
最佳答案
Unlike other reference types, however, I can print a String without it printing some weird combination of letters and numbers. Why is that?
因为与许多其他类型一样,String 会覆盖 Object.toString()
,并返回另一个字符串而不是默认实现返回的字符串(当然,它会返回自身)。
This doesn't happen when I change, say, an Array.
您混淆了“为变量分配新值”和“更改对象的状态”。如果您对数组执行与您在此处执行的操作相同的操作,您将具有相同的行为:
char[] s1 = new char[] {'x'};
char[] s2 = s1;
s1 = new char[] {'x', 'y', 'z'};
System.out.println(Arrays.toString(s2));
当您将不同的数组分配给 s1
时,这不会改变变量 s2
指向的内容。
当然,如果 s1 和 s2 指向同一个数组,并且您修改了该数组,那么它们都将继续指向同一个修改后的数组:
char[] s1 = new char[] {'x'};
char[] s2 = s1;
s1[0] = 'y';
System.out.println(Arrays.toString(s2));
关于java - 作为引用类型的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53668832/