2012年8月26日 星期日

一秒看破 static

static 靜態 是個很奇妙的 關鍵字

早在 哈囉,世界 的時候就看到 static void Main() 這個 加了 static 關鍵字的方法

但是在真正了解 static 的意義卻又是很久以後的事了


 

 

最基本 也大家都知道的是

靜態的成員 不需要實體(Instance) 就能進行訪問

非靜態的成員 必須 new 一個 實體(Instance) 才能進行訪問

但這不算解釋 反而是混亂的開始

在單一使用者 單一執行 簡單功能 的情況下 這2種寫法 跑的結果一模一樣

這時就會有人覺得 那就都用靜態就好了呀 不用 new 多方便

但是隨即就嚐到苦頭 因為 靜態並非 沒有實體 而是只有一個實體 在程式執行之初就建立 並佔用記憶體位置 而且一直存在

當程式用上一堆靜態成員的時候 就造成不必要的記憶體浪費

但是現在硬體都不錯 也許這隱藏殺機不是那麼明顯 但是另一個問題就頭大囉

那就是牽一髮而動全身 靜態成員是唯一的 只要是宣告成 static 且同名的成員 都是共用一區記憶體位置

即使你這麼做

雖然 new 了三個物件 但是只要設定其中一個 其他三個 也會跟著改變

 

 

 

 

相對於 變數 屬性 這種顯而易見的差異 靜態方法 跟 非靜態方法 就顯得有些曖昧

靜態方法 屬於 類別所有

非靜態方法 屬於 實體所有

 

靜態方法 只能以類別名叫用 即使是 非靜態類別

非靜態方法 只能以實體叫用 所以 靜態類別 內無法有 非靜態方法 (靜態類別內一切都是靜態的)

從執行效能來看 靜態方法 比較好 因為是共用的 省去建立 跟 銷毀 物件的效能

但是也代表 靜態方法 永遠存在 不論這方法 會不會被執行

 

即使這樣說也很難判斷到底何時要用 靜態方法 何時不用

但是如果從物件導向的角度 - 封裝 出發 就很明確

 

例如一個公開的類別的 公開靜態方法 跟 公開非靜態方法 就有意義上的不同

公開的類別的公開靜態方法 即使不屬於此類別 也能叫用 因為都是公開的

公開的類別的公開非靜態方法 卻只能是 屬於此類別的 實體 才能叫用

 

例如一個公開類別名叫 男人 有個方法叫 站著小便

如果他是 非靜態方法 那麼可以確定 只有男人可以站著小便

如果他是 靜態方法 那就好玩了 就算是女人類別 也能 執行 男人.站著小便() 方法

好吧我知道這例子很鳥 或許真的有女人喜歡站著小便?!

 

那再舉一例吧 跟錢有關的 都比較有深刻體驗

 

例如一個公開類別名叫 我 有個方法叫 花光我的積蓄當月光仙子

如果他是 非靜態方法 那麼可以確定 只有我可以花光我的積蓄當月光仙子

如果他是 靜態方法 那就好玩了 就算是路人類別 也能 執行 我.花光我的積蓄當月光仙子() 方法

然後我的薪水就被花光了 而且花光的人 還不是我

 

WTF,怎麼每個聽起來都很可怕 那又什麼時候該用 靜態方法?

 

例如一個公開類別名叫 學生 有個方法叫 作弊

如果他是 靜態方法 那真棒 誰都可以幫助學生作弊

如果他是 非靜態方法 那有點糟 學生只能自立自強 備妥小抄望遠鏡

 

好吧我知道這例子很鳥 鼓吹作弊 違反社會善良風俗

 

例如一個公開類別名叫 我 有個方法叫 叫我起床

如果他是 靜態方法 那真棒 誰都可以叫我起床

如果他是 非靜態方法 那有點糟 只有我可以叫我自己起床 沒人幫的了我

45 則留言:

  1. 受教了~正在嘗試一秒理解

    回覆刪除
  2. 恭喜 您是第一個留言的朋友

    只是很可惜我沒有大獎可以送您 ˊ_>ˋ

    回覆刪除
  3. 謝謝您這麼幽默又清楚的解釋~~

    回覆刪除
  4. 好幽默的解釋,如果課本或技術講解都有這樣生動的解釋就好了XD

    回覆刪除
  5. 我看惹好幾秒還是不懂怎摸辦

    回覆刪除
  6. 版主厲害
    這解釋如果以前當學生有人這樣教我 秒懂

    回覆刪除
  7. 推一個~

    多虧這篇文章才讓我比較懂了 static 的意義所在~

    回覆刪除
  8. 原來是這樣啊啊啊啊啊!!!

    回覆刪除
  9. 謝謝你幫我解除了學程式以來的困惑😆

    回覆刪除
  10. 初學程式看完這篇還是有點似懂非懂

    累積點經驗之後再看第二次就更明確了

    感謝版主~~d(d'∀')

    回覆刪除
  11. 感謝版主

    實際的例子有點像繞口令,但感覺好像懂了XD

    回覆刪除
  12. Q_Q 每次遇到static 都會忘記

    忘記就會回來再看一次 ㄎㄎ

    回覆刪除
  13. 這篇真的猛 讚!

    回覆刪除
  14. 我有個class裡面有"價錢累積的變數total", 如果不用"靜態"宣告,它就無法累積
    看完你這篇,好像有點概念,知道點原理的感覺了
    讚讚!!

    回覆刪除
  15. 謝謝樓主,這樣我了解什麼是靜態方法了。

    回覆刪除
  16. 跪了

    雖然看了不只一秒
    但是跟其他講解比起來真的是一秒
    而且完全不會混亂!!!!

    回覆刪除
  17. 其他解釋static的解釋的太爛 ,同一段文字抄來抄去氣死誰啊。你說得很清楚,謝謝

    回覆刪除
  18. 話說最後一個例子才能秒懂(切身之痛?!)....
    公開類別名:我
    方法:叫我起床

    回覆刪除
  19. 謝謝PO主清楚明白的解釋,開釋我一直搞不懂的問題,對程式新手而言很受用 QQ

    回覆刪除
  20. 謝謝教學 懂好多關於static的知識!

    回覆刪除
  21. 這解釋非常生動跟到位

    回覆刪除
  22. 看了這樣多年的程式,今天終於懂得static的真正意義,感謝你無私的分享,令我受益無窮!!感謝!!

    回覆刪除
  23. 之前有看過一個歷史紀錄片說古代女人是站著小便的

    回覆刪除
  24. 查了查..真的很多說明都不是說明
    看了這篇,才知道甚麼是static。
    感謝大大

    回覆刪除
  25. 最後一個舉例 請問是看了太多全面啟動嗎
    非常生動的舉例 XDD

    回覆刪除
  26. 夫妻財產共有制就是適合靜態方法 (你的錢就是我的錢.....)

    回覆刪除
  27. 謝謝大大用淺顯易懂的方式說明!

    回覆刪除
  28. 真的秒懂 太厲害了!

    回覆刪除
  29. 厲害了這個解釋 疑惑全解..

    回覆刪除
  30. 謝謝哥的文章 希望你可以繼續解析 真的厲害....!

    回覆刪除
  31. 很棒的解釋 太感謝了

    回覆刪除
  32. 感謝教學 謝謝.. 真的太厲害了

    回覆刪除