單例模式和靜態類的區別

2021-08-20 04:19:19 字數 1197 閱讀 7758

1. 首先明確一下,靜態成員並不是什麼程式載入時建立並初始化的,而是類載入時進行。

類的載入是第一次真正用到它的時候(拿類new例項或呼叫它的靜態方法)進行的,

而這個載入過程需要將 class 檔案中構成類的靜態和例項方法等類的成員的位元組碼指令一同載入到記憶體中,

而後要為靜態域分配儲存空間並使用靜態塊對其進行初始化(如果有的話)。

在上面例子中,類載入後,所有成員(包括fun和staticfun)的位元組碼指令均在記憶體中了,

隨時等待著呼叫,並且靜態域 s 所占用的儲存空間也用空引用初始化好了。

2. 從記憶體上來看,當第一次呼叫 getinstance() 方法時會建立此類的唯一例項(所謂的單例出現),

其實也可以在宣告 s 時 new 它的唯一例項,將例項化延後是為了避免類載入後例項使用前記憶體的浪費。

3. 靜態方法執行緒是安全的,所謂執行緒安不安全是指當多個執行緒同時操作乙個物件(通過呼叫它的例項方法)

時是否會造成物件內部狀態的破壞,而靜態方法不是用來對例項進行操作的,所以一般不用考慮執行緒同步。

如果在靜態方法中讀寫檔案,此時如果多個執行緒同時通過呼叫此靜態方法對檔案操作肯定會造成檔案內容的破壞,

但這不是執行緒沒同步造成的,因為沒有物件的狀態被破壞。但可以利用執行緒同步機制防止上面情況的發生。

4.從生命週期上來看,靜態方法的類會在**編譯的時候就被載入,靜態方法中產生的物件,

會隨著靜態方法執行完畢而釋放掉,而且執行類中的靜態方法時,不會例項化靜態方法所在的類。

如果用單例模式, 產生的那乙個唯一的例項,會一直在記憶體中,不會被gc清除的(原因是靜態的屬性變數不會被gc清除),

除非整個應用退出了jvm (所以實際應用中更多的是靜態方法中獲取單例)

5. 單例模式是利用唯一的例項儲存系統的狀態,提供的例項方法也是為了對這個唯一的例項進行操作,

而靜態方法多是一些工具方法,math 類中的靜態方法就是乙個典型的例子,

如果僅僅是想不自己建立類的例項就可以呼叫到某些方法來完成一定的操作,那完全沒必要也不應該使用單例模式。

6. 從執行效率上看: 靜態方法與例項方法,在載入時機和占用記憶體上,靜態方法和例項方法是一樣的,

在型別第一次被使用時載入。呼叫的速度基本上沒有差別。

但是從日誌列印來看,個人感覺還是靜態方法在執行效率上快一點。

7. 靜態方法是面向過程的,而非物件導向的程式設計思想

單例模式和靜態類的區別對比

什麼是單例模式 單例模式指的是在應用 整個生命週期內只能存在乙個例項。單例模式是一種被廣泛使用的設計模式。他有很多好處,能夠避免例項物件的重複建立,減少建立例項的系統開銷,節省記憶體。單例模式和靜態類的區別 首先理解一下什麼是靜態類,靜態類就是乙個類裡面都是靜態方法和靜態field,構造器被priv...

靜態類和單例模式區別

單例模式限定為不是全用靜態函式實現的。1。使用的方便性 如果需要初始化工作,單例模式可以在建構函式裡面完成,全靜態函式的類需要乙個額外的函式來完成初始化工作,而且使用者如果沒有呼叫這個initialize函式,那麼後續的操作就會有問題,建構函式會被預設呼叫,所以使用起來比較簡單,對使用者做出了最少的...

靜態類和單例模式區別

觀點一 單例 單例模式比靜態方法有很多優勢 首先,單例可以繼承類,實現介面,而靜態類不能 可以整合類,但不能整合例項成員 其次,單例可以被延遲初始化,靜態類一般在第一次載入是初始化 再次,單例類可以被整合,他的方法可以被覆寫 最後,或許最重要的是,單例類可以被用於多型而無需強迫使用者只假定唯一的例項...