【问题标题】:Java object reference/scope questionJava 对象引用/范围问题
【发布时间】:2010-10-11 23:57:02
【问题描述】:

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

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

我遍历这个数组的所有成员,并且:

1) 将每个 Dot 对象传递给另一个类的函数,其中:

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

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

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

【问题讨论】:

  • 我喜欢你的名字,没有阅读问题就投了赞成票。

标签: java oop scope


【解决方案1】:

是的,对属性的更改将被保留。 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】:

    对象通过 [reference value 其中值是引用](从 Object 继承的东西)、原始值(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);

    【讨论】:

    • 正如在其他一百万个地方所说的那样,这并不完全正确。 Java中的所有参数都是按值传递的。但是,对象变量实际上是指对象引用。将对象作为方法参数传递会复制对象变量,即复制引用。
    猜你喜欢
    • 2013-04-01
    • 2017-06-05
    • 2017-12-24
    • 2014-02-12
    • 2012-05-29
    • 1970-01-01
    • 2021-04-10
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多