Posted on 2010-12-30 01:20
leekiang 閱讀(399)
評論(0) 編輯 收藏 所屬分類:
java
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.tkk7.com/guoyongfei/archive/2009/02/06/253571.html