java 核心技術(shù)-12版 卷Ⅰ- 4.4.3 靜態(tài)方法
原文
靜態(tài)方法是不操作對象的方法。例如,Math 類的pow 方法就是一個靜態(tài)方法。以下表達(dá)式
Math.pow(x,a);
會計算 x^a 。它并不使用Math 對象的來完成這個任務(wù)。換句話說,它沒有隱式參數(shù)。
可以認(rèn)為靜態(tài)方法是沒有this 參數(shù)的方法(在一個非靜態(tài)方法中,this參數(shù)指示這個方法的隱式參數(shù)參見4.3.7 節(jié))。
Employee 類的靜態(tài)方法不能訪問id實(shí)例字段,因?yàn)樗⒉徊僮鲗ο?。但是,靜態(tài)方法可以訪問靜態(tài)字段。下面是這樣一個靜態(tài)方法的示例:
要調(diào)用這個方法,需要提供類名:
int n = Employee.advanceId();
這個方法可以省略關(guān)鍵字static 嗎?答案是肯定的。但是這樣一來,你就需要通過Employee類型的對象引用來調(diào)用這個方法。
注釋:可以使用對象調(diào)用靜態(tài)方法,這是合法的。例如,如果harry 是一個Employee對象,那么可以調(diào)用harry.advanceId(); 而不是 Employee.advancedId()。不過,我發(fā)現(xiàn)這種寫法很容易造成混淆,其原因是advanceId方法計算的結(jié)果與harry 毫無關(guān)系。我們建議使用類名而不是對象來調(diào)用靜態(tài)方法。
下面兩種情況可以使用靜態(tài)方法:
方法不需要訪問對象狀態(tài),因?yàn)樗枰乃袇?shù)都通過顯式參數(shù)提供(例如Math.pow)。
方法只需要訪問類的靜態(tài)字段(例如 Employee.advanceId)
C++ 注釋 : Java中的靜態(tài)字段與靜態(tài)方法在功能上與C++相同。但是,語法稍有所不同。在C++中,要使用:: 操作符訪問作用域之外的靜態(tài)字段或靜態(tài)方法,如Math::PI。
術(shù)語“靜態(tài)”有一段不尋常的歷史。起初,C引入關(guān)鍵字static 是為了表示退出一個塊后依然存在的局部變量。在這種情況下,術(shù)語“靜態(tài)”是有意義的:變量一直保留,當(dāng)再次進(jìn)入這個塊時它仍然存在。隨后,static在C中有了第二種含義,表示不能從其他文件訪問的全局變量和函數(shù)。重用關(guān)鍵字static 只是為了避免引入一個新的關(guān)鍵字。最后,C++第三次重用了這個關(guān)鍵字,與之前賦予的含義完全無關(guān),它指示屬于類而不屬于任何特定類對象的變量和函數(shù)。這與Java中這個關(guān)鍵字的含義相同。