假设我有一个类,其字段之一是对象SampleData
,以及字段的getter和setter。
public class someClass
{
private SampleData sampleData;
public SampleData getSampleData()
{
return sampleData;
}
public void setSampleData( SampleData sampleData )
{
this.sampleData = sampleData;
}
}
说我已经实例化了someClass
。假设我有另一个SampleData
已经可用。所以使用setter我会做以下事情,
someClassInstantiated.setSampleData( anotherSampleData );
为什么我需要使用setter setSampleData
来设置此字段的值?
为什么我不能这样做呢?
SampleData sampleData = someClassInstantiated.getSampleData();
sampleData = anotherSampleData;
答案 0 :(得分:4)
人们似乎忘记了Java仍然使用内存指针来引用数据,它只是隐藏了C / C ++所具有的所有令人敬畏的指针算法;)
所以,基本上,当你执行此操作SampleData sampleData = someClassInstantiated.getSampleData();
时,sampleData
指向与someClassInstantiated.sampleData
相同的内存位置,例如......
然而,当您执行sampleData = anotherSampleData;
时,您更改sampleData
指向的内容位置与anotherSampleData
相同,这不会影响someClassInstantiated.sampleData
指向,它保持不变
因此,如果我指向包含数据的位置,那么为什么为null?如果我在使用getter方法后打印sampleData和anotherSampleData,则sampleData为null而anotherSampleData不为null,但是从你所说的它们指向同一位置
这是因为someClassInstantiated.sampleData
仍然指向null
- 这是在实例化时(基于您的示例)未分配的默认值。
从长远来看,你真的,真的不希望它以你试图使用它的方式工作,因为它违反了封装原则,其中对象负责管理数据。 / p>
答案 1 :(得分:1)
在java中你有引用。平等运算符(=
)用于指定reference variable
以引用Object
。
假设someClassInstantiated.getSampleData()
返回ObjectA
。这是与之相同的对象
private SampleData sampleData;
SampleData sampleData = someClassInstantiated.getSampleData();
目前sampleData
指的是ObjectA
。
还可以假设anotherSampleData
指的是ObjectB
。
sampleData = anotherSampleData;
现在sampleData
指的是ObjectB
。现在,这对private SampleData sampleData;
引用的对象没有任何影响,它仍然引用ObjectA
。
只有当SampleData
的对象是可变的然后使用.
点运算符时,如果状态被修改,则相同的修改状态将通过读取对象的状态来反映出来。参考变量。等式运算符只是指定变量以引用对象(或原始类型值)
答案 2 :(得分:0)
当你写:
SampleData sampleData = someClassInstantiated.getSampleData();
sampleData = anotherSampleData;
在第一行中您引用someClassInstantiated
字段,但是此字段不引用您的对象sampleData,因此更改它不会更改someClassInstantiated
换句话说,这些对象没有绑定在一起。如果您希望在某些其他值更改时更改字段的值,请使用例如observer design pattern