語言中,靜態方法和非靜態方法你懂多少?

來源本人CSDN博客:http://blog.csdn.net/qiulongtianshi/article/details/7292730

歡迎您蒞臨指導,共同交流,共同進步。

 問題來源:昨天給八期的師弟輔導機房收費系統的時候,發現一個有意思的問題。就是Bll和Dal層,D層是靜態方法,B層調用D層的方法的時候,直接調用。

           當時我看到這個問題,感覺按照常規的思維來想這個問題,肯定是先new一下D層,然後再調用。這個問題仔細想想還真有點不知所措。

           經過一番瞭解:

           一、方法是我們每天都在寫得,很多程序員大多都使用實例化方法,而很少使用靜態方法,問原因也說不出來所以然,或者簡單的回答兩者定義的區別,靜態方法不需要new就可以使用 實例化方法需要new了以後纔可以使用。。。。我們真的理解了嗎?

          二、從實際的項目開發說起,這個問題的答案是這樣的:

                  開發項目中把BLL和DAL分開,在BLL調用DAL的代碼。        

 一、在DAL中使用靜態方法,不創建實例直接調用(大概有很多人都使用這種方式開發 )       

  1. class DAL  
  2. {  
  3. public static string GetUserName(...);  
  4. }  
  5. 在BLL中調用:  
  6. DAL.GetUserName();  

二、在DAL中使用實例方法,採用靜態成員模式(或Singleton)通過實例來調用:

  1. class DAL  
  2. {  
  3. public static readonly DAL dal = new DAL();  
  4. public string GetUserName(...);  
  5. }  
  6. 在BLL中調用:  
  7. DAL.dal.GetUserName();  

三、在DAL中使用實例方法,每次調用之前先創建DAL對象的實例:

  1. class DAL  
  2. {  
  3. public string GetUserName(...);  
  4. }  
  5. 在BLL中調用:  
  6. DAL dal = new DAL();  
  7. dal.GetUserName();  

          上述實例分析: 

                  開發方式一:我以爲在一些情況下(比如調用多個數據庫、GetUserName(...)內部處理操作部分)會出現線程安全的嫌疑。這種開發方式不用New出對象,所以很普遍。

                  開發方式二:應該多是應用在cs模式下,DAL在整個項目只會有一個對象存在,如果出現在B/S 我想不能兼容多種問題情況。而且也有線程安全的問題。

                  開發方式三:應該是普遍使用的,能夠兼容各種問題,也不會有線程不安全的嫌疑出現。

從內存分析

        因爲上面的問題一起下面的問題,當程序運行了一會,報Connection超過了最大連接數。這個問題是怎麼回事?

        原因:最大的區別在於內存。靜態方法在程序開始時生成內存,實例方法在程序運行中生成內存,所以靜態方法可以直接調用,實例方法要先成生實例,通過實例調用方法,靜態速度很快,但是多了會佔內存。

        任何語言都是對內存和磁盤的操作,至於是否面向對象,只是軟件層的問題,底層都是一樣的,只是實現方法不同。靜態內存是連續的,因爲是在程序開始時就生成了,而實例申請的是離散的空間,所以當然沒有靜態方法快,而且靜態內存是有限制的,太多了程序會啓動不了。  

        靜態方法和非靜態方法對比總結:

 

       ①靜態成員屬於類所有,非靜態成員屬於類的實例所有。

  每創建一個類的實例,都會在內存中爲非靜態成員新分配一塊存儲;

  非靜態成員屬於類所有,爲各個類的實例所公用,無論類創建了多少實例,類的靜態成員在內存中只佔同一塊區域。 

 

        總括:實例化方法使用和穩妥,靜態方法少使用

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