Java中的static關鍵字

在Java中,static關鍵字在Java編程中被廣泛使用。Java static關鍵字用於在Java中創建類級變量。靜態變量和方法是類的一部分,而不是類的實例。

Java中的static關鍵字

Java static關鍵字可用於五種情況,如下圖所示。我們將在這裡討論其中四種情況,第五種情況在Java 8中引入,並已在Java 8介面變更中討論。

  1. Java靜態變數

    我們可以使用static關鍵字來定義類級別的變數。靜態變數是屬於類別的變數,而不屬於類的物件/實例。由於靜態變數在所有物件實例之間共享,所以它們不是線程安全的。通常,靜態變數與final關鍵字一起使用,用於共享的資源或所有物件都可以使用的常數。如果靜態變數不是私有的,我們可以使用類名.變數名的方式訪問它。

        //靜態變數的例子
        private static int count;
        public static String str;
        public static final String DB_USER = "myuser";
    
  2. Java靜態方法

    與靜態變數一樣,靜態方法屬於類別而不是類別實例。靜態方法只能訪問類別的靜態變數並調用類別的靜態方法。通常,靜態方法是我們希望公開供其他類別使用的實用方法,而無需創建實例。例如,Collections類別Java Wrapper類別和實用類別都包含許多靜態方法。java程序的入口點main()方法本身就是一個靜態方法。

        //靜態方法範例
        public static void setCount(int count) {
            if(count > 0)
            StaticExample.count = count;
        }
        
        //靜態實用方法
        public static int addInts(int i, int...js){
            int sum=i;
            for(int x : js) sum+=x;
            return sum;
        }
    

    從Java 8開始,我們也可以在接口中使用靜態方法。詳細信息請閱讀Java 8接口變更

  3. Java 靜態區塊

    Java 靜態區塊是當類別被 Java ClassLoader 載入記憶體時會執行的一組陳述式。靜態區塊用於初始化類別的靜態變數。通常用於在類別載入時創建靜態資源。我們無法在靜態區塊中存取非靜態變數。一個類別中可以有多個靜態區塊,儘管這沒有太多意義。靜態區塊的程式碼只在類別載入記憶體時執行一次。

        static{
            //可用於在類別載入時初始化資源
            System.out.println("StaticExample 靜態區塊");
            //只能存取靜態變數和方法
            str="Test";
            setCount(2);
        }
    
  4. Java 靜態類別

    我們可以在巢狀類別中使用 static 關鍵字。static 關鍵字不能用於頂層類別。靜態巢狀類別與其他頂層類別相同,只是為了方便封裝而巢狀。閱讀:Java 巢狀類別

讓我們在一個示範程式中看到 Java 中 static 關鍵字的使用。 StaticExample.java

package com.journaldev.misc;

public class StaticExample {

    //靜態區塊
    static{
        //可用於在類別加載時初始化資源
        System.out.println("StaticExample static block");
        //僅能存取靜態變數和方法
        str="Test";
        setCount(2);
    }
    
    //同一類別中可有多個靜態區塊
    static{
        System.out.println("StaticExample static block2");
    }
    
    //靜態變數範例
    private static int count; //kept private to control its value through setter
    public static String str;
    
    public int getCount() {
        return count;
    }

    //靜態方法範例
    public static void setCount(int count) {
        if(count > 0)
        StaticExample.count = count;
    }
    
    //靜態工具方法
    public static int addInts(int i, int...js){
        int sum=i;
        for(int x : js) sum+=x;
        return sum;
    }

    //靜態類別範例 - 僅用於方便封裝
    public static class MyStaticClass{
        public int count;
        
    }

}

讓我們看一下在測試程式中如何使用靜態變數、方法和靜態類別。 TestStatic.java

package com.journaldev.misc;

public class TestStatic {

    public static void main(String[] args) {
        StaticExample.setCount(5);
        
        //非私有靜態變數可使用類別名稱存取
        StaticExample.str = "abc";
        StaticExample se = new StaticExample();
        System.out.println(se.getCount());
        //類別和實例的靜態變數是相同的
        System.out.println(StaticExample.str +" is same as "+se.str);
        System.out.println(StaticExample.str == se.str);
        
        //靜態巢狀類別與普通頂層類別相同
        StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
        myStaticClass.count=10;
        
        StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
        myStaticClass1.count=20;
        
        System.out.println(myStaticClass.count);
        System.out.println(myStaticClass1.count);
    }
    
}

上述 Java static 關鍵字範例程式的輸出為:

StaticExample static block
StaticExample static block2
5
abc is same as abc
true
10
20

請注意,靜態區塊的程式碼在類別加載到記憶體中時首先執行,且僅執行一次。其他輸出是自解釋的。

Java 靜態導入

通常我們使用類別參考來訪問靜態成員,在Java 1.5中,我們可以使用靜態導入(static import)來避免使用類別參考。以下是一個簡單的Java靜態導入範例。

package com.journaldev.test;

public class A {

	public static int MAX = 1000;
	
	public static void foo(){
		System.out.println("foo static method");
	}
}
package com.journaldev.test;

import static com.journaldev.test.A.MAX;
import static com.journaldev.test.A.foo;

public class B {

	public static void main(String args[]){
		System.out.println(MAX); //normally A.MAX
		foo(); // normally A.foo()
	}
}

請注意import語句,對於靜態導入,我們必須使用import static後跟類別的完整靜態成員名稱。如果要導入一個類別的所有靜態成員,可以使用*,例如import static com.journaldev.test.A.*;。我們應該只在多次使用一個類別的靜態變數時使用它,這樣不利於可讀性。更新:最近我創建了一個視頻來解釋Java中的靜態關鍵字,你應該看一下以下的視頻。https://www.youtube.com/watch?v=2e-l1vb\_fwM

Source:
https://www.digitalocean.com/community/tutorials/static-keyword-in-java