我遇到了一个问题,因为我的类变量会自动更新为最新值。但是我想为每个对象分配单独的值。
public class B {
public String state;
public B(){
this.state = "new";
}
public void firstMethod(){
this.state = "first";
}
public void secondMethod(){
this.state = "second";
}
}
public abstract class C {
public B b;
public C(B service){
this.b = service;
}
public abstract void execute();
}
public static void main(String[] args) {
B b = new B();
C c = new C(b) {
@Override
public void execute() {
b.firstMethod();
}
};
C c1 = new C(b) {
@Override
public void execute() {
b.secondMethod();
}
};
c.execute();
c1.execute();
System.out.println(c.b.state);
System.out.println(c1.b.state);
}
我得到的c和c1的状态都等于“第二”。我知道如果我创建两个单独的B对象,即b1和b2并在初始化时将它们传递给c和c1,那么它将给我不同的结果。但是,是否可以通过将相同的对象传递给c和c1来使c.state为“第一”和c1.state为“第二”?
答案 0 :(得分:0)
您的c
和c1
共享完全相同的B
对象,即b
。
由于我们正在讨论的state
属于b
,因此只有一个-叫做b.state
。
如果您希望state
不同,则不能将相同的B
对象与两个C
对象一起使用。
这可能归结为对赋值和参数传递的参考语义的误解。赋值和参数传递都不会复制对象。
但是有什么方法可以将c.state设置为“ first”,将c1.state设置为“ first” 将第二个对象同时传递给c和c1的“第二个”?
这可能行不通。假设单个B
对象可以以某种方式具有任意数量的state
值。每当您写b.state
时,系统如何知道您的意思?
嗯,这并不是我写的完全正确的。如果C
的构造函数仅使用其B
对象创建一个全新的副本,从而保留该副本而不是原始副本,那么您将达到效果;世界上将有三个B
对象,即原始对象,c
复制的对象和c1
复制的对象。但这与仅传递单独的B
实例开始相比没有任何优势。
答案 1 :(得分:0)
您在2个对象中使用了B类的相同实例,因此状态变量将始终由最后调用的方法更新,您需要使用B的另一个实例来具有两个分开的 state 属性。