0

Java中的以下代码有什么区别?我无法清楚地了解对象是如何在 Java 中传递的。谁能解释下面的代码。

package cc;

public class C {

    public static class Value {
        private String value;

        public void setValue(String str) {
            value=str;
        }

        public String getValue() {
            return value;
        }
    }



    public static void test(Value str) {
        str.setValue("test");
    }

    public static void test2(Value str) {
        str=new Value();
        str.setValue("test2");
    }
    public static void main(String[] args) {
        String m="main";
        Value v=new Value();
        v.setValue(m);
        System.out.println(v.getValue()); // prints main fine
        test(v);
        System.out.println(v.getValue()); // prints 'test' fine
        test2(v);
        System.out.println(v.getValue()); // prints 'test' again after assigning to test2 in function why?
    }
}
4

4 回答 4

3

test2()一个新实例中创建并且您在较新的实例中设置值,而不是在其引用被传递的对象中

public static void test2(Value str) {
        str=new Value();
        str.setValue("test2");
}

也可以看看

于 2012-08-23T06:55:46.047 回答
1

当你传入vtest2实际上正在做的事情是将指向方法的引用的副本v传递给该方法时 - 将其视为具有相同值的新变量v

当您将一个新Value对象分配给strinsidetest2时,您正在为引用的副本分配一个新值 - 存在于内部的原始引用main不受此重新分配的影响,并且仍然引用原始对象。

当您执行第三个println时,main您仍在使用原始Value对象,而不是在内部创建的新对象,test2因此您看到test并没有test2打印出来。

于 2012-08-23T06:59:53.153 回答
0

在java中,对象是按值传递的。它将 v2 的引用复制到 str。尽管您创建了一个新对象并分配给 str,但 str 是 test2 方法范围内的局部变量。仅更改了 test2 方法中的 str 。

public static void test2(Value str) {
  str=new Value();
  str.setValue("test2");
  System.out.println(str.getValue());
}
于 2012-08-23T07:01:28.690 回答
0

在您的函数test()中,您正在传递Value对象并在该对象中设置一些字符串。

 public static void test(Value str) {
    str.setValue("test");
 }

所以当你打印System.out.println(v.getValue());它会给你test作为输出。

接下来,您调用test2()which 创建一个新实例,Value 并在较新的实例中设置值。但不是在传递的对象中,所以新创建的对象中的test2值是并且旧对象中的值仍然是test

于 2012-08-23T07:04:04.547 回答