今天在看原始碼的時候,發現在檢測檔案是否存在的是使用的是乙個類,然後在類裡面寫方法,
呼叫的時候是例項化類的方式呼叫的。如果是以前,我可能會直接做成static ,直接類呼叫,多方便啊。後來查詢了一些資料。糾正了我的想法。
方法是我們每天都在寫得,很多程式設計師大多都使用例項化方法,而很少使用靜態方法,問原因也說不出來所以然,或者簡單的回答兩者定義的區別,靜態方法不需要new就可以使用 例項化方法需要new了以後才可以使用。。。。我們真的理解了嗎?
從實際專案開發說起,這裡有開發專案的三種方式:
開發專案中把bll和dal分開,在bll呼叫dal的**。
一、在dal中使用靜態方法,不建立例項直接呼叫(大概有很多人都使用這種方式開發 )
class dal
在bll中呼叫:
dal.getusername();
二、在dal中使用例項方法,採用靜態成員模式(或singleton)通過例項來呼叫:
class dal
在bll中呼叫:
dal.dal.getusername();
三、在dal中使用例項方法,每次呼叫之前先建立dal物件的例項:
class dal
在bll中呼叫:
dal dal = new dal();
dal.getusername();
利用單例模式來呼叫,還是不錯的選擇。如果存在多執行緒的話可以考慮。不過也是static的、
最大的區別在於記憶體。
靜態方法在程式開始時生成記憶體,例項方法在程式執行中生成記憶體,
所以靜態方法可以直接呼叫,例項方法要先成生例項,通過例項呼叫方法,靜態速度很快,但是多了會佔記憶體。
任何語言都是對記憶體和磁碟的操作,至於是否物件導向,只是軟體層的問題,底層都是一樣的,只是實現方法不同。
靜態記憶體是連續的,因為是在程式開始時就生成了,而例項申請的是離散的空間,所以當然沒有靜態方法快,
而且靜態記憶體是有限制的,太多了程式會啟動不了。
從效能上說,靜態方法效率要稍微高一些,但是它會常駐記憶體...
一些情況下使用靜態方法是有好處的,因為對於靜態方法無論你有多少個例項,
記憶體中要維護的乙份拷貝。同時,某些方法,確實使用靜態是比較恰當的..
總結:大家對這個問題都有乙個共識:那就是例項化方法更多被使用和穩妥,靜態方法少使用。
有時候我們對靜態方法和例項化方法會有一些誤解。
1、大家都以為「靜態方法常駐記憶體,例項方法不是,所以靜態方法效率高但佔記憶體。」
事實上,他們都是一樣的,在載入時機和占用記憶體上,靜態方法和例項方法是一樣的,在型別第一次被使用時載入。呼叫的速度基本上沒有差別。
2、大家都以為「靜態方法在堆上分配記憶體,例項方法在堆疊上」
事實上所有的方法都不可能在堆或者堆疊上分配記憶體,方法作為**是被載入到特殊的**記憶體區域,這個記憶體區域是不可寫的。
方法佔不占用更多記憶體,和它是不是static沒什麼關係。
因為欄位是用來儲存每個例項物件的資訊的,所以欄位會占有記憶體,並且因為每個例項物件的狀態都不一致(至少不能認為它們是一致的),所以每個例項物件的所有欄位都會在記憶體中有一分拷貝,也因為這樣你才能用它們來區分你現在操作的是哪個物件。
但方法不一樣,不論有多少個例項物件,它的方法的**都是一樣的,所以只要有乙份**就夠了。因此無論是static還是non-static的方法,都只存在乙份**,也就是只占用乙份記憶體空間。
同樣的**,為什麼執行起來表現卻不一樣?這就依賴於方法所用的資料了。主要有兩種資料**,一種就是通過方法的引數傳進來,另一種就是使用class的成員變數的值……
3、大家都以為「例項方法需要先建立例項才可以呼叫,比較麻煩,靜態方法不用,比較簡單」
事實上如果乙個方法與他所在類的例項物件無關,那麼它就應該是靜態的,而不應該把它寫成例項方法。所以所有的例項方法都與例項有關,既然與例項有關,那麼建立例項就是必然的步驟,沒有麻煩簡單一說。
當然你完全可以把所有的例項方法都寫成靜態的,將例項作為引數傳入即可,一般情況下可能不會出什麼問題。
從物件導向的角度上來說,在抉擇使用例項化方法或靜態方法時,應該根據是否該方法和例項化物件具有邏輯上的相關性,如果是就應該使用例項化物件 反之使用靜態方法。這只是從物件導向角度上來說的。
如果從執行緒安全、效能、相容性上來看 也是選用例項化方法為宜
靜態化呼叫和例項化呼叫的區別
今天在看原始碼的時候,發現在檢測檔案是否存在的是使用的是乙個類,然後在類裡面寫方法,呼叫的時候是例項化類的方式呼叫的。如果是以前,我可能會直接做成static 直接類呼叫,多方便啊。後來查詢了一些資料。糾正了我的想法。方法是我們每天都在寫得,很多程式設計師大多都使用例項化方法,而很少使用靜態方法,問...
委託的建立 例項化和呼叫
通過使用 delegate 類,委託例項可以封裝屬於可呼叫實體的方法。對於例項方法,委託由乙個包含類的例項和該例項上的方法組成。對於靜態方法,可呼叫實體由乙個類和該類上的靜態方法組成。因此,委託可用於呼叫任何物件的函式,而且委託是物件導向的 型別安全的。定義和使用委託有三個步驟 c 可通過使用委託來...
靜態方法和例項化方法的區別
靜態方法和例項化方法的區別,方法是我們每天都在寫,大多都使用例項化方法,而很少使用靜態方法,問原因也說不出來所以然,或者簡單的回答兩者定義的區別,靜態方法不需要new就可以使用 例項化方法需要new了以後才可以使用。我們真的理解了嗎?從實際專案開發說起,這裡有開發專案的三種方式 開發專案中把bll和...