Java中靜態跟非靜態的區別總結

一.靜態變量跟實例變量的區別:
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.如果靜態方法在系統中定義太多,會佔用大量的資源,最後造成內存溢出,所以靜態方法不能濫用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章