这是来自着名的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都指向同一个对象。
答案 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) |--+ +-------------+
现在,d
和dim
都有一个值的副本,告诉JVM对象在内存中的位置。
这是对象如何工作的基础:变量,数据成员和参数保存的值是对象的引用,而不是对象的副本。它就像JVM可用于在内存中的其他位置查找对象的数字。
基元实际上保存在变量/ data成员/参数中:
int n = 10;
给我们:
+----+ | n | +----+ | 10 | +----+
...但变量/数据成员/参数不包含对象,它们包含引用对象的值。