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

标签 java parameters pass-by-reference pass-by-value

我很清楚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/

相关文章:

asp.net - Oracle:如何参数化列表?

javascript - .click() 回调引用调用方法中的局部变量,而不是按值复制

java - 从数据库中获取值作为有序映射

java - JSP.13.8 示例简单标记处理程序方案不起作用?

c++ - 通过引用传递是作为指针传递的特例吗?

jquery - 为什么 jQuery.each() 和 jQuery.grep() 有不同的参数顺序?

java - 通过 Gradle 生成 EMF 模型

Java:有符号长到无符号长字符串

c++ - 通过引用传递 : no known conversion for argument 6 from 'int' to 'int&'

c - 使用传递引用/取消引用的奇怪行为