1. 程式人生 > >static和非static的區別

static和非static的區別

那天面試,沒有答出來,很可惜,但是還是拿到了offer,在此做一個總結,希望你們看到能夠受用。
● 生命週期(Lifecycle):
靜態方法(Static Method)與靜態成員變數一樣,屬於類本身,在類裝載的時候被裝載到記憶體(Memory),不自動進行銷燬,會一直存在於記憶體中,直到JVM關閉。
非靜態方法(Non-Static Method)又叫例項化方法,屬於例項物件,例項化後才會分配記憶體,必須通過類的例項來引用。不會常駐記憶體,當例項物件被JVM 回收之後,也跟著消失。 
● 在記憶體中儲存位置
靜態方法和靜態變數建立後始終使用同一塊記憶體,是連續的。
非靜態方法會存在於記憶體的多個地方,是離散的。
● 效率
 靜態方法的使用效率比非靜態方法的效率高。
● 執行緒安全
靜態方法是共享程式碼段,靜態變數是共享資料段。既然是“共享”就有併發(Concurrence)的問題。
非靜態方法是針對確定的一個物件的,所以不會存線上程安全的問題。
● 使用範圍
靜態方法:⒈ 有靜態屬性的類,一般會定義靜態方法。⒉ 沒有屬性的類,一般會定義靜態方法。⒊ 如果一個方法與他所在類的例項物件無關,那麼它就應該是靜態的。靜態方法可以被繼承但是不能被覆蓋
●  總計
如果靜態方法在系統中定義太多,會佔用大量的資源,最後造成記憶體溢位,所以靜態方法不能濫用。如果從執行緒安全、效能、相容性上來看,選用例項化方法為宜。



static 方法 (靜態方法)
方法在該方法所屬型別第一次被使用的時候載入、在該型別所在應用程式域解除安裝的時候解除安裝、也就是說 static 方法只加載一次、除非整個Domain 被解除安裝了。
例項方法(非靜態方法)
方法是在第一次該方法第一次呼叫的時候會載入、然後被快取起來。但是中間如果有GC 的話, 就會被收集,那下次再呼叫該方法時,又得重新載入該方法。也就是說,例項方法有可能載入多總的來說,static 方法只用載入一次,但一直會佔用記憶體。多了些資源消耗;而例項方法需要載入多次,但不會一直佔用記憶體。少些資源消耗。一般來說, 在程式裡面,一些使用頻率高的方法就用static 方法、使用頻率低的則用例項方法。