考虑以下代码片段
Form form2 = new Form();
test(form2);
form2.Show();
public void test(Form f)
{
f = null;
}
由于f还包含对Form2的“另一个”引用,因此将f设置为null也应将Form2设置为null,而不是。需要一个很好的解释来理解这一点。
答案 0 :(得分:1)
设置为null
的引用是form2
引用的本地副本。由于引用是按值传递的,意味着制作精确副本并传递副本,原始文件保持不变。
这里传递的值可以看作是一个内存地址(这与虚拟机不完全相同,但它是一个有用且充分的比喻)。
在测试方法中,您将一个包含此地址副本的变量设置为null
。这没有任何进一步的后果。
如果您使用存储在变量中的地址来访问和更改地址所引用的实际Object,则情况会有很大差异。您正在更改此处的实际内容,因此在您的局部变量超出范围后,所有更改都将保留。
再退一步:
您可以将变量视为一张纸条,其中包含朋友的地址(您的对象)。 如果您刻录纸张(将变量设置为空),您的朋友不会受到影响。 如果你使用纸张访问地址并给你的朋友一个礼物或打他的脸(在变量背后的对象上调用一个方法),他肯定会受到影响,你必须承担后果
答案 1 :(得分:0)
(我假设这是Java。)
方法参数始终按值传递。这意味着他们的内容总是复制到一个新变量。在这种情况下,变量f
的内容(包含对象的引用)将复制到新变量中。当新变量的内容被null
替换时,原始变量的内容不受影响 - 它们仍然指向原始对象。