我不明白为什么在第一个代码(代码1)中,mycounter指向的对象在传递到方法“print”后被更新为值2。但是在第二个代码(代码2)中,str指向的对象仍然是相同的文本“这是一个字符串文本”。我认为str(str是一个对象引用,我认为与mycounter类似)经历了相同的机制,因为它也被传递给一个方法,所以它不应该像mycounter一样被更新吗?
这是代码1:
public class PrimitiveVsReference{
private static class Counter {
private int count;
public void advance(int number) {
count += number;
}
public int getCount() {
return count;
}
}
public static void main(String args[]) {
int i = 30;
System.out.println("value of i before passing to method : " + i);
print(30);
System.out.println("value of i after passing to method : " + i);
Counter myCounter = new Counter();
System.out.println("counter before passing to method : " + myCounter.getCount());// this gives 0
print(myCounter);
System.out.println("counter after passing to method : " + myCounter.getCount());// now this gives 2 after passing into the method "print"
}
/*
* print given reference variable's value
*/
public static void print(Counter ctr) {
ctr.advance(2);
}
/**
* print given primitive value
*/
public static void print(int value) {
value++;
}
}
代码2:
String str = "This is a string literal.";
public static void tryString(String s)
{
s = "a different string";
}
tryString(str); // isn't this here doing the samething as when myCounter is passed to print in Code 1?
System.out.println("str = " + str); // But this here output the original literal "This is a string literal."
有人能解释一下发生了什么事吗?
2条答案
按热度按时间oipij1gg1#
因为字符串是
Immutable
(“创建字符串示例后,字符串示例的内容将永远不会更改”),该赋值将创建引用副本现在指向的新字符串对象。原始参考仍然指向“这是一个字符串文字”你可以试试看
StringBuffer
或StringBuilder
并看到不同的结果。uidvcgyl2#
问题是字符串就像一个基本类型,即使它是类。您可以尝试,但不能从类字符串扩展。
作为一种基本类型,java将其值复制到另一个内存地址,并将这个“新变量”传递给正在调用的方法。然后,当您返回main时,您丢失了该方法的所有更改,因为它位于另一个内存地址中。
对于对象来说是不同的,因为java在调用带有参数的方法时传递对象的内存地址,所以实际上您有权修改实际示例。