靜態化呼叫和例項化呼叫的區別

2021-06-08 05:23:01 字數 2161 閱讀 2642

今天在看原始碼的時候,發現在檢測檔案是否存在的是使用的是乙個類,然後在類裡面寫方法,

呼叫的時候是例項化類的方式呼叫的。如果是以前,我可能會直接做成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和...