传递对象引用变量

时间:2015-03-23 18:49:20

标签: java

这是来自着名的SCJP Java书。我的问题是dim如何在这里获得11的值。

import java.awt.Dimension;
class ReferenceTest {
    public static void main (String [] args) {
        Dimension d = new Dimension(5,10);
        ReferenceTest rt = new ReferenceTest();
        System.out.println("Before modify() d.height = "+ d.height);
        rt.modify(d);
        System.out.println("After modify() d.height = "+ d.height);
    }
    void modify(Dimension dim) {
        dim.height = dim.height + 1;
        System.out.println("dim = " + dim.height);
    }
}

当我们运行这个类时,我们可以看到modify()方法确实能够修改在第4行创建的原始(且唯一)Dimension对象。

C:\Java Projects\Reference>java ReferenceTest
Before modify() d.height = 10
dim = 11
After modify() d.height = 11

注意当第4行的Dimension对象传递给modify()方法时,对方法内部发生的对象的任何更改都将对传递了引用的对象进行。在前面的示例中,引用变量d和dim都指向同一个对象。

1 个答案:

答案 0 :(得分:1)

  

我的问题是dim如何在这里得到11的值

dim dim.height。当代码将dim传递给方法时,传入的值是对对象的引用。然后,该方法修改该对象的状态(根本不修改引用),因此调用代码会看到更新后的状态。

此代码:

Dimension d = new Dimension(5, 10);

在内存中产生类似的东西:

+-------------+
|      d      |
+-------------+     +--------------------+
| (reference) |---->| Dimension instance |
+-------------+     +--------------------+
                    | width: 5           |
                    | height: 10         |
                    +--------------------+

该变量包含一个引用内存中别处对象的值。您可以复制该值(称为对象引用),例如将其传递给方法,但它仍然引用同一个对象。

因此,当我们将modify传递给modify时,我们有:{/ p>

+-------------+
|      d      |
+-------------+
| (reference) |--+
+-------------+  |
                 |  +--------------------+
                 +->| Dimension instance |
                 |  +--------------------+
                 |  | width: 5           |
                 |  | height: 10         |
                 |  +--------------------+
+-------------+  |
|     dim     |  |
+-------------+  |
| (reference) |--+
+-------------+

现在,ddim都有一个值的副本,告诉JVM对象在内存中的位置。

这是对象如何工作的基础:变量,数据成员和参数保存的值是对象的引用,而不是对象的副本。它就像JVM可用于在内存中的其他位置查找对象的数字。

基元实际上保存在变量/ data成员/参数中:

int n = 10;

给我们:

+----+
| n  |
+----+
| 10 |
+----+

...但变量/数据成员/参数不包含对象,它们包含引用对象的值。