据我了解,java中的对象是通过引用传递的,或者更准确地说,对对象的引用是通过值传递的。那么,如果我声明一个字符串并将其传递到一个函数中,在该函数中更改该字符串的值,为什么原始字符串没有改变?例如:
class Thing
{
static void func(String x){ x = "new"; }
public static void main(String [] args)
{
String y = "old";
func(y);
System.out.print(y);
}
}
为什么 y 的值仍然是“旧的”?
编辑:为什么下面将事物的属性 x 设置为 90?
class Thing { int x = 0;
static void func(Thing t){ t.x = 90; }
public static void main(String [] args){
Thing something = null;
something = new Thing();
func(something);
System.out.print(something.x);
}
}
最佳答案
首先,java 中的所有内容都是按值传递的。甚至引用也是按值传递的。
您创建了一个新的string
文字,但没有在方法func()
中返回它。
您正在修改传递的参数而不是原始字符串
,因此您看不到更改。
你可能需要这个,
public static void main(String [] args)
{
String y = "old";
y= func(y);
System.out.print(y);
}
static String func(String x){
x = "new";
return x
}
编辑评论:
不,它们并不相同。两种String
方式之间有很多区别,特别是在内存方面。
阅读
编辑2:
在第一种情况下,您在 func
方法中创建了一个新的字符串文字,但在这里您正在修改引用。
完成后您的疑问就会澄清
static void func(Thing t){
t = new Thing(); //as like previous example
t.x = 90; // points to new one. Not the original.
}
现在检查结果。
关于java - 对java中的内存感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19462944/