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

追風箏的豬發表於2018-04-13
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/qq_34173549/article/details/79926923

一.靜態變數跟例項變數的區別: 
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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

靜態變數屬於類,不屬於類中任何一個物件,因此靜態變數又叫做類變數,一個類不管建立多少個物件(物件是類的一個例項),靜態變數在記憶體中有且僅有一個。


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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

二.靜態方法跟例項方法的區別: 
1.靜態方法:方法用static關鍵字修飾,靜態方法與靜態成員變數一樣,屬於類本身,在類裝載的時候被裝載到記憶體,不自動進行銷燬,會一直存在於記憶體中,直到JVM關閉。使用時也是不需要例項化類,能夠直接使用。靜態方法無法被重寫。

public class StaticTest {
    public static void MyStatic(){
        System.out.println("這是StaticTest的一個靜態方法");
    }

    public static void main(String[] args) {
        StaticTest.MyStatic();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

需要注意的是:在靜態方法中只能訪問類中的靜態成員跟靜態方法,不能直接訪問類中的例項變數跟例項方法,原因是靜態方法在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();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2.例項化方法:屬於例項物件,例項化後才會分配記憶體,必須通過類的例項來引用。不會常駐記憶體,當例項物件被JVM 回收之後,也跟著消失。

public class StaticTest {

    public void MyMethod(){
        System.out.println("這是StaticTest的一個例項方法");
    }

    public static void main(String[] args) {
        new StaticTest().MyMethod();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

附加: 
1.執行緒安全:靜態方法是共享程式碼段,靜態變數是共享資料段。既然是“共享”就有併發的問題。非靜態方法是針對確定的一個物件的,所以不會存線上程安全的問題。 
2.如果靜態方法在系統中定義太多,會佔用大量的資源,最後造成記憶體溢位,所以靜態方法不能濫用。


相關文章