實例方法和靜態方法有什麼不同

開始寫這個是由於昨天看到一個大牛在簡書寫的文章,其中分門別類提了不少問題,我發現對於java我竟如此陌生,所以打算經過寫文的方式來記錄對這些問題的解答和理解,以此來加深我對Java的認識。java

首先,固然要附上該文的連接——http://www.jianshu.com/p/ba0fdee47cb4c++

而後,開始對問題進行解(bai)答(du)吧!編程

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

StaticAndNon-static.pngc#

 

首先仍是從我的感受仍是說吧,徹底度娘谷哥涯妹簡叔未免太沒有誠意了。安全

  1. 從調用上來看,實例方法須要使用對象來調用,若是類沒有實例化是沒法調用實例方法的;反過來,靜態方法則是由類直接調用的(對象也能夠調用,編譯能夠經過,但不知道會不會有什麼問題)。

2.在同一個類中,實例方法內部 能夠直接使用靜態方法,可是靜態方法中則沒法直接調用這個實例方法(編譯沒法經過,一樣也沒法直接訪問非靜態的成員變量),我的推測是由於兩種方法的加載機制有差別,由於在類內部直接調用類持有的實例方法時,默認帶有this關鍵字,this關鍵字只帶當前類的對象,可是靜態方法在加載時,類尚未實例化,由於不能調用實例方法函數

3.介於實例方法和靜態方法的修飾符有差別,這也算是一種不同吧。另外,實例方法屬於對應類的實例的行爲,而靜態方法是屬於類的行爲(其實每個類都是Class類的對象,那靜態方法是否是Class的實例方法呢,表示不懂);工具

4.靜態方法多用做工具類的方法。性能

以上就是我我的的理解,也許漏洞百出吧,接下來是網搜整理時間。this

network.pngspa

摘自:http://blog.csdn.net/biaobiaoqi/article/details/6732117
一、你們都覺得「** 靜態方法常駐內存,實例方法不是,因此靜態方法效率高但佔內存。**」
事實上,他們都是同樣的,在加載時機和佔用內存上,靜態方法和實例方法是同樣的,在類型第一次被使用時加載。調用的速度基本上沒有差異。
二、你們都覺得「 靜態方法在堆上分配內存,實例方法在堆棧上
事實上全部的方法都不可能在堆或者堆棧上分配內存,方法做爲代碼是被加載到特殊的代碼內存區域,這個內存區域是不可寫的。
方法佔不佔用更多內存,和它是否是static沒什麼關係。 由於字段是用來存儲每一個實例對象的信息的,因此字段會佔有內存,而且由於每一個實例對象的狀態都不一致(至少不能認爲它們是一致的),因此每一個實例對象的全部字段都會在內存中有一分拷貝,也由於這樣你才能用它們來區分你如今操做的是哪一個對象。 但方法不同,不論有多少個實例對象,它的方法的代碼都是同樣的,因此只要有一份代碼就夠了。所以不管是static仍是non-static的方法,都只存在一份代碼,也就是隻佔用一分內存空間。 一樣的代碼,爲何運行起來表現卻不同?這就依賴於方法所用的數據了。主要有兩種數據來源,一種就是經過方法的參數傳進來,另外一種就是使用class的成員變量的值……
三、你們都覺得「實例方法須要先建立實例才能夠調用,比較麻煩,靜態方法不用,比較簡單
事實上若是一個方法與他所在類的實例對象無關,那麼它就應該是靜態的,而不該該把它寫成實例方法。因此全部的實例方法都與實例有關,既然與實例有關,那麼建立實例就是必然的步驟,沒有麻煩簡單一說。
固然你徹底能夠把全部的實例方法都寫成靜態的,將實例做爲參數傳入便可,通常狀況下可能不會出什麼問題。
從面向對象的角度上來講,在抉擇使用實例化方法或靜態方法時,應該根據是否該方法和實例化對象具備邏輯上的相關性,若是是就應該使用實例化對象 反之使用靜態方法。這只是從面向對象角度上來講的。
若是從線程安全、性能、兼容性上來看 也是選用實例化方法爲宜。
咱們爲何要把方法區分爲:靜態方法和實例化方法 ?
若是咱們繼續深刻研究的話,就要脫離技術談理論了。早期的結構化編程,幾乎全部的方法都是「靜態方法」,引入實例化方法概念是面向對象概念出現之後的事情了,區分靜態方法和實例化方法不能單單從性能上去理解,建立c++,java,c#這樣面嚮對象語言的大師引入實例化方法必定不是要解決什麼性能、內存的問題,而是爲了讓開發更加模式化、面向對象化。這樣說的話,靜態方法和實例化方式的區分是爲了解決模式的問題。

上面的文字,更可能是解釋了不少對實例方法和靜態方法理解的誤區,同時也側面反映了一些靜態方法與實例方法的差別化。

對於實例方法來講,他是針對於對象的,也就是這一類型的不一樣個體,不一樣的個體能夠有不一樣的屬性,雖然是相同的行爲(即實例方法,同時入參相同),可是不一樣的屬性可能致使不一樣的結果;

對於靜態方法來講,是無視個體差別的,同時靜態方法內沒法訪問非靜態成員屬性,而靜態成員屬性相對於類來講永遠只有一份,這樣一來,相同的行爲下結果必然是穩定不受其餘因素影響的,所以更適合來作工具類這種全局函數。

想來想去,從靜態方法到實例方法,也許就是從結構化到面向對象的一個縮影吧~

相關文章
相關標籤/搜索