簡體   English   中英

可以在Java中將實例變量聲明為靜態變量

[英]Can instance variable be declared as static variable in java

我寫了以下代碼:

public class Count
{

    private static int[] array;

    public Count( int[] array )
    {
        this.array = array;
    }

    public int count()
    {
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            int x = array[i];
            if (x < 0) {
                if (x == -1 && i > 0 && array[i - 1] == -1) {
                    break;
                }
            } else {
                count++;
            }
        }
        return count;
    }

}

然后在另一堂課中,我寫道:

Count c = new Count(new int[]{1,-1,-1});

並檢查了c.count()的結果。 我沒有遇到編譯器錯誤,但我卻想得到1 我不知道為什么,因為如何將靜態變量分配給實例變量? 而且,如果我創建另一個Count類的實例怎么辦? 它們是否都具有相同的變量?或者只是它們自己的副本? 如果我嘗試通過編寫Count.array來訪問變量, Count.array怎么Count.array 謝謝。

類可以訪問自己的靜態成員。

所有類都將看到相同的靜態成員(忽略線程爭用的復雜性)。

如果創建另一個Count實例,則它們都將修改同一個變量。

那就是static意思...

arrayCount所有實例之間共享-它們都可以從中讀取和寫入。 如您所說,如果您實例對其進行修改,則所有其他實例將看到新修改的值。

我建議您編寫您要詢問並查看的示例。 沒有比JVM更好的權限了,它會比SO更快地告訴您。

我認為您應該了解類和實例變量的含義,並選擇與您的意圖匹配的變量。

所以這是兩個類:

public class Count
{
   // Shared by all 
   private static int[] array;
}

或實例:

public class Count
{
   // Owned by instance
   private int[] array;

   public Count(int [] v) {
       if (v == null) throw new IllegalArgumentException("array cannot be null");
       this.array = new int(v.length);
       System.arraycopy(v, this.array, 0, v.length);
   }
}

您不應該只是將數組引用分配給私有數據成員。 您需要分配內存並將值復制到其中。 否則,如果輸入數組的提供者使用其引用進行更新,則其將修改私有值。

太多的人沒有意識到向私有成員分配可變引用會破壞封裝。 也許您現在不會成為其中之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM