让我们考虑这个例子:
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
关键字,但我无法使用方法设置。
答案 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());
答案 1 :(得分:2)
制作属性变量static
。
答案 2 :(得分:1)
你实际上用你的问题标题“在Java中共享类属性”暗示了解决方案。
在您的示例中,attribute
是一个实例变量,这意味着您的Shared
类(s1
和s2
)的每个实例都获得了自己的变量副本是独立更新的。
你需要的是一个类变量,即在所有类的实例中共享的东西。在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时,它们都具有单独的属性字段。
如果要让类的所有实例共享值,则需要具有类级别字段,您必须将属性变量声明为静态,并且它的值将取决于所有实例的调用增加方法。