免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
靜態(tài)方法和實例化方法的區(qū)別

這是一個經(jīng)常被時時提出來的問題,很多時候我們以為理解了、懂了,但深究一下,我們卻發(fā)現(xiàn)并不懂。
方法是我們每天都在寫得,很多程序員大多都使用實例化方法,而很少使用靜態(tài)方法,問原因也說不出來所以然,或者簡單的回答兩者定義的區(qū)別,靜態(tài)方法不需要new就可以使用 實例化方法需要new了以后才可以使用。。。。我們真的理解了嗎?
從實際項目開發(fā)說起,這里有開發(fā)項目的三種方式:
開發(fā)項目中把BLL和DAL分開,在BLL調(diào)用DAL的代碼。
一、在DAL中使用靜態(tài)方法,不創(chuàng)建實例直接調(diào)用(大概有很多人都使用這種方式開發(fā) )
class DAL
{
public static string GetUserName(...);
}
在BLL中調(diào)用:
DAL.GetUserName();
二、在DAL中使用實例方法,采用靜態(tài)成員模式(或Singleton)通過實例來調(diào)用:
class DAL
{
public static readonly DAL dal = new DAL();
public string GetUserName(...);
}
在BLL中調(diào)用:
DAL.dal.GetUserName();
三、在DAL中使用實例方法,每次調(diào)用之前先創(chuàng)建DAL對象的實例:
class DAL
{
public string GetUserName(...);
}
在BLL中調(diào)用:
DAL dal = new DAL();
dal.GetUserName();
---------------------------------------------------------------
開發(fā)方式一:我以為在一些情況下(比如 調(diào)用多個數(shù)據(jù)庫、GetUserName(...)內(nèi)部處理操作部分)會出現(xiàn)線程安全的嫌疑。這種開發(fā)方式不用New出對象,所以很普遍。
開發(fā)方式二:應(yīng)該多是應(yīng)用在cs模式下,DAL在整個項目只會有一個對象存在,如果出現(xiàn)在B/S 我想不能兼容多種問題情況。而且也有線程安全的問題。
開發(fā)方式三:應(yīng)該是普遍使用的,能夠兼容各種問題,也不會有線程不安全的嫌疑出現(xiàn)。
特別說明一下:在MS的pet3.0以前的版本 都采用了方式二,而到pet3.0和以后的版本 都采用了方式三,而且特別在開發(fā)說明文檔中明確的解釋了一下。我想應(yīng)該是從兼容性上考慮的,從性能上方式二并不比方式三真正的高多少。
-------------------------------------------------------------------------
我特意以“你怎么理解并使用靜態(tài)方法和實例化方法的?”這樣的問題詢問了多位程序員,他們開發(fā)的語言也不盡相同(c 、c++、java、c#)
以下是他們的回答:
海龍說:
公用的方法,而且是一些零散的 一般用靜態(tài)方法
張偉說:
幾乎沒有區(qū)別,如果不需要實例化,就用靜態(tài)方法;如果為了穩(wěn)妥,就用實例方法,這樣才可調(diào)用其他實例方法和變量 。
蕭遠山說:
靜態(tài)方法比較少用,因為他在一啟動就實例化了,比較占資源,當(dāng)然,,配合單例模式還是比較好用的
比較多的用在數(shù)據(jù)連接上,我避免使用的原則就是減少資源消耗。
張新波說:
靜態(tài)方法意味著我在調(diào)用前不需要進行對其所屬的類進行new操作,我主要會在工具類里面用到靜態(tài)方法。

向詳說:
靜態(tài)就是類的,實例就是對象的。
靜態(tài)方法和實例方法的區(qū)別之處還有一個地方:靜態(tài)方法不需要依賴類當(dāng)中的屬性,能在這個方法中封閉的完成一個功能。實例方法更多的會使用到類當(dāng)中的屬性。
winson_張林說:
最大的區(qū)別在于內(nèi)存。
靜態(tài)方法在程序開始時生成內(nèi)存,實例方法在程序運行中生成內(nèi)存,
所以靜態(tài)方法可以直接調(diào)用,實例方法要先成生實例,通過實例調(diào)用方法,靜態(tài)速度很快,但是多了會占內(nèi)存。
任何語言都是對內(nèi)存和磁盤的操作,至于是否面向?qū)ο?只是軟件層的問題,底層都是一樣的,只是實現(xiàn)方法不同。
靜態(tài)內(nèi)存是連續(xù)的,因為是在程序開始時就生成了,而實例申請的是離散的空間,所以當(dāng)然沒有靜態(tài)方法快,
而且靜態(tài)內(nèi)存是有限制的,太多了程序會啟動不了。
showlover說:
靜態(tài)方法與實例方法各有自己的用處...
是定義成靜態(tài)方法,還是定義成實例方法,還要看具體情況,比如方法本身與類型沒有太大的關(guān)系,可以定義成靜態(tài)方法..
用實例方法,當(dāng)然需要你先創(chuàng)建實例,才能調(diào)用實例方法,而靜態(tài)方法則不需要..
從性能上說,靜態(tài)方法效率要稍微高一些,但是它會常駐內(nèi)存...
一些情況下使用靜態(tài)方法是有好處的,因為對于靜態(tài)方法無論你有多少個實例,
內(nèi)存中要維護的一份拷貝。同時,某些方法,確實使用靜態(tài)是比較恰當(dāng)?shù)?.
Q.yuhen說:
這個問題牽扯到的東西比較多,諸如設(shè)計模式等等。簡單點說,靜態(tài)方法用來執(zhí)行無狀態(tài)的一個完整操作,實例方法則相反,它通常是一個完整邏輯的一部分,并且需要維護一定的狀態(tài)值。
如果用內(nèi)存和效率來區(qū)分使用Static Method、Instance Method 就回到過去結(jié)構(gòu)化編程了。使用那種方法的根本出發(fā)點還是圍繞面向?qū)ο髞磉M行的。
 
陳亮說:
靜態(tài)方法和全局函數(shù)差不多的,實例方法是一個類里面的方法。
 
總結(jié):大家對這個問題都有一個共識:那就是實例化方法更多被使用和穩(wěn)妥,靜態(tài)方法少使用。
有時候我們對靜態(tài)方法和實例化方法會有一些誤解。
1、大家都以為“ 靜態(tài)方法常駐內(nèi)存,實例方法不是,所以靜態(tài)方法效率高但占內(nèi)存。”
事實上,他們都是一樣的,在加載時機和占用內(nèi)存上,靜態(tài)方法和實例方法是一樣的,在類型第一次被使用時加載。調(diào)用的速度基本上沒有差別。
2、大家都以為“ 靜態(tài)方法在堆上分配內(nèi)存,實例方法在堆棧上”
事實上所有的方法都不可能在堆或者堆棧上分配內(nèi)存,方法作為代碼是被加載到特殊的代碼內(nèi)存區(qū)域,這個內(nèi)存區(qū)域是不可寫的。
方法占不占用更多內(nèi)存,和它是不是static沒什么關(guān)系。  
  因為字段是用來存儲每個實例對象的信息的,所以字段會占有內(nèi)存,并且因為每個實例對象的狀態(tài)都不一致(至少不能認(rèn)為它們是一致的),所以每個實例對象的所以字段都會在內(nèi)存中有一分拷貝,也因為這樣你才能用它們來區(qū)分你現(xiàn)在操作的是哪個對象。  
  但方法不一樣,不論有多少個實例對象,它的方法的代碼都是一樣的,所以只要有一份代碼就夠了。因此無論是static還是non-static的方法,都只存在一份代碼,也就是只占用一份內(nèi)存空間。  
  同樣的代碼,為什么運行起來表現(xiàn)卻不一樣?這就依賴于方法所用的數(shù)據(jù)了。主要有兩種數(shù)據(jù)來源,一種就是通過方法的參數(shù)傳進來,另一種就是使用class的成員變量的值……
3、大家都以為“實例方法需要先創(chuàng)建實例才可以調(diào)用,比較麻煩,靜態(tài)方法不用,比較簡單”
事實上如果一個方法與他所在類的實例對象無關(guān),那么它就應(yīng)該是靜態(tài)的,而不應(yīng)該把它寫成實例方法。所以所有的實例方法都與實例有關(guān),既然與實例有關(guān),那么創(chuàng)建實例就是必然的步驟,沒有麻煩簡單一說。
當(dāng)然你完全可以把所有的實例方法都寫成靜態(tài)的,將實例作為參數(shù)傳入即可,一般情況下可能不會出什么問題。
從面向?qū)ο蟮慕嵌壬蟻碚f,在抉擇使用實例化方法或靜態(tài)方法時,應(yīng)該根據(jù)是否該方法和實例化對象具有邏輯上的相關(guān)性,如果是就應(yīng)該使用實例化對象  反之使用靜態(tài)方法。這只是從面向?qū)ο蠼嵌壬蟻碚f的。
如果從線程安全、性能、兼容性上來看  也是選用實例化方法為宜。
我們?yōu)槭裁匆逊椒▍^(qū)分為:靜態(tài)方法和實例化方法 ?
如果我們繼續(xù)深入研究的話,就要脫離技術(shù)談理論了。早期的結(jié)構(gòu)化編程,幾乎所有的方法都是“靜態(tài)方法”,引入實例化方法概念是面向?qū)ο蟾拍畛霈F(xiàn)以后的事情了,區(qū)分靜態(tài)方法和實例化方法不能單單從性能上去理解,創(chuàng)建c++,java,c#這樣面向?qū)ο笳Z言的大師引入實例化方法一定不是要解決什么性能、內(nèi)存的問題,而是為了讓開發(fā)更加模式化、面向?qū)ο蠡?。這樣說的話,靜態(tài)方法和實例化方式的區(qū)分是為了解決模式的問題。
拿別人一個例子說事:
 比如說“人”這個類,每個人都有姓名、年齡、性別、身高等,這些屬性就應(yīng)該是非靜態(tài)的,因為每個人都的這些屬性都不相同;但人在生物學(xué)上屬于哪個門哪個綱哪個目等,這個屬性是屬于整個人類,所以就應(yīng)該是靜態(tài)的——它不依賴與某個特定的人,不會有某個人是“脊椎動物門哺乳動物綱靈長目”而某個人卻是“偶蹄目”的。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
static 靜態(tài)方法 非靜態(tài)方法 靜態(tài)代碼塊
C#中靜態(tài)與非靜態(tài)方法比較
為什么要有單例模式
深入研究Petshop基礎(chǔ)篇 - 紫風(fēng)的日志 - 網(wǎng)易博客
靜態(tài)方法與實例方法的區(qū)別
C#中靜態(tài)方法與非靜態(tài)方法(static),公有與私有(public,private)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服