初始化物件,靜態屬性值不正確

2021-08-25 09:13:18 字數 725 閱讀 7643

問題**:

class singleton

public static singleton getinstance()

}public class mymain

}執行結果是:

obj.counter1==1

obj.counter2==0

你有沒有被此結果嚇一跳?乍看程式**,你很可能會認為counter1和counter2的值一定會相等,但執行結果顯然不是如此.

因為程式在class constructor內,還未將static field初始化時(這時候,counter1和counter2都是0),就呼叫instance constructor,而instance constructor竟然還會去更動static field的值,使得counter1和counter2都變成1。然後instance constructor執行完,回到class constructor,再把counter2的值設為0(但是counter1維持不變)。最後的結果:counter1等於1,counter2等於0。

改正程式,方法有三:

-方法一:將singleton field的宣告調到counter1與counter2 field之後。這是最好的作法。

-方法二:將counter2=0的宣告中,「=0」的部分刪除。這種作法只有在希望

-方法三:將初始化的動作搬到class constructors內,自行撰寫,而不依賴編譯器產生。這是最保險的作法。

靜態物件如何初始化?

介紹 當編譯乙個c 程式時,計算機的記憶體被分成了4個區域,乙個包括程式的 乙個包括所有的全域性變數,乙個是堆疊,還有乙個是堆 heap 我們稱堆是自由的記憶體區域,我們可以通過new和delete把物件放在這個區域。你可以在任何地方分配和釋放自由儲存區。但是要注意因為分配在堆中的物件沒有作用域的限...

靜態屬性 靜態方法與靜態初始化器

靜態屬性 靜態方法與靜態初始化器 static稱為靜態修飾符,它可以修飾類中的屬性和方法。1 靜態屬性 被static修飾的屬性稱為靜態屬性,這類屬性乙個最本質的特點是 它們是類的屬性,而不屬於任何乙個類的具體物件。換句話說,對於該類的任何乙個具體物件而言,靜態屬性是乙個公共的儲存單元,任何乙個類的...

java 物件屬性初始化順序

a 類的初始化 順序如下 為靜態屬性分配記憶體並賦值 後面大括號語句不執行,這裡是初始化,只是新增變數和值 或 執行靜態 塊 立刻執行大括號裡面的語句 為什麼這樣說呢,因為誰在前先載入誰,包括靜態屬性之間,和靜態塊之間的順序,但是注意,雖然順序都可以當第一,但是靜態塊 靜態屬性執行的東西完全不一樣,...