Java static關鍵字


java中的static關鍵字主要用於記憶體管理。我們可以應用java static關鍵字在變數,方法,塊和巢狀類中。 static關鍵字屬於類,而不是類的範例。

靜態(static)可以是:

  1. 變數(也稱為類變數)
  2. 方法(也稱為類方法)
  3. 程式碼塊
  4. 巢狀類

1. Java靜態變數

如果將一個變數宣告為static,它就是所謂的靜態變數了。

  • 靜態變數可以用於參照所有物件的公共屬性(對於每個物件不是唯一的)。如:員工公司名稱,學生所在的大學名稱。

靜態變數的優點:

  • 它能使程式儲存器高效(即它節省記憶體)。

理解不使用靜態變數的問題

class Student{  
     int rollno;  
     String name;  
     String college="ITS";  
}

假設在一所學校有500名學生,現在所有範例資料成員將在每次建立物件時獲取記憶體。所有學生都有其唯一的註冊ID:rollno和 name ,因此範例資料成員沒有什麼問題。college 指的是所有物件的共同屬性。如果使它靜態化(使用static關鍵字修飼),這個欄位將只獲得記憶體一次。

Java靜態屬性被共用給所有物件。

靜態變數的範例

//Program of static variable  

class Student8 {
    int rollno;
    String name;
    static String college = "ITS";

    Student8(int r, String n) {
        rollno = r;
        name = n;
    }

    void display() {
        System.out.println(rollno + " " + name + " " + college);
    }

    public static void main(String args[]) {
        Student8 s1 = new Student8(111, "Karan");
        Student8 s2 = new Student8(222, "Aryan");

        s1.display();
        s2.display();
    }
}

上面程式碼執行結果如下 -

111 Karan ITS
222 Aryan ITS

建立物件範例圖如下所示 -

不使用靜態變數的計數器程式

在這個例子中,我們建立了一個名為count的範例變數用來統計建立物件的數目,它在建構函式中執行遞增。 由於範例變數在建立物件時要獲取記憶體,每個物件都將具有範例變數的副本,如果它被遞增了,它也不會反映到其他物件中。所以每個物件在count變數中的值還是1

class Counter {
    int count = 0;// will get memory when instance is created

    Counter() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter c3 = new Counter();

    }
}

上面程式碼執行結果如下 -

1
1
1

計數器靜態變數的程式
如上所述,靜態變數將只獲取一次記憶體,如果任何物件更改靜態變數的值,它將保留其值,所有範例均可存取同一變數值。

class Counter2 {
    static int count = 0;// will get memory only once and retain its value

    Counter2() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        Counter2 c1 = new Counter2();
        Counter2 c2 = new Counter2();
        Counter2 c3 = new Counter2();

    }
}

上面程式碼執行結果如下 -

1
2
3

2. Java靜態方法

如果在任何方法上應用static關鍵字,此方法稱為靜態方法。

  • 靜態方法屬於類,而不屬於類的物件。
  • 可以直接呼叫靜態方法,而無需建立類的範例。
  • 靜態方法可以存取靜態資料成員,並可以更改靜態資料成員的值。

靜態方法的範例

//Program of changing the common property of all objects(static field).  

class Student9 {
    int rollno;
    String name;
    static String college = "ITS";

    static void change() {
        college = "BBDIT";
    }

    Student9(int r, String n) {
        rollno = r;
        name = n;
    }

    void display() {
        System.out.println(rollno + " " + name + " " + college);
    }

    public static void main(String args[]) {
        Student9.change();

        Student9 s1 = new Student9(111, "Karan");
        Student9 s2 = new Student9(222, "Aryan");
        Student9 s3 = new Student9(333, "Sonoo");

        s1.display();
        s2.display();
        s3.display();
    }
}

上面程式碼執行輸出以下結果 -

111 Karan BBDIT
222 Aryan BBDIT
333 Sonoo BBDIT

執行正常計算的靜態方法的另一個範例:

//Program to get cube of a given number by static method  

class Calculate {
    static int cube(int x) {
        return x * x * x;
    }

    public static void main(String args[]) {
        int result = Calculate.cube(5);
        System.out.println(result);
    }
}

上面程式碼執行輸出以下結果 -

125

靜態方法的限制

靜態方法有兩個主要限制。它們分別是:

  • 靜態方法不能直接使用非靜態資料成員或呼叫非靜態方法。
  • thissuper兩個關鍵字不能在靜態上下文中使用。
class A {
    int a = 40;// non static

    public static void main(String args[]) {
        System.out.println(a);
    }
}

上面程式碼執行輸出以下結果 -

[編譯錯誤!]Compile Time Error

為什麼java main方法是靜態的?

這是因為物件不需要呼叫靜態方法,如果它是非靜態方法,jvm首先要建立物件,然後呼叫main()方法,這將導致額外的記憶體分配的問題。

3. Java靜態塊

Java中的靜態塊主要有兩個作用:

  • 用於初始化靜態資料成員。
  • 它在類載入時在main方法之前執行。

靜態塊的範例

class A2 {
    static {
        System.out.println("static block is invoked");
    }

    public static void main(String args[]) {
        System.out.println("Hello main");
    }
}

上面程式碼執行輸出以下結果 -

static block is invoked
Hello main

可以執行程式沒有main()方法嗎?
答:是的,一種方式是靜態塊,但在以前舊的JDK版本中,不是在JDK 1.7。

class A3 {
    static {
        System.out.println("static block is invoked");
        System.exit(0);
    }
}

上面程式碼執行輸出以下結果 -

static block is invoked

在JDK7及以上版本中,輸出將為:

錯誤: 在類 Main 中找不到 main 方法, 請將 main 方法定義為:
   public static void main(String[] args)