實例方法和類別方法的定義
在方法宣告時,方法類型前面不加關鍵字static修飾的是實例方法,加上關鍵字static修飾的是類別方法,也稱為靜態方法。
例如:
classMain{inta;floatmax(floatb,floatc){//實例方法…}staticfloatmax(floatd,floate){//類別方法…}}
實例方法和類別方法的區別
1. 物件呼叫實例方法:
當類別的字節碼檔案載入到記憶體時,類別的實例方法不會被分配入口位址,只有該類別建立物件後,類別中的實例方法才會分配入口位址,從而實例方法可以被類別建立的任何對象調用執行。
注意:
當我們創建第一個物件時,類別中的實例方法就分配了入口地址,當再創建對象時,不再分配入口地址,也就是說,方法的入口地址被所有的對象共享,當所有的對象都不存在時,方法的入口位址才被取消。
實例方法中不僅可以操作實例變量,還可以操作類別變數。當物件呼叫實例方法時,該方法中出現的實例變數和類別變數都是指派給該物件的變量,只不過類別變數和其他所有的物件共用而已。
2. 類別名稱呼叫類別方法:
對於類別中的類別方法,當該類別被載入到記憶體時,就分配了對應的入口位址,從而類別方法不僅可以被類別建立的任何物件呼叫執行,也可以直接透過類別名稱呼叫。類別方法的入口位址直到程式退出才被取消。
注意:
實例方法不能透過類別名稱調用,只能由物件來調用。而且因為在類別創建物件之前,實例成員變數還沒有分配內存,所以類別方法不可以操作實例變數。
3. 類別方法的設計原則:
如果一個方法不需要操作類別中的任何實例變量,就可以滿足程式的需要,就可以考慮將這樣的方法設計為一個static方法。
對於static方法,不必建立物件就可以用類別名稱直接呼叫它,如果建立物件會導致類別中的實例變數被分配記憶體空間。