日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 静态方法与实例方法的区别_静态方法与实例方法的区分

發布時間:2023/12/2 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 静态方法与实例方法的区别_静态方法与实例方法的区分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java系列之:看似簡單的問題?靜態方法和實例化方法的區別

Java程序啟動class文件被讀取時類被加載,如果有static方法,此時會分配內存,非static方法實例化類時才在內存中分配控件存儲,引用存儲在堆棧中,實體存儲在堆中

最大的區別在于內存。靜態方法在程序開始時生成內存,實例方法在程序運行中生成內存,所以靜態方法可以直接調用,實例方法要先成生實例,通過實例調用方法,靜態速度很快,但是多了會占內存。任何語言都是對內存和磁盤的操作,至于是否面向對象,只是軟件層的問題,底層都是一樣的,只是實現方法不同。靜態內存是連續的,因為是在程序開始時就生成了,而實例申請的是離散的空間,所以當然沒有靜態方法快,而且靜態內存是有限制的,太多了程序會啟動不了。

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

我想不能兼容多種問題情況。而且也有線程安全的問題。

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

我特意以“你怎么理解并使用靜態方法和實例化方法的?”這樣的問題詢問了多位程序員,他們開發的語言也不盡相同(c

、c++、java、c#)

以下是他們的回答:

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

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

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

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

winson_張林說:最大的區別在于內存。靜態方法在程序開始時生成內存,實例方法在程序運行中生成內存

showlover說:

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

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

用實例方法,當然需要你先創建實例,才能調用實例方法,而靜態方法則不需要..

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

一些情況下使用靜態方法是有好處的,因為對于靜態方法無論你有多少個實例,內存中要維護的一份拷貝。同時,某些方法,確實使用靜態是比較恰當的..

Q.yuhen說:

這個問題牽扯到的東西比較多,諸如設計模式等等。簡單點說,靜態方法用來執行無狀態的一個完整操作,實例方法則相反,它通常是一個完整邏輯的一部分,并且需要維護一定的狀態值。如果用內存和效率來區分使用Static Method、Instance Method

就回到過去結構化編程了。使用那種方法的根本出發點還是圍繞面向對象來進行的。

陳亮說:

靜態方法和全局函數差不多的,實例方法是一個類里面的方法。

如果從線程安全、性能、兼容性上來看也是選用實例化方法為宜。

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

如果我們繼續深入研究的話,就要脫離技術談理論了。早期的結構化編程,幾乎所有的方法都是“靜態方法”,引入實例化方法概念是面向對象概念出現以后的事情了,區分靜態方法和實例化方法不能單單從性能上去理解,創建c++,java,c#這樣面向對象語言的大師引入實例化方法一定不是要解決什么性能、內存的問題,而是為了讓開發更加模式化、面向對象化。這樣說的話,靜態方法和實例化方式的區分是為了解決模式的問題。

拿別人一個例子說事:

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

Java靜態初始化,實例初始化以及構造方法首先有三個概念需要了解:

一.靜態初始化:是指執行靜態初始化塊里面的內容。

二.實例初始化:是指執行實例初始化塊里面的內容。

三.構造方法:一個名稱跟類的名稱一樣的方法,特殊在于不帶返回值。

我們先來看一段程序結果:

執行結果:

this is static method~

this is static block

如果把

的注釋去掉的話,運行結果為:

this is static method~

this is static block

初始化塊:0

this is Book's constructor~

執行順序:(優先級從高到低。)靜態代碼塊>main方法>實例初始化塊>構造代碼塊>構造方法。”

總結:

僅從代碼執行的角度來探討Java加載類、創建對象的過程,并沒有深入到JVM的機制中去。

1.一個對象第一次被創建時,先要加載該對象所屬的類,即對應的.class文件,當然如果類已經加載,再次創建該類的對象時,就不再需要重新加載類了。而一個類加載的時候,有三個部分需要加載,一個是靜態變量,再然后是靜態方法,然后是靜態初始化塊。(見到第一次執行結果就知道了,由于沒有創建實例所以初始化塊不執行)

2.然后開始創建該類的實例了,當然如果靜態方法跟靜態初始化對象中有對象的創建時,就繼續加載該對象的類,當然已經加載了該對象的類的話就不需要再次加載了。那么對象實例的創建過程是什么呢?首先是成員變量的引入,然后是實例初始化塊,之后才是構造方法,構造方法執行完成之后才算把這個對象給創建出來了。

在這個過程中,真正可以編寫執行代碼的地方有三個,靜態初始化、實例初始化以及構造方法。從以上的分析中我們可以看到,這三個代碼塊的執行順序是先類的靜態初始化,再實例初始化,最后執行構造方法。也就是說,靜態初始化是屬于類加載的過程,所以它只執行一次,而實例初始化是每個對象創建時都會執行一次,而構造方法跟實例初始化其實也差不多,不過它在實例初始化之后執行,而且構造方法可以重載多個,執行哪個構造方法是根據你的選擇來的。

可以把main () 函數加一條語句看看:

此時執行結果為:

this is static method~

this is static block

初始化塊:0

this is Book's constructor~

初始化塊:1

this is Book's constructor~

這說明實例初始化是每個對象創建時都會執行的。

總結

以上是生活随笔為你收集整理的java 静态方法与实例方法的区别_静态方法与实例方法的区分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。