java 靜態方法分析

詳見: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp65

 

1、大家都以爲“實例方法需要先創建實例纔可以調用,比較麻煩,靜態方法不用,比較簡單” 
事實上如果一個方法與他所在類的實例對象無關,那麼它就應該是靜態的,而不應該把它寫成實例方法。所以所有的實例方法都與實例有關,既然與實例有關,那麼創建實例就是必然的步驟,沒有麻煩簡單一說。 當然你完全可以把所有的實例方法都寫成靜態的,將實例作爲參數傳入即可,一般情況下可能不會出什麼問題。 
從面向對象的角度上來說,在抉擇使用實例化方法或靜態方法時,應該根據是否該方法和實例化對象具有邏輯上的相關性,如果是就應該使用實例化對象 反之使用靜態方法。這只是從面向對象角度上來說的。 如果從線程安全、性能、兼容性上來看 也是選用實例化方法爲宜。 
2、大家都以爲“ 靜態方法常駐內存,實例方法不是,所以靜態方法效率高但佔內存。” 
事實上,他們都是一樣的,在加載時機和佔用內存上,靜態方法和實例方法是一樣的,在類型第一次被使用時加載。調用的速度基本上沒有差別。 
3、大家都以爲“ 靜態方法在堆上分配內存,實例方法在堆棧上” 
事實上所有的方法都不可能在堆或者堆棧上分配內存,方法作爲代碼是被加載到特殊的代碼內存區域,這個內存區域是不可寫的。 
方法佔不佔用更多內存,和它是不是static沒什麼關係。 
因爲字段是用來存儲每個實例對象的信息的,所以字段會佔有內存,並且因爲每個實例對象的狀態都不一致(至少不能認爲它們是一致的),所以每個實例對象的所以字段都會在內存中有一分拷貝,也因爲這樣你才能用它們來區分你現在操作的是哪個對象。 
但方法不一樣,不論有多少個實例對象,它的方法的代碼都是一樣的,所以只要有一份代碼就夠了。因此無論是static還是non-static的方法,都只存在一份代碼,也就是隻佔用一份內存空間。 
同樣的代碼,爲什麼運行起來表現卻不一樣?這就依賴於方法所用的數據了。主要有兩種數據來源,一種就是通過方法的參數傳進來,另一種就是使用class的成員變量的值…… 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章