对象的引用不是更新对象
嗨,我正在使用看起来像这样的代码。
class A { Custom objA; public A() { //Assign some value to objA; B obj = new B(objA); } } class B { Custom objB; public B(Custom obj) { this.objB = obj; } public void Func() { this.objB = null; } }
其中Custom
是自定义可空类型。
现在,根据我的知识,每当我调用class B
的Func()
时,必须更新objA
以使值为null。 然而,这不是正在发生的事情。
我在这里做错了吗?
首先,在第5行,您有语法错误。 如果您正在尝试创建B
的新实例,则可以执行B obj = new B(objA)
。 但我只能猜测。
你想要做的是修改objA
,方法是将它传递给B
类的新对象,将其存储在一个字段中,然后修改字段。 问题是您存储的内容是对objA
的引用的副本。 当你执行this.objB = null
,你正在修改字段objB
以获得一个新的引用( null
),但是你没有对字段objA
做任何事情,它是A
类实例的成员。
在我看来,这是您在问题中询问的代码:
class A { Custom objCustom; public A() { objCustom = new Custom(); B objB = new B(objCustom); objB.Func(); } } class B { Custom objCustom; public B(Custom objCustom) { this.objCustom = objCustom; } public void Func() { this.objCustom = null; } }
这编译并具有相当一致的命名约定。
你在A
类和B
类中A
Custom objCustom
字段的问题是,即使它们在调用.Func()
之前都引用了同一个实例,你需要理解Custom objCustom
字段只是对象的引用,而不是对象本身。 因此,当您调用.Func()
您将在objB
为Custom objCustom
分配一个新引用,但是您没有对objA
的引用执行任何objA
。 它仍然指向原始对象。
在函数Func
您为B
对象(不是A
对象)的字段分配null
,因此在此对象之后, B
对象的调用字段objB
未指向Custom
类型的任何对象,但是A
对象的objA
字段仍指向单个Custom
宾语。
这是代码示例,其中Func
将更改A
对象的objA
字段:
class A { public Custom objA = new Custom(); public A() { B obj = new B(this); B.Func(); // after this, objA field will be null } } class B { А obj; public B(А obj) { this.obj = obj; } public void Func() { obj.objA = null; } }
另请注意:
- 当你创建一个
A
对象时,它的objA
字段是null
,所以在A
构造函数中你实际上调用了B obj = new B(null);
,所以它的objB
字段也是null
。 - 在构造
A
对象之后,将处理类型为B
对象obj
,因为您没有对其进行引用,因此您不在示例中调用Func
函数。