靜態方法和執行個體化方法的區別

來源:互聯網
上載者:User

標籤:style   blog   http   java   color   使用   

這是一個經常被時時提出來的問題,很多時候我們以為理解了、懂了,但深究一下,我們卻發現並不懂。

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

從實際項目開發說起,這裡有開發項目的三種方式:

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

一、在DAL中使用靜態方法,不建立執行個體直接調用(大概有很多人都使用這種方式開發 )

class DAL
{
public static string GetUserName(...);
}
在BLL中調用:
DAL.GetUserName();

二、在DAL中使用執行個體方法,採用靜態成員模式(或Singleton)通過執行個體來調用:
class DAL
{
public static readonly DAL dal = new DAL();
public string GetUserName(...);
}
在BLL中調用:
DAL.dal.GetUserName();

三、在DAL中使用執行個體方法,每次調用之前先建立DAL對象的執行個體:
class DAL
{
public string GetUserName(...);
}
在BLL中調用:
DAL dal = new DAL();
dal.GetUserName();

---------------------------------------------------------------

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

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

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

特別說明一下:在MS的pet3.0以前的版本 都採用了方式二,而到pet3.0和以後的版本 都採用了方式三,而且特別在開發說明文檔中明確的解釋了一下。我想應該是從相容性上考慮的,從效能上方式二並不比方式三真正的高多少。

-------------------------------------------------------------------------

我特意以“你怎麼理解並使用靜態方法和執行個體化方法的?”這樣的問題詢問了多位程式員,他們開發的語言也不盡相同(c 、c++、java、c#)

以下是他們的回答:

海龍說:

公用的方法,而且是一些零散的 一般用靜態方法

張偉說:
幾乎沒有區別,如果不需要執行個體化,就用靜態方法;如果為了穩妥,就用執行個體方法,這樣才可調用其他執行個體方法和變數 。

蕭遠山說:
靜態方法比較少用,因為他在一啟動就執行個體化了,比較佔資源,當然,,配合單例模式還是比較好用的
比較多的用在資料連線上,我避免使用的原則就是減少資源消耗。

張新波說:
靜態方法意味著我在調用前不需要進行對其所屬的類進行new操作,我主要會在工具類裡面用到靜態方法。


向詳說:
靜態就是類的,執行個體就是對象的。
靜態方法和執行個體方法的區別之處還有一個地方:靜態方法不需要依賴類當中的屬性,能在這個方法中封閉的完成一個功能。執行個體方法更多的會使用到類當中的屬性。

winson_張林說:
最大的區別在於記憶體。
靜態方法在程式開始時產生記憶體,執行個體方法在程式運行中產生記憶體,
所以靜態方法可以直接調用,執行個體方法要先成生執行個體,通過執行個體調用方法,靜態速度很快,但是多了會佔記憶體。
任何語言都是對記憶體和磁碟的操作,至於是否物件導向,只是軟體層的問題,底層都是一樣的,只是實現方法不同。
靜態記憶體是連續的,因為是在程式開始時就產生了,而執行個體申請的是離散的空間,所以當然沒有靜態方法快,
而且靜態記憶體是有限制的,太多了程式會啟動不了。

showlover說:
靜態方法與執行個體方法各有自己的用處...

是定義成靜態方法,還是定義成執行個體方法,還要看具體情況,比如方法本身與類型沒有太大的關係,可以定義成靜態方法..

用執行個體方法,當然需要你先建立執行個體,才能調用執行個體方法,而靜態方法則不需要..

從效能上說,靜態方法效率要稍微高一些,但是它會常駐記憶體...
一些情況下使用靜態方法是有好處的,因為對於靜態方法無論你有多少個執行個體,
記憶體中要維護的一份拷貝。同時,某些方法,確實使用靜態是比較恰當的..

Q.yuhen說:
這個問題牽扯到的東西比較多,諸如設計模式等等。簡單點說,靜態方法用來執行無狀態的一個完整操作,執行個體方法則相反,它通常是一個完整邏輯的一部分,並且需要維護一定的狀態值。
如果用記憶體和效率來區分使用Static Method、Instance Method 就回到過去結構化編程了。使用那種方法的根本出發點還是圍繞物件導向來進行的。

 

陳亮說:

靜態方法和全域函數差不多的,執行個體方法是一個類裡面的方法。

 

總結:大家對這個問題都有一個共識:那就是執行個體化方法更多被使用和穩妥,靜態方法少使用。

有時候我們對靜態方法和執行個體化方法會有一些誤解。

1、大家都以為“ 靜態方法常駐記憶體,執行個體方法不是,所以靜態方法效率高但占記憶體。

事實上,他們都是一樣的,在載入時機和佔用記憶體上,靜態方法和執行個體方法是一樣的,在類型第一次被使用時載入。調用的速度基本上沒有差別。

2、大家都以為“ 靜態方法在堆上分配記憶體,執行個體方法在堆棧上

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

方法佔不佔用更多記憶體,和它是不是static沒什麼關係。  
  因為欄位是用來儲存每個執行個體對象的資訊的,所以欄位會佔有記憶體,並且因為每個執行個體對象的狀態都不一致(至少不能認為它們是一致的),所以每個執行個體對象的所以欄位都會在記憶體中有一分拷貝,也因為這樣你才能用它們來區分你現在操作的是哪個對象。  
  但方法不一樣,不論有多少個執行個體對象,它的方法的代碼都是一樣的,所以只要有一份代碼就夠了。因此無論是static還是non-static的方法,都只存在一份代碼,也就是只佔用一份記憶體空間。  
  同樣的代碼,為什麼運行起來表現卻不一樣?這就依賴於方法所用的資料了。主要有兩種資料來源,一種就是通過方法的參數傳進來,另一種就是使用class的成員變數的值……

3、大家都以為“執行個體方法需要先建立執行個體才可以調用,比較麻煩,靜態方法不用,比較簡單

事實上如果一個方法與他所在類的執行個體對象無關,那麼它就應該是靜態,而不應該把它寫成執行個體方法。所以所有的執行個體方法都與執行個體有關,既然與執行個體有關,那麼建立執行個體就是必然的步驟,沒有麻煩簡單一說。

當然你完全可以把所有的執行個體方法都寫成靜態,將執行個體作為參數傳入即可,一般情況下可能不會出什麼問題。

從物件導向的角度上來說,在抉擇使用執行個體化方法或靜態方法時,應該根據是否該方法和執行個體化對象具有邏輯上的相關性,如果是就應該使用執行個體化對象  反之使用靜態方法。這隻是從物件導向角度上來說的。

如果從安全執行緒、效能、相容性上來看  也是選用執行個體化方法為宜。

我們為什麼要把方法區分為:靜態方法和執行個體化方法 ?

如果我們繼續深入研究的話,就要脫離技術談理論了。早期的結構化編程,幾乎所有的方法都是“靜態方法”,引入執行個體化方法概念是物件導向概念出現以後的事情了,區分靜態方法和執行個體化方法不能單單從效能上去理解,建立c++,java,c#這樣物件導向語言的大師引入執行個體化方法一定不是要解決什麼效能、記憶體的問題,而是為了讓開發更加模式化、物件導向化。這樣說的話,靜態方法和執行個體化方式的區分是為瞭解決模式的問題。

拿別人一個例子說事:

 比如說“人”這個類,每個人都有姓名、年齡、性別、身高等,這些屬性就應該是非靜態,因為每個人都的這些屬性都不相同;但人在生物學上屬於哪個門哪個綱哪個目等,這個屬性是屬於整個人類,所以就應該是靜態——它不依賴與某個特定的人,不會有某個人是“脊椎動物門哺乳動物綱靈長目”而某個人卻是“偶蹄目”的。

出處:http://idai.blogbus.com/logs/7078424.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.