传递对象Java

传递对象Java,java,parameter-passing,Java,Parameter Passing,以下Java代码之间的区别是什么?我无法清楚地了解Java中对象是如何传递的。有人能解释下面的代码吗 package cc; public class C { public static class Value { private String value; public void setValue(String str) { value=str; } public String getVal

以下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?
    }
}
test2()
中,将创建一个新实例,您将在较新的实例中设置值,而不是在传递引用的对象中设置值

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

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

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


当您将
v
传递到
test2
中时,您实际做的是将指向
v
的引用副本传递到方法中-将其视为与
v
具有相同值的新变量

当您向
test2
内部的
str
分配一个新的
Value
对象时,您正在向引用的副本分配一个新的值-您的原始引用(位于
main
内部)不受此重新分配的影响,并且仍然引用原始对象


当您在
main
中执行第三个
println
时,您仍在使用原始的
Value
对象,而不是在
test2
中创建的新对象,所以你看到的是
test
而不是
test2
打印出来。

当您向
test2
内部的
str
分配一个新的
Value
对象时,您正在向引用的副本分配一个新的值-您的原始引用(位于
main
内部)不受此重新分配的影响,并且仍然引用原始对象


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

在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());
}

在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());
}

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

 public static void test(Value str) {
    str.setValue("test");
 }
所以当您打印
System.out.println(v.getValue())时它将为您提供
测试
作为输出


接下来调用
test2()
,创建
Value
的新实例,并在新实例中设置值。但不在传递的对象中,因此新创建的对象中的值是
test2
,而在函数
test()
中,旧对象中的值仍然是
test

,您正在传递
value
对象并在该对象中设置一些字符串

 public static void test(Value str) {
    str.setValue("test");
 }
所以当您打印
System.out.println(v.getValue())时它将为您提供
测试
作为输出


接下来调用
test2()
,创建
Value
的新实例,并在新实例中设置值。但不在passed对象中,因此新创建的对象中的值是
test2
,而旧对象中的值仍然是
test

Java是pass-by-value。您通过参数
str
将对
v
的引用的值从
main
传递到
test2
,当
str
被分配到新引用时,该值丢失。Java的可能重复项是pass by value。您通过参数
str
v
的引用值从
main
传递到
test2
,当
str
被分配给新引用时,该值丢失。其ok可能重复。但是传递的引用不应该指向test2()中创建的新对象吗?即使我们在函数内部进行了更改,它仍然指向旧对象。这就是我无法弄清楚的地方?不仅引用的值被复制到新的引用变量,所以仍然是从main中创建的对象的main点,它的值被复制到str,然后当你创建
newvalue()
its ok时,新的值被分配给它。但是传递的引用不应该指向test2()中创建的新对象吗?即使我们在函数内部进行了更改,它仍然指向旧对象。这就是我无法弄清楚的地方?不仅引用的值被复制到新的引用变量,所以仍然是从main中创建的对象的main点,它的值被复制到str,然后在创建
new value()