【问题标题】:How does this fit in the "pass by value of refrences" in java? [duplicate]这如何适合 java 中的“通过引用值传递”? [复制]
【发布时间】:2014-09-10 18:25:18
【问题描述】:

在下面的代码中,为什么 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;
        }
    }

}

【问题讨论】:

  • Java 仅按值传递,因此您的 shallowCopy 方法不会执行任何操作。
  • @Cgraphics foo2 为空,因此它会使 foo1 也为空。它是通过引用而不是通过价值。意味着您整个对象为空,而不仅仅是数据部分...
  • @Peter shadowCopy,而不是 shallowCopy

标签: java pass-by-reference pass-by-value


【解决方案1】:

shadowCopy 中,foo2 是对main 中的foo2 所引用的同一对象的复制引用。但是,它只分配其本地 foo2 引用来引用与 foo1 相同的对象。它不会更改main 中的foo2 引用变量,它仍然是null。这导致了 NPE。

要获得所需的行为,只需将foo2 = foo1; 放在main 中,这样您就无需处理引用变量的副本。

【讨论】:

    【解决方案2】:

    好吧,因为 foo2 在 main 方法中为 null,而您正试图访问其 data 字段。

    引用按值传递,因此shadowCopy()foo1 引用的副本 分配给foo2 引用的副本。 main 中foo2 的值保持不变。

    【讨论】:

      猜你喜欢
      • 2021-02-09
      • 2014-12-21
      • 2012-09-07
      • 2017-02-19
      • 2010-10-10
      • 2012-03-30
      • 2019-09-01
      • 1970-01-01
      • 2013-09-10
      相关资源
      最近更新 更多