Java停止变量获取类的更新

时间:2019-03-25 21:26:01

标签: java class oop

我遇到了一个问题,因为我的类变量会自动更新为最新值。但是我想为每个对象分配单独的值。

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为“第二”?

2 个答案:

答案 0 :(得分:0)

您的cc1共享完全相同的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 属性。