String是一个Java中的引用类型?

Rob*_*bin 0 java string reference

我理解类是引用类型,例如我创建了以下类:

class Class {

String s = "Hello";

public void change() {
    s = "Bye";
} }
Run Code Online (Sandbox Code Playgroud)

使用以下代码,我理解这Class是一个引用类型:

Class c1 = new Class(); 
Class c2 = c1; //now has the same reference as c1

System.out.println(c1.s); //prints Hello
System.out.println(c2.s); //prints Hello

c2.change(); //changes s to Bye

System.out.println(c1.s); //prints Bye
System.out.println(c2.s); //prints Bye
Run Code Online (Sandbox Code Playgroud)

现在我想用String做同样的事情,但这不起作用.我在这做错了什么?:

String s1 = "Hello";
String s2 = s1; //now has the same reference as s1 right?

System.out.println(s1); //prints Hello
System.out.println(s2); //prints Hello

s2 = "Bye"; //now changes s2 (so s1 as well because of the same reference?) to Bye

System.out.println(s1); //prints Hello (why isn't it changed to Bye?)
System.out.println(s2); //prints Bye
Run Code Online (Sandbox Code Playgroud)

Lor*_*uro 9

在第一种情况下,您正在调用引用对象的方法,因此引用的对象会更改,而不是2个引用:

方法

在第二种情况下,您要为引用本身分配一个新对象,然后指向该新对象:

新对象


Ama*_*bra 7

这是因为您正在更新 s2 而不是 s1 的引用。让我们看看你的代码是如何执行的:

String s1 = "Hello";
String s2 = s1; 
Run Code Online (Sandbox Code Playgroud)

Hello在 中创建的文字字符串,String pool然后将其引用放入 中s1。然后在第二行s2也得到了相同的引用。

在此输入图像描述

到目前为止,s1s2都指向 中的相同文字字符串String pool

现在当下面的代码被执行时。

另一个文字Bye被创建在 中String pool,引用被放入 中s2。然而,s1仍然有旧的参考,因此正在打印Hello

![在此输入图像描述