Java 这一点如何符合;引用的传递值“;在爪哇?

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);

在下面的代码中,为什么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);
        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。它是通过引用而不是通过值来实现的。表示整个对象为空,而不仅仅是数据部分…@Peter
shadowCopy
,而不是
shallowCopy