String如何在Java中成为引用类型?

时间:2018-07-22 15:00:43

标签: java string reference

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

class Class {

String s = "Hello";

public void change() {
    s = "Bye";
} }

通过以下代码,我知道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

现在,我想对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

5 个答案:

答案 0 :(得分:9)

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

here

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

method

答案 1 :(得分:2)

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

String s1 = "Hello";
String s2 = s1; 

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

enter image description here

现在,s1s2指向String pool中相同的文字字符串。

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

Bye中创建了另一个文字String pool,并将引用放置在s2中。但是,s1仍然具有较旧的参考,因此正在打印Hello

![enter image description here

答案 2 :(得分:0)

 mRef.orderbychild("billtype").equalto("Electronics")

这等效于创建一个新的String对象并将其引用分配给s2 = "Bye"; s2),因此s2 = new String("Bye");s1是不同的。

您正在将以上内容与s2之类的方法调用进行比较,该方法调用会更改某些内部字段值。

换句话说,在您的示例中,c2.change()等效于s2 = "Bye";。在Class c2 = new Class();之后,您不能期望c1.change()c1的字段c2具有相同的值。

答案 3 :(得分:0)

Java是按值传递的。如果将对象传递给方法,则可能仅传递了该对象的值,而不是对象本身,并且其值保持不变

答案 4 :(得分:-2)

String s1 =“ Hello”; 字符串s2 = s1;

进行类似更改时,

s2 =“再见”;

您正在这样做

s2 = new String(“ Bye”);

明确