靜態方法和例項化方法的區別

2022-09-22 23:06:18 字數 3853 閱讀 3327

靜態方法和例項化方法的區別,方法是我們每天都在寫,大多都使用例項化方法,而很少使用靜態方法,問原因也說不出來所以然,或者簡單的回答兩者定義的區別,靜態方法不需要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();

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

開發方式二:應該多是應用在cs模式下,dal在整個專案只會有乙個物件存在,如果出現在b/s 我想不能相容多種問題情況。而且也有執行緒安全的問題。

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

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

我特意以「你怎麼理解並使用靜態方法和例項化方法的?」這樣的問題詢問了多位程式設計師,他們開發的語言也不盡相同(c 、c++、j**a、c#)

以下是他們的回答:

海龍說:

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

張偉說:

幾乎沒有區別,如果不需要例項化,就用靜態方法;如果為了穩妥,就用例項方法,這樣才可呼叫其他例項方法和變數 。

蕭遠山說:

靜態方法比較少用,因為他在一啟動就例項化了,比較佔資源,當然,,配合單例模式還是比較好用的

比較多的用在資料連線上,我避免使用的原則就是減少資源消耗。

張新波說:

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

向詳說:

靜態就是類的,例項就是物件的。

靜態方法和例項方法的區別之處還有乙個地方:靜態方法不需要依賴類當中的屬性,能在這個方法中封閉的完成乙個功能。例項方法更多的會使用到類當中的屬性。

winson_張林說:

最大的區別在於記憶體。

靜態方法在程式開始時生成記憶體,例項方法在程式執行中生成記憶體,

所以靜態方法可以直接呼叫,例項方法要先成生例項,通過例項呼叫方法,靜態速度很快,但是多了會佔記憶體。

任何語言都是對記憶體和磁碟的操作,至於是否物件導向,只是軟體層的問題,底層都是一樣的,只是實現方法不同。

靜態記憶體是連續的,因為是在程式開始時就生成了,而例項申請的是離散的空間,所以當然沒有靜態方法快,

而且靜態記憶體是有限制的,太多了程式會啟動不了。

showlover說:

靜態方法與例項方法各有自己的用處...

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

用例項方法,當然需要你先建立例項,才能呼叫例項方法,而靜態方法則不需要..

從效能上說,靜態方法效率要稍微高一些,但是它會常駐記憶體...

一些情況下使用靜態方法是有好處的,因為對於靜態方法無論你有多少個例項,

記憶體中要維護的乙份拷貝。同時,某些方法,確實使用靜態是比較恰當的..

q.yuhen說:

這個問題牽扯到的東西比較多,諸如設計模式等等。簡單點說,靜態方法用來執行無狀態的乙個完整操作,例項方法則相反,它通常是乙個完整邏輯的一部分,並且需要維護一定的狀態值。

如果用記憶體和效率來區分使用static method、instance method 就回到過去結構化程式設計了。使用那種方法的根本出發點還是圍繞物件導向來進行的。

陳亮說:

靜態方法和全域性函式差不多的,例項方法是乙個類裡面的方法。

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

有時候我們對靜態方法和例項化方法會有一些誤解。

1、大家都以為「靜態方法常駐記憶體,例項方法不是,所以靜態方法效率高但佔記憶體。」

事實上,他們都是一樣的,在載入時機和占用記憶體上,靜態方法和例項方法是一樣的,在型別第一次被使用時載入。呼叫的速度基本上沒有差別。

2、大家都以為「靜態方法在堆上分配記憶體,例項方法在堆疊上」

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

方法佔不占用更多記憶體,和它是不是static沒什麼關係。

因為欄位是用來儲存每個例項物件的資訊的,所以欄位會占有記憶體,並且因為每個例項物件的狀態都不一致(至少不能認為它們是一致的),所以每個例項物件的所有欄位都會在記憶體中有一分拷貝,也因為這樣你才能用它們來區分你現在操作的是哪個物件。

但方法不一樣,不論有多少個例項物件,它的方法的**都是一樣的,所以只要有乙份**就夠了。因此無論是static還是non-static的方法,都只存在乙份**,也就是只占用乙份記憶體空間。

同樣的**,為什麼執行起來表現卻不一樣?這就依賴於方法所用的資料了。主要有兩種資料**,一種就是通過方法的引數傳進來,另一種就是使用class的成員變數的值……

3、大家都以為「例項方法需要先建立例項才可以呼叫,比較麻煩,靜態方法不用,比較簡單」

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

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

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

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

我們為什麼要把方法區分為:靜態方法和例項化方法 ?

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

拿別人乙個例子說事:

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

————————————————————————正文結束,下面是我的總結——————————————————————————

弄清楚靜態方法也並沒有 所謂的常駐記憶體、只有乙份**在記憶體、分配在堆上 這些優勢後,我自己用j**a做了一點測試。

結果標明,大多數情況下, 靜態方法 和 例項化方法 的效率不分高下。

(結果中,奇怪的是,當main中迴圈次數達到100000時,靜態方法的呼叫時間反而遠高於例項化方法)

**如下:

[j**a]view plaincopy

Java 靜態方法和例項化方法的區別

總結 大家對這個問題都有乙個共識 那就是例項化方法更多被使用和穩妥,靜態方法少使用。有時候我們對靜態方法和例項化方法會有一些誤解。1 大家都以為 靜態方法常駐記憶體,例項方法不是,所以靜態方法效率高但佔記憶體。事實上,他們都是一樣的,在載入時機和占用記憶體上,靜態方法和例項方法是一樣的,在型別第一次...

靜態方法和例項方法的區別

c 靜態方法和例項方法的幾種用法 見如下 這三種形式我們應該都用過。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 publicclasssomeclass publicstaticstaticmethod publicclas...

靜態方法和例項方法的區別

見如下 這三種形式我們應該都用過。public class someclass public static staticmethod public class anotherclass 這幾種方式在呼叫時間,還有執行緒安全,物件導向的程式設計方面都有差別。後文會談到。靜態方法是常駐記憶體 圖1 靜態...