2011-08-26 52 views
1
属性

让我们看看这个例子:调用getAttribute(),而不是11共享类的Java

像一个全局变量时

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(); 
    }  
} 

我怎样才能改变这一类,以便在输出12,我尝试了final关键字,但我无法使用方法设置某些内容。

回答

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

2

使属性变static

0

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

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

1

您实际上暗示您的问题标题为“Sharing class attributes in 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.

1

如果您制作变量static,它将由该类的所有实例共享,这在您的示例中是您需要的。要对您尝试使用的final关键字进行一些说明 - final关键字用于标记只能初始化一次的变量。一类成员变量,诸如一个你上面所定义:

private int attribute; 

它必须初始化或者在声明或类的构造内 - 这就是为什么你无法从一个方法中值分配给它。