修改 String/Integer 对象并检查它是不是影响以该对象为参数的类对象
Posted
技术标签:
【中文标题】修改 String/Integer 对象并检查它是不是影响以该对象为参数的类对象【英文标题】:Modifying String/Integer object and check if it affects a class object which has the object as its parameter修改 String/Integer 对象并检查它是否影响以该对象为参数的类对象 【发布时间】:2013-12-25 11:40:02 【问题描述】:public static void main(String[] args)
String name = "john";
StringTest obj = new StringTest(name);
name = "peter";
System.out.println(obj.name);
class StringTest
String name;
StringTest(String name)
this.name = name;
现在,由于字符串名称已从“john”重新分配为“peter”,我希望它会打印 peter,但它会打印 john。字符串是否不可变会导致在重新分配时创建一个新对象,或者对此的正确解释是什么?
此外,当我使用 Integer 对象尝试此操作时,行为是相同的!请任何人解释这种行为的原因
【问题讨论】:
【参考方案1】:Java 使用 pass-by-value,这意味着您传递 name
的值,而不是引用。
在您创建 StringTest
实例之后更改 name
的值不会以任何方式影响您的 StringTest
。
【讨论】:
是的,所以对字符串名称的引用的副本将传递给方法..所以一旦我更改字符串名称,它应该会反映在具有引用的对象中,对吧! 不,当您编写name = "peter";
时,您会创建一个新的String
并将name
指向该String
。这不会影响StringTest
实例中的类变量name
,它仍将指向"john"
。
好的,知道了..tq。我只是认为会传递参考而不是实际的字符串
@sarish 引用被传递了,但是当你分配一个新的字符串时,变量会包含一个对那个字符串的new引用,旧的引用不受影响。跨度>
【参考方案2】:
我认为这里让你失望的是你不必使用“new”关键字来创建字符串。代码读起来更像是创建一个原始类型,如 int 或 long,而不是创建对象。这就是实际发生的事情。 创建两个字符串的等效方法是
String name = new String(new char[] 'j','o','h','n');
StringTest obj = new StringTest(name);
name = new String(new char[] 'p','e','t','e','r');
这样写我认为更清楚为什么你没有对 StringTest 中引用的字符串产生副作用。这与字符串确实不可变这一事实无关。
【讨论】:
以上是关于修改 String/Integer 对象并检查它是不是影响以该对象为参数的类对象的主要内容,如果未能解决你的问题,请参考以下文章