假设我有一个名为的类和构造函数TestClass
。
public class TestClass {
Foo foo;
public TestClass(Foo foo) {
this.foo = foo;
}
}
在这里,构造函数接受一个对象,该对象是class的实例Foo
。假设我static void main(String[] args)
做了以下与任何事情完全分开的事情TestClass
;
(1)实例化 foo
(2)将实例传递foo
给TestClass
构造函数
(3)改变内部状态 foo
步骤(3)之后,我的实例foo
内的状态TestClass
也会更改吗?
它没有通过引用传递。相反,它是通过引用的值传递的,这是一个微妙但重要的区别。
在您foo
对main()
方法的其余部分进行foo
突变后,正如您声明的那样,该字段还将显示这些突变,因为两个变量都指向同一实例。但是,如果您重新分配 foo
新内容,则该foo
字段不会更改。如果foo
确实是通过引用传递的,那将是不正确的。简而言之,一切都通过Java中的值传递。碰巧对象通过引用处理,因此这些引用的值被传递。
我将举一个例子来说明这一点。考虑以下类别:
class A {
public int n;
public A(int n) {
this.n = n;
}
}
和以下方法:
public static void mutate(A a) {
a.n = 42;
}
现在我们可以有这样的事情:
A a = new A(0);
A.mutate(a);
System.out.println(a.n);
42
我们可以看到的状态a
已更改mutate()
。现在让我们修改静态方法:
public static void mutate(A a) {
a = new A(42);
}
然后再试一次:
A a = new A(0);
A.mutate(a);
System.out.println(a.n);
0
如您所见,的状态a
不变。如果已将引用传递给函数,则我们期望重新分配的效果在方法的范围之外显而易见。但是,实际上已经通过了一些引用,因为对参数进行更改也会导致方法之外的更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句