我很清楚Java通过值传递参数,以及如何将对象保存在变量中作为引用,可以在这些值可变时更改对象值。我也理解的是,类String包含不可变的对象。因此,为了测试我的理解,我决定编写一些代码,将对象作为参数传递给方法,更改其字符串和int变量,然后打印它。我期望,因为参数只是一个副本,这些更改不会影响传入的变量。传入一个对象作为参数不会将整个对象复制到一个新变量,只是传递该对象引用?这与几个消息来源告诉我的情况相反。以下是有问题的代码:
public class Test {
public int testVar = 20;
public String testString = "Hello";
public static void testCheck(Test test){
test.testString = new String("GoodBye");
test.testVar = 10;
}
public void printTest(){
System.out.println("testVar: " + testVar + " testString: " + testString);
}
public static void main(String[] args) {
Test test1 = new Test();
test1.printTest();
testCheck(test1);
test1.printTest();
}
}
输出:
testVar: 20 testString: Hello
testVar: 10 testString: GoodBye
预期:
testVar: 20 testString: Hello
testVar: 20 testString: Hello
提前致谢。
答案 0 :(得分:1)
一些概念:
最后一点是您在testCheck
方法中所做的事情。此外,
传入对象作为参数不会复制整个对象 进入一个新变量,简单地传递该对象引用?
这句话没有多大意义。你作为一个论点传递的是一个价值。该值是对象引用,而不是对象。在您的方法中,您取消引用该对象引用以访问字段并调用引用对象的方法。
答案 1 :(得分:1)
在Java中,参数始终按值传递,因此test
实际上是test1
的副本。你犯的错误是复制一个对象变量不会复制对象;它将引用复制到同一个对象。由于您正在改变同一对象实例上的字段,因此两个引用都会看到新状态。相比之下,当您“更新”不可变对象变量(如String
)时,您只是引用一个新的对象实例。
顺便说一句,很少有理由创建new String
而不只是分配字符串文字。在这种情况下绝对没有。
答案 2 :(得分:0)
您正在将引用的副本传递给原始对象。实际上,您正在传递原始对象的引用,因此在:
testCheck(test1);
您正在修改test1
对象的属性/变量。