代码之家  ›  专栏  ›  技术社区  ›  Dead Programmer

java传递值示例帮助我理解

  •  2
  • Dead Programmer  · 技术社区  · 14 年前

    我有以下代码

    class sample
    {
    
      public void update(List l)
      {
          l = null;
      }
    
      public static void main (String[] args)
      {
    
          List m = new ArrayList();
          m.add("suresh");
          m.add("sankar");
          new sample().update(m);
          System.out.println(m);
      }
    }
    

    答案将是{[“suresh”,sankar“]}。这个 m

    7 回复  |  直到 14 年前
        1
  •  3
  •   Jacob Mattison    14 年前

    不,编译器是正确的。:)

    l 包含对指定给的ArrayList对象的引用 m . 更新为null,以及以后使用 update() 是一个单独的变量,其作用域仅在该方法中—它没有链接到 以任何方式(除了它们最初包含对同一对象的引用这一事实)。

        2
  •  2
  •   mdma    14 年前

    理解这一点的关键是要记住,所有对象都是通过引用间接访问的。当对象作为参数传递给方法时,实际传递的“值”是一个引用,而不是对象本身。

    l 中的参数 update 方法,您正在将该特定引用设置为 null -原始参考 m 保持不变,两个引用所引用的对象也保持不变。

    void update(List* l)
    {
       l = NULL; // set the pointer to null - the object (*list) is unmodified
    }
    
    void main()
    {
       List* m = ...;
       update(m);
       printf(m->values());
    }
    

    按值复制。指向的对象(列表*m)没有任何改变。指针的值是从 设置为NULL,这是仅影响 指针。

    下面是一个例子,其中通过引用传递涉及非局部更改,

    class NonLocalChange
    {
       public void change(int[] i) {
          i[0] = 2;
          i = null;
       }
    
       public static void main(String[] s) {
          int[] m = new int[1];
          m[1] = 3;
          change(m);
          System.out.println(i[0]);
       }
    }
    

    打印结果为 2 . 这是因为 change ,而不仅仅是引用本身。

    请注意,这不会引发NullPointerException,即使l被指定为null。和以前一样,它是一个引用,因此它是对该引用值的局部赋值。

        3
  •  1
  •   bshields    14 年前

    你的 update 方法只设置本地 l 参考 null 不改变传入对象的任何内容。

        4
  •  1
  •   mhshams    14 年前

    如果你把m设为X,把l设为X。我们有两个变量引用同一个地址,如果您将其中一个变量更改为null,另一个变量将保留为旧值。

        5
  •  1
  •   Marimuthu Madasamy    14 年前

    比如说, new ArrayList() 返回存储新ArrayList对象的地址2000。

    List m = new ArrayList()

    update(m) : 因为Java总是按值调用,所以它调用update()方法,复制存储在m中的值2000。所以现在update()定义中的参数'l'保存值2000(这也是先前创建的ArrayList对象的地址)。所以我们可以说, l@8888=2000(地址8888处的“l”值为2000)

    l = null : 所以现在,l@8888=null

    System.out.println(m) : 现在m的值是多少?现在还是2000年。update()方法没有更改m的值。该方法刚刚更改了其局部变量“l”的值。所以'm'仍然引用先前创建的ArrayList对象,并且正在打印。

        6
  •  0
  •   back2dos    14 年前

    不,你说得不对。Java和许多其他高级语言一样 call by sharing .

    您可以这样想:对实际参数的引用是通过值传递的。这意味着在被调用函数中,引用最初指向相同的值,因此对值本身的任何更改在被调用函数的范围之外都是可见的,但是对本地引用的任何更改都是不可见的。就好像传递了地址的副本。