Static 的意義與實作方式
?
Class(static) field :共用一塊記憶體class(static) method :共用一塊記憶體
instance( 非 static) field :隨著每個 instance 各有一塊記憶體
instance ( 非 static) method :共用一塊記憶體
??? instance method 為什么不是隨著每個 instance 占有一塊記憶體,反倒是共用一塊記憶體?其實,讓每個 instance method 如同 instance field 一樣,隨著每個 instance 占有一塊記憶體,這么做當然是可以的,只是 Java 編譯器和 JVM 都不這么做,因為太浪費記憶體空間了。一個 field 少則占用一個 byte ,多則占用數百 Byte ,但是 method 少則數個 byte ,多則數百 Kilo Byte 。 Mehtod 耗費的記憶體是 field 的數百倍,甚至數千倍,當然是能共用就盡量共用,比較不會消耗記憶體。既然 JVM 讓一個 class 的所有 instance 共用相同的 instance method ,下面兩行程式碼在 instanceMethod() 內部時,如何區分是 instance1 或 instance2 ?
instance1.instanceMethod();
instance2.instanceMethod();
因為編譯器會幫我們在把 instance1 和 instance2 個別傳入 instanceMethod() 中當作第一個參數。也就是說,任何 instance method 參數的實際個數都會比表面上多一個,這個多出來的參數是由 Java 編譯器幫我們加上去的,用來代表對應的 instance 。此參數的變數名稱為 this ,也是 Java 的一個關鍵字( keyword )。
??? 當調用某個 instance method 或使用某個 instance field 時,你必須在前面加上該 instance 的名稱,如果該 instance method/field 相關的 instance 和當時程式碼所在的 instance method 的 instance 指的是同一個 instance 時,該 instance 的名稱就是 this ,這種情況下,你也可以選擇不在前面加上「 this. 」。
??? 然而,在某些狀況下,非得在前面加上「 this. 」不可。例如,當 method 中的參數或區域變數和 instance field 名稱完全相同時,如果不在前面冠上「 this. 」,那么指的是參數或區域變數;如果在前面冠上「 this. 」,那么指的才是 instance field 。
轉自http://www.aygfsteel.com/guoyongfei/archive/2009/02/06/253571.html