在Java中,static關鍵字在Java編程中被廣泛使用。Java static關鍵字用於在Java中創建類級變量。靜態變量和方法是類的一部分,而不是類的實例。
Java中的static關鍵字
Java static關鍵字可用於五種情況,如下圖所示。
我們將在這裡討論其中四種情況,第五種情況在Java 8中引入,並已在Java 8介面變更中討論。
-
Java靜態變數
我們可以使用
static
關鍵字來定義類級別的變數。靜態變數是屬於類別的變數,而不屬於類的物件/實例。由於靜態變數在所有物件實例之間共享,所以它們不是線程安全的。通常,靜態變數與final關鍵字一起使用,用於共享的資源或所有物件都可以使用的常數。如果靜態變數不是私有的,我們可以使用類名.變數名
的方式訪問它。//靜態變數的例子 private static int count; public static String str; public static final String DB_USER = "myuser";
-
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接口變更。
-
Java 靜態區塊
Java 靜態區塊是當類別被 Java ClassLoader 載入記憶體時會執行的一組陳述式。靜態區塊用於初始化類別的靜態變數。通常用於在類別載入時創建靜態資源。我們無法在靜態區塊中存取非靜態變數。一個類別中可以有多個靜態區塊,儘管這沒有太多意義。靜態區塊的程式碼只在類別載入記憶體時執行一次。
static{ //可用於在類別載入時初始化資源 System.out.println("StaticExample 靜態區塊"); //只能存取靜態變數和方法 str="Test"; setCount(2); }
-
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