1. 程式人生 > >類方法、例項方法、靜態方法詳細詮釋(重要)

類方法、例項方法、靜態方法詳細詮釋(重要)

何時用靜態方法,何時用例項方法? 
先說例項方法,當你給一個類寫一個方法,如果該方法需要訪問某個例項的成員變數時,那麼就將該方法定義成例項方法。一類的例項通常有一些成員變數,其中含有該例項的狀態資訊。而該方法需要改變這些狀態。那麼該方法需要宣告成例項方法 



靜態方法正好相反,它不需要訪問某個例項的成員變數,它不需要去改變某個例項的狀態我們把該方法定義成靜態方法 

關於靜態方法和例項方法的一些誤區。  
一、靜態方法常駐記憶體,例項方法不是,所以靜態方法效率高但佔記憶體 
 事實上,方法都是一樣的,在載入時機和佔用記憶體上,靜態方法和例項方法是一樣的,在型別第一次被使用時載入。呼叫的速度基本上沒有差別。
 


二、靜態方法在堆上分配記憶體,例項方法在堆疊上 




事實上所有的方法都不可能在堆或者堆疊上分配記憶體,方法作為程式碼是被載入到特殊的程式碼記憶體區域,這個記憶體區域是不可寫的。 


三、例項方法需要先建立例項才可以呼叫,比較麻煩,靜態方法不用,比較簡單。 


    事實上如果一個方法與他所在型別的例項無關,那麼它就應該是靜態的,決不會有人把它寫成例項方法。所以所有的例項方法都與例項有關,既然與例項有關,那麼建立例項就是必然的步驟,沒有麻煩簡單一說。實際上上你可以把所有的例項方法都寫成靜態的,將例項作為引數傳入即可。 
    有些方法看似與所在的例項無關,如IComparer.Compare方法,但實際上每一個實現這個介面的類都只會負責自己型別例項的比較,這是C#1.x規範中沒有泛型所帶來的歷史遺留問題。
 
    大部分靜態方法是與類的例項有關的,如各種Parse方法,他做成靜態的原因是他沒有例項作為引數。其他的大多是出於語義或者其他目的的考慮。 
第一種方式, 宣告例項,呼叫例項方法 


當一個類有多個例項,例如學生這個類,例項可以有學生甲,學生乙,學生丙,等等,我們就用第一種方式。在多執行緒的情況下,只要每個執行緒都建立自己的例項,那麼第一種方法通常是執行緒安全的。 

第二種方式,通過一個靜態的例項,去呼叫例項方法 

這種情況比較特殊,通常是整個程式裡該類唯一的一個例項,我們通過呼叫該例項的例項方法來改變該例項的某些狀態。這一個例項在多執行緒的情況下,通常是執行緒不安全的。除非我們給這個例項加鎖。防止其他執行緒訪問該例項。
 

第三種方式,直接呼叫靜態方法 

這種情況下靜態方法不需要去改變某個例項的狀態。只要得到少量的引數就可完成既定事情。比如判斷一個檔案是否存在,只要給個檔案路徑和檔名,就能知道該檔案是否存在