static你雖安靜靦腆,卻不太容易搞定……

static這個妹子,如果你想泡上她,真的得需要動腦力,而不是動每個男人都會的體力……

(2014-2-4聲明:我在分析static時寫到“當然也可以先創建對象,再通過對象來調用”,這是極其錯誤的!實驗證明:對於靜態成員,只能通過類名.靜態成員名來調用,而無法通過一個具體的對象引用來調用,因爲靜態成員是不屬於某一個對象的,而是屬於某一個類的,對我的失誤特此道歉!我又更深入地分析了靜態變量,在我的另一篇文章中,敬請閱讀……)

一:這個妹子的個性……

從內存分析上看,靜態變量會被存放在靜態存儲區中(注意區分java中存放靜態變量和字符串常量的data segment,c#中所有的靜態成員都存放在靜態存儲區中,不要搞混了)。靜態方法和靜態變量呢都不屬於任何一個對象,而是屬於一個整個的類。像非靜態的成員變量會單獨屬於一個對象,創建幾個對象,在每個對象中都會包含這個成員變量,但靜態變量就在靜態存儲區中,它在整個程序運行過程中,獨一份!

從一段程序理解靜態變量不屬於任何一個對象:




如上圖所示,靜態變量sid存在於靜態存儲區中(圖片中所寫的data segment系我的失誤,應該就是靜態存儲區),每次new Person時,因爲構造方法中有sid ++;所以每new出一個人,其sid的值都會加1。

二:怎麼同static妹子搭訕呢……

1)對於靜態變量和靜態方法,只能用類名.變量名/類名.方法名來調用。如果調用靜態變量名和靜態方法時,在同一個類中,則可以省去類名,即直接寫其變量名或方法名,即可實現調用。(補充……靜態變量屬於類變量,不屬於任何一個方法,在C#中,一個方法內定義一個靜態變量是編譯報錯的!如何理解這一點呢?這樣想……方法內的局部變量在方法執行完後會自動銷燬,但靜態變量在程序運行中就獨一份,銷燬不了也不能銷燬,所以編譯器就不讓它被定義在方法內……)

2)爲何非靜態變量或靜態方法必須要創建對象後才能調用呢……

之前我們說過靜態變量和靜態方法不屬於任何一個對象,是個公用的,所以不創建對象就能使用呀。但非靜態的可就不行了……非靜態的都存在於自己的單獨的對象中才能被使用,所以你不創建對象,怎麼能使用這些非靜態的變量和方法呀……

3)爲何靜態的方法中不能直接調用非靜態的變量,必須創建對象後才能調用……

靜態的方法就是不針對於任何一個對象,沒有任何一個對象可以託付終身,但非靜態的變量必須存在於一個對象中,所以,你在這樣一個沒有任何對象的方法中想要直接調用非靜態的變量,那非靜態的變量肯定不會聽你的話,因爲人家連個調用它的對象也沒有呀,所以此時必須要在非靜態的方法中new出一個對象,然後用這個對象去調用非靜態的方法才行……比如我們大家最熟悉的static void main(string[] args)

最後,泡妹子,真的需要頭腦,泡上之後,纔再去考慮自己的體力如何呢……

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