Java 如何在构造函数中添加观察者?
因为我将registerObserver方法应用于weatherdata,但出于某种原因,它也在subject中注册。我不知道为什么Java 如何在构造函数中添加观察者?,java,object,design-patterns,observer-pattern,Java,Object,Design Patterns,Observer Pattern,因为我将registerObserver方法应用于weatherdata,但出于某种原因,它也在subject中注册。我不知道为什么 请有人给我解释一下。假设您有以下代码场景: public ShowEstadistics(WeatherData subject) { this.weatherdata=subject; this.weatherdata.registerObserver(this); }
请有人给我解释一下。假设您有以下代码场景:
public ShowEstadistics(WeatherData subject) {
this.weatherdata=subject;
this.weatherdata.registerObserver(this);
}
在这种情况下,你认为y的值是多少?它是包含5的整数对象吗?
答案是包含2的整数对象
当我们说整数x=新整数(4)
时,我们的意思是x指向内存中的一个地址,该地址有一个包含值4的对象。类似地,对于y,y指向内存中的一个地址,该地址有一个值为5的对象。
然后写入y=x
表示我们移除了对象包含5的地址上的指针,并将其指向x所指向的当前值为5的对象。包含5的对象的地址不再有任何变量指向它,因此,您不能调用或修改其值。将x和y指向的地址对象更改为值为2且x=new Integer(2)
的对象后,调用这些变量中的任何一个都将返回相同的对象(因为它们具有相同的引用)
现在,这是一个基于
Integer
对象类型的基本示例,但可以应用于任何更复杂的对象。因为subject
和weatherdata
引用相同的对象。不幸的是,您选择了一个基本数据类型来演示引用类型的行为。因此,你的例子是完全错误的;y
的值不是2
。您是对的。这是一个灾难性的错误。我忘记了基本类型的行为是不同的。我编辑了答案,谢谢。不幸的是,您选择了Integer
作为演示,这里是通过值传递的。因此,您的示例仍然是完全错误的,因为y
的值是4
。您还使用了不推荐使用的构造函数。
public ShowEstadistics(WeatherData subject) {
this.weatherdata=subject;
this.weatherdata.registerObserver(this);
}
Integer x=new Integer(4);
Integer y=new Integer(5);
y=x;
x=new Integer(2);