如何从我在该类中创建的类访问类的变量?

时间:2013-02-18 09:05:05

标签: java class

我有两个班级:

public class A{
    ArrayList<Runnable> classBList = new ArrayList<Runnable>();
    int x = 0;

    public A(){
        //This code here is in a loop so it gets called a variable number of times
        classBList.add(new B());
        new Thread(classBList.get(classBList.size())).start();
    }
}

public class B implements Runnable{
    public B(){

    }

    public void run(){
        //Does some things here. blah blah blah...
        x++;
    }
}

问题是我需要让B类的实例更改类A中的变量x,即创建类B的类。但是,我不知道如何让B类知道它需要更改价值或是否可以。任何关于如何改变它的建议将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:3)

您需要授予B实例访问A实例的权限。有几种方法可以做到这一点:

  1. B派生A,并在protected中为A制作数据字段(或访问者)B。我倾向于回避这一点。

  2. A在其构造函数中接受B个实例。

  3. A接受在其构造函数中实现某个接口的类的实例,并public TheInterface { void changeState(); } public class A implements TheInterface { ArrayList<Runnable> classBList = new ArrayList<Runnable>(); int x = 0; public A(){ //This code here is in a loop so it gets called a variable number of times classBList.add(new B(this)); // <=== Passing in `this` so `B` instance has access to it new Thread(classBList.get(classBList.size())).start(); } // Implement the interface public void changeState() { // ...the state change here, for instance: x++; } } public class B implements Runnable{ private TheInterface thing; public B(TheInterface theThing){ thing = theThing; } public void run(){ // Change the thing's state thing.changeState(); } } 实现该接口。

  4. 您选择的是由您自己决定的。我已经以大致递减的耦合顺序给出它们,其中松散耦合越多(通常)越好。

    代码中的第三个选项:

    A

    现在,BTheInterface都与A相关联,但只有BB相关联; A未与{{1}}相关联。

答案 1 :(得分:1)

您需要在B类中扩展A类,即:

public class B extends A implements Runnable {
}

这将Class B设置为A类的子类,并允许它访问其变量。

答案 2 :(得分:1)

您需要让类B以某种方式了解类A的哪个实例创建它。 它可以引用其创建者,例如:

public class B implements Runnable{
    private A creator;
    public B(A a){
        creator = a;
    }

    public void run(){
    //Does some things here. blah blah blah...
    x++;
    }
}

然后在从类A构建它时传递创建者:

...
classBList.add(new B(this));
...