一.靜態變量跟實例變量的區別:
1.靜態變量:由static修飾,在JVM中,靜態變量的加載順序在對象之前,因此靜態變量不依附於對象存在,可以在不實例化類的情況下直接使用靜態變量,如下代碼所示。
public class StaticTest {
static int a = 13;
int b = 14;
public static void main(String[] args) {
int c = StaticTest.a;
System.out.println(c);
}
}
靜態變量屬於類,不屬於類中任何一個對象,因此靜態變量又叫做類變量,一個類不管創建多少個對象(對象是類的一個實例),靜態變量在內存中有且僅有一個。
2.實例變量:必須依附於對象存在,只有實例化類後纔可以使用此類中的實例變量。
public class StaticTest {
static int a = 13;
int b = 14;
public static void main(String[] args) {
int d = new StaticTest().b;
System.out.println(d);
}
}
二.靜態方法跟實例方法的區別:
1.靜態方法:方法用static關鍵字修飾,靜態方法與靜態成員變量一樣,屬於類本身,在類裝載的時候被裝載到內存,不自動進行銷燬,會一直存在於內存中,直到JVM關閉。使用時也是不需要實例化類,能夠直接使用。靜態方法無法被重寫。
public class StaticTest {
public static void MyStatic(){
System.out.println("這是StaticTest的一個靜態方法");
}
public static void main(String[] args) {
StaticTest.MyStatic();
}
}
需要注意的是:在靜態方法中只能訪問類中的靜態成員跟靜態方法,不能直接訪問類中的實例變量跟實例方法,原因是靜態方法在JVM中的加載順序也在對象之前,直接使用實例變量跟實例方法的話,可能實例變量跟實例方法所依附的對象並沒有被創建,會導致無法找到所使用的實例變量跟實例方法。
要想使用實例變量跟實例方法可以採用如下方法:在靜態方法中創建實例變量和實例方法所在的對象,通過這個對象來使用實例變量跟實例方法。如代碼所示:
public class StaticTest {
int b = 14;
public void MyMethod(){
System.out.println("這是StaticTest的一個實例方法");
}
public static void MyStatic(){
StaticTest st = new StaticTest();
int e = st.b;
st.MyMethod();
}
}
2.實例化方法:屬於實例對象,實例化後纔會分配內存,必須通過類的實例來引用。不會常駐內存,當實例對象被JVM 回收之後,也跟着消失。
public class StaticTest {
public void MyMethod(){
System.out.println("這是StaticTest的一個實例方法");
}
public static void main(String[] args) {
new StaticTest().MyMethod();
}
}
附加:
1.線程安全:靜態方法是共享代碼段,靜態變量是共享數據段。既然是“共享”就有併發的問題。非靜態方法是針對確定的一個對象的,所以不會存在線程安全的問題。
2.如果靜態方法在系統中定義太多,會佔用大量的資源,最後造成內存溢出,所以靜態方法不能濫用。