我了解类是引用类型,例如,我创建了以下类:
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
答案 0 :(得分:9)
答案 1 :(得分:2)
这是因为您要更新s2而不是s1的引用。让我们看看您的代码是如何执行的:
String s1 = "Hello";
String s2 = s1;
在Hello
中创建的String pool
文字字符串,然后将其引用放在s1
中。然后在第二行s2
中也得到了相同的引用。
现在,s1
和s2
指向String pool
中相同的文字字符串。
现在,当下面的代码被执行时。
在Bye
中创建了另一个文字String pool
,并将引用放置在s2
中。但是,s1
仍然具有较旧的参考,因此正在打印Hello
。
答案 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”);
明确。