Java 这一点如何符合;引用的传递值“;在爪哇?
在下面的代码中,为什么foo2在system.out.print打印其数据时为空Java 这一点如何符合;引用的传递值“;在爪哇?,java,pass-by-reference,pass-by-value,Java,Pass By Reference,Pass By Value,在下面的代码中,为什么foo2在system.out.print打印其数据时为空 public class Helper { public void shadowCopy(Foo foo1, Foo foo2){ foo2 = foo1; } public static void main(String[] args) { Helper h = new Helper(); Foo foo1 = new Foo(50);
public class Helper {
public void shadowCopy(Foo foo1, Foo foo2){
foo2 = foo1;
}
public static void main(String[] args) {
Helper h = new Helper();
Foo foo1 = new Foo(50);
Foo foo2= null;
h.shadowCopy(foo1, foo2);
System.out.println(foo2.data);// why java.lang.NullPointerException?
}
public static class Foo {
public int data=0;
public Foo(int data){
this.data = data;
}
}
}
在
shadowCopy
中,foo2
是对main
中的foo2
所指对象的复制引用。但是,它仅指定其本地foo2
引用来引用与foo1
相同的对象。它不会更改main
中的foo2
参考变量,该变量保持为null
。这就导致了NPE
要获得所需的行为,只需放置
foo2=foo1代码>在main
中,因此您没有处理引用变量的副本。好吧,因为foo2
在main方法中为空,并且您正在尝试访问其数据
字段
引用是按值传递的,因此shadowCopy()
将foo1
引用的副本分配给foo2
引用的副本。main中的foo2
的值保持不变。Java只通过值传递,因此您的shallowCopy
方法没有任何作用。@Cgraphics foo2为null,因此它将使foo1也为null。它是通过引用而不是通过值来实现的。表示整个对象为空,而不仅仅是数据部分…@PetershadowCopy
,而不是shallowCopy