在Java中共享类属性

时间:2011-08-26 09:18:05

标签: java class attributes share

让我们考虑这个例子:

public class Shared {

    private int attribute;

    public Shared() {}

    public void incrementAttribute(int i) {
            attribute += i;
    }

    public int getAttribute() {
            return attribute;
    }

    public static void main(String[] args) {
            Shared s1 = new Shared();
            Shared s2 = new Shared();

            s1.incrementAttribute(1);
            s2.incrementAttribute(1);

            s1.getAttribute();
            s2.getAttribute();
    }    
}

如何在调用1而不是2 getAttribute()

时更改此类以使1 1输出

类似于全局变量,我尝试了final关键字,但我无法使用方法设置。

5 个答案:

答案 0 :(得分:5)

您需要制作属性static

private static int attribute;
        ^^^^^^

声明为static的成员将在该类的所有实例之间共享。


此外,要输出1 2,您需要更改

s1.incrementAttribue(1);
s2.incrementAttribue(1);

System.out.println(s1.getAttribute());
System.out.println(s2.getAttribute());

s1.incrementAttribue(1);
System.out.println(s1.getAttribute());

s2.incrementAttribue(1);
System.out.println(s2.getAttribute());

ideone.com demonstration

答案 1 :(得分:2)

制作属性变量static

答案 2 :(得分:1)

你实际上用你的问题标题“在Java中共享属性”暗示了解决方案。

在您的示例中,attribute是一个实例变量,这意味着您的Shared类(s1s2)的每个实例都获得了自己的变量副本是独立更新的。

你需要的是一个类变量,即在所有类的实例中共享的东西。在Java中,这也称为静态变量。将static关键字添加到attribute变量的声明中,以将其从实例变量更改为类变量:

public class Shared {
  private static int attribute;

  public Shared() {}

  public void incrementAttribute(int i) {
    attribute += i;
  }

  public int getAttribute() {
    return attribute;
  }

  public static void main(String[] args) {
    Shared s1 = new Shared();
    Shared s2 = new Shared();
    s1.incrementAttribute(1);
    System.out.println(s1.getAttribute());
    s2.incrementAttribute(1);
    System.out.println(s2.getAttribute());
  }
}

- 你需要在递增后立即打印出值,否则你得到输出2 2。

答案 3 :(得分:1)

如果你创建变量static,那么它将由类的所有实例共享,这是你的示例中所需的。要对您尝试过的final关键字做一些澄清,final关键字用于标记只能初始化一次的变量。对于类成员变量,例如您在上面定义的变量:

private int attribute;

它必须在声明或类构造函数中初始化 - 这就是为什么你无法从方法中为它赋值。

答案 4 :(得分:0)

由于您的属性是一个实例字段,因此您创建的每个对象都将包含一个属性字段实例。因此,当您创建2个对象s1和s2时,它们都具有单独的属性字段。

如果要让类的所有实例共享值,则需要具有类级别字段,您必须将属性变量声明为静态,并且它的值将取决于所有实例的调用增加方法。