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