2011-08-26 56 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; 

它必須初始化或者在聲明或類的構造內 - 這就是爲什麼你無法從一個方法中值分配給它。