Java使用static的方法和類與不使用的區別
一、靜態變數與例項變數的區別(對於常量和變數而言):
1. 區域性變數:
區域性變數是類的方法中的變數;
2. 例項變數:
例項變數也是類中獨立於方法之外的變數,不過沒有static修飾,也叫 物件變數
3. 類變數(靜態變數):
類變數是類中獨立於方法之外的變數,用static 修飾,也叫 靜態變數
package static_study; /** * Created by Taoyongpan on 2017/5/3. */ public class Test { static String ss ;//類變數、靜態變數 String s;//例項變數 public static void main(String[] args) { String is ;//區域性變數 } }
4.例項變數與靜態變數的區別:
靜態變數也叫類變數,這種變數前加了static修飾符。可以直接用類名呼叫,也可以用物件呼叫,而且所
有物件的同一個類變數 都是共享同一塊記憶體空間。
例項變數也叫物件變數,這種變數沒有加static修飾符。只能通過物件呼叫, 而且所有物件的同一個例項
變數是共享不同的記憶體空間的。
靜態變數是所有物件共有的,某一個物件將它的值改變了,其他物件再去獲取它的值,得到的是改變後
的值;
例項變數則是每一個物件私有的,某一個物件將它的值改變了,不影響其他物件取值的結果,其他物件
仍會得到例項變數一開始就被賦予的值。
package static_study; /** * Created by Taoyongpan on 2017/5/3. */ public class Test02 { static int a = 0; int b = 0; } class test03{ public static void main(String[] args){ Test02 t1 = new Test02(); Test02 t2 = new Test02(); t1.a = 2; t1.b = 3; System.out.println(t2.a);//輸出結果是2,靜態變數是針對所有物件的,所以a1改變a,a2的a也改變 System.out.println(t2.b);//輸出結果是0,例項只改變自身的,所以a1物件的b改變,不影響物件a2的b變數 } }
解釋(一) : 在建立例項物件的時候,記憶體中會為每一個例項物件的每一個非靜態成員變數開闢一段內
存空間,用來儲存這個物件所有的非靜態成員變數值。即使兩個不同的例項物件是屬於同一個類,它們的同
名非靜態成員變數在記憶體中佔用的空間是不同的。
靜態成員變數有所不同。所有的例項物件都共用一個靜態變數,記憶體中只有同一處空間存放這個靜態變
量值的。因此,如果一個物件把靜態變數值改了,另外一個物件再取靜態變數值就是改過之後的值了。
解釋(二):類的靜態變數在記憶體中只有一個,java虛擬機器在載入類的過程中為靜態變數分配記憶體,靜態
變數位於方法區,被類的所有例項共享。靜態變數可以直接通過類名進行訪問,其生命週期取決於類的生命
週期。
而例項變數取決於類的例項。每建立一個例項,java虛擬機器就會為例項變數分配一次記憶體,例項變數位於
堆區中,其生命週期取決於例項的生命週期。
二、靜態方法和非靜態方法的區別(對於方法而言):
● 生命週期(Lifecycle):
靜態方法(Static Method)與靜態成員變數一樣,屬於類本身,在類裝載的時候被裝載到記憶體(Memory),不自動進行銷燬,會一直存在於記憶體中,直到JVM關閉。
非靜態方法(Non-Static Method)又叫例項化方法,屬於例項物件,例項化後才會分配記憶體,必須通過類的例項來引用。不會常駐記憶體,當例項物件被JVM 回收之後,也跟著消失。
● 在記憶體中儲存位置
靜態方法和靜態變數建立後始終使用同一塊記憶體,是連續的。
非靜態方法會存在於記憶體的多個地方,是離散的。
● 效率
靜態方法的使用效率比非靜態方法的效率高。
● 執行緒安全
靜態方法是共享程式碼段,靜態變數是共享資料段。既然是“共享”就有併發(Concurrence)的問題。
非靜態方法是針對確定的一個物件的,所以不會存線上程安全的問題。
● 使用範圍
靜態方法:⒈ 有靜態屬性的類,一般會定義靜態方法。⒉ 沒有屬性的類,一般會定義靜態方法。⒊ 如果一個方法與他所在類的例項物件無關,那麼它就應該是靜態的。靜態方法可以被繼承但是不能被覆蓋。
● 總計
如果靜態方法在系統中定義太多,會佔用大量的資源,最後造成記憶體溢位,所以靜態方法不能濫用。如果從執行緒安全、效能、相容性上來看,選用例項化方法為宜。
三、靜態工廠和構造器(對於類而言):
.主要優點:
①靜態工廠方法與構造器不同的第一大優勢在於,他們有名稱。
②靜態工廠方法與構造器不同的第二大優勢在於,不必每次呼叫他們的時候都建立一個新物件。
③靜態工廠方法與構造器不同的第三大優勢在於,他們可以返回型別的任何子型別的物件。
④靜態工廠方法與構造器不同的第四大優勢在於,在建立引數化型別例項的 時候,他們使程式碼變得更加簡潔。
.主要缺點:
①類如果不含共有的或者受保護的構造器,就不能被子類化;
②他們與 其他的靜態方法實際上沒有任何區別。