java - 作为引用类型的字符串

标签 java string reference-type

<分区>

我刚开始学习 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/

相关文章:

java - Google Glass 未列出的上下文语音命令无法正常工作

java - 无法获取JSP中的ModelAttribute成员变量

java - 按钮背景颜色更改不起作用

java - 转换0-10的整数并替换为与整数对应的英文单词

c++ - 使用 'space' 从用户获取输入的字符串类型

c# - 在 C# 中,使用值类型与引用类型

java - 在 JavaFX 如何调整父节点内的多个图像?

python - 我们可以检查 python 中的 string 中是否有两个或多个子字符串

swift - 为什么指向new Object后内存地址是一样的?

C# 如何使用 String 获取引用类型行为?