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