gpt4 book ai didi

java - 计数器直观的对象参数行为

转载 作者:行者123 更新时间:2023-12-02 05:45:29 25 4
gpt4 key购买 nike

我很清楚Java按值传递参数,以及由于对象作为引用保存在变量中,因此当这些值可变时可以更改对象值。我还了解到 String 类包含不可变的对象。因此,为了测试我的理解,我决定编写一些代码,将对象作为参数传递给方法,更改其 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

提前致谢。

最佳答案

在Java中,参数总是按值传递,因此test实际上是test1的副本。您犯的错误是复制对象变量并没有复制对象;它将引用复制到同一个对象。由于您要更改同一对象实例上的字段,因此两个引用都会看到新状态。相比之下,当您“更新”一个不可变的对象变量(例如 String)时,您只是引用一个新的对象实例。

顺便说一句,很少有充分的理由创建一个新字符串而不是仅仅分配一个字符串文字。在这种情况下绝对没有。

关于java - 计数器直观的对象参数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24109135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com