代码之家  ›  专栏  ›  技术社区  ›  Ali

Java对象引用/范围问题

  •  8
  • Ali  · 技术社区  · 16 年前

    如果我有这样的成员变量(在类的主体中声明)

    private Dot[] dots=new Dot[numDots];
    

    我循环遍历此数组的所有成员,并且:

    1)将每个点对象传递给另一个类的函数,该类:

    2)如果满足某些条件,则将其传递给第三类的另一个函数

    3)第3类改变了点对象的一些属性

    然后,当这个对象返回到原始/父类时,对其属性所做的那些更改会保留吗?或者它会被第2/3个函数视为局部变量吗?

    2 回复  |  直到 8 年前
        1
  •  12
  •   Eddie    16 年前

    是的,保留对属性的更改。Java是100%传递值,但是,当传递一个对象时,传递的“值”实际上是指向对象的指针。因此,当您更改方法中的对象时,您将更改传入的实际对象。

    也就是说,如果您有以下方法,那么调用方法将看到更改:

    private void updateMyDot(final Dot aDot) {
      aDot.dotColor = new Color(255,255,255);
    }
    

    但如果您执行以下操作,则调用方法将 查看更改。

    private void updateMyDot(/* not final */ Dot aDot) {
      aDot = new Dot();
      aDot.dotColor = new Color(255,255,255);
    }
    

    在第二个示例中,调用方将 查看任何更改,不会看到新创建的 Dot 对象。

        2
  •  2
  •   MBehtemam Erick    9 年前

    对象被传递[ 参考 值为引用时的值 ](从对象继承的事物)、基元值(int、long、double等)按值传递。

    这意味着当一个基元从调用者传递到方法时,它会被复制,而对于一个对象,[ 价值观 ]引用已传递。

    这反过来意味着,当一个对象被一个方法改变时,调用方会看到这些改变,因为它引用了同一个对象。

    相反,当一个方法改变一个基元时,调用方在方法处理副本时看不到这些改变。

    [编辑原因]

    如果Java通过了引用,那么您可以这样做:

    Object x;
    
    x = new Integer(42);
    foo(x);
    System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float
    

    其中foo定义为:

    void foo(Object o)
    {
       o = new Float(43);
    }
    

    因为Java按值传递引用 o = new Float(43); 允许-但调用方中的值将保留为 new Integer(42);