传递对象Java
以下Java代码之间的区别是什么?我无法清楚地了解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
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()