轉自:http://joe5456536.blog.163.com/blog/static/8537477320117136658629/
http://www.cnblogs.com/devinzhang/archive/2012/04/27/2473570.html
我知道靜態變量的使用要很小心,因為它在每個對象中是共享的。但是對於靜態方法我的認識只局限於下面:
● 生命周期(Lifecycle):
靜態方法(Static Method)與靜態成員變量一樣,屬於類本身,在類裝載的時候被裝載到內存(Memory),不自動進行銷毀,會一直存在於內存中,直到JVM關閉。
非靜態方法(Non-Static Method)又叫實例化方法,屬於實例對象,實例化后才會分配內存,必須通過類的實例來引用。不會常駐內存,當實例對象被JVM 回收之后,也跟着消失。
●
效率
靜態方法的使用效率比非靜態方法的效率高。
按照上面的概念,只要內存夠用,都可以使用靜態的。使用靜態方法會帶來什么問題呢
● 線程安全
靜態方法是共享代碼段,靜態變量是共享數據段。既然是“共享”就有並發(Concurrence)的問題。
非靜態方法是針對確定的一個對象的,所以不會存在線程安全的問題。
靜態方法和實例方法是一樣的,在類型第一次被使用時加載。調用的速度基本上沒有差別。
-
不需要生成對象的 經常頻繁使用的 工具類里的(如SqlHelper)
-
適當地使用static方法本身並沒有什么,當一個人從來不懂使用多態、接口設計時,很自然地會濫用static方法。
-
個人理解在多個類中需要調用並且是與對象無關的方法可設為靜態方法,方便調用。
-
所有對象共有的方法
-
再不關系到任何於特定對象相關的操作 比如學生的年齡就是學生的相關。 修改學生的年齡就不適合用靜態方法。 一般來說,如果你的方法里沒有用到this關鍵字, 那就適合用靜態方法
-
通常通用的類中一些常用的方法可以設計為靜態類
-
只要是沒有用到類的狀態信息,只從參數獲取信息的都可以為靜態的
-
可以實現某些特殊的設計模式:如Singleton
-
由於沒有this指針,可以把某些系統API的回調函數以靜態函數的形式封裝到類的內部
-
可以封裝某些算法,比如數學函數,如ln,sin,tan等等,這些函數本就沒必要屬於任何一個對象,所以從類上調用感覺更好
-
總之,從OOA/OOD的角度考慮,一切不需要實例化就可以有確定行為方式的函數都應該設計成靜態的
-
靜態方法與非靜態方法最明顯的區別就是如果某個方法是公共靜態的,那么可以直接通過類名.方法名的方法來調用,而公共實例方法則需要事先實例化對象,然后才能調用。