- static變數(靜態變數)
靜態變數是被static關鍵字宣告的類變數,它們屬於類而不是類的例項。
特點:
所有例項共享同一個靜態變數。
在類載入時初始化,且在程式執行期間始終存在。
示例:
public class Counter {
// 靜態變數
private static int count = 0;
// 建構函式
public Counter() {
count++;
}
public static int getCount() {
return count;
}
}
在這個示例中,count是一個靜態變數,所有Counter類的例項共用這個變數。
- static方法(靜態方法)
靜態方法是被宣告為static的方法,可以直接透過類名訪問,而無需建立例項。
特點:
不能直接訪問例項變數和例項方法。
可以直接訪問其他靜態變數和方法。
示例:
public class MathUtil {
public static int add(int a, int b) {
return a + b;
}
}
// 呼叫靜態方法
int sum = MathUtil.add(5, 10);
3. static塊(靜態初始化塊)
static塊是在類載入時執行的程式碼塊,用於初始化靜態變數。
特點:
僅執行一次,且在類的任何例項被建立之前執行。
示例:
public class Example {
private static int value;
static {
value = 10; // 初始化靜態變數
System.out.println("靜態初始化塊執行");
}
}
4. 記憶體管理
static成員儲存在方法區(Method Area),這些成員的生命週期是從類載入到程式終止。即便沒有例項,靜態變數依然存在。
- 單例模式(Singleton Pattern)
static關鍵字通常用於實現單例模式,確保某個類只有一個例項,並提供訪問該例項的方法。
示例:
public class Singleton {
private static Singleton instance;
private Singleton() {} // 私有建構函式
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
6. 靜態匯入(Static Import)
靜態匯入是Java 5引入的功能,使得可以直接呼叫類的靜態方法和欄位,無需類名字首。
示例:
import static java.lang.Math.*;
public class Test {
public static void main(String[] args) {
double result = sqrt(16); // 直接呼叫靜態方法
System.out.println(result);
}
}
7. 靜態介面成員
從Java 8開始,介面可以包含靜態方法。靜態介面方法能夠直接透過介面呼叫。
示例:
public interface MyInterface {
static void staticMethod() {
System.out.println("這是靜態方法");
}
}
// 呼叫靜態介面方法
MyInterface.staticMethod();
8. 靜態內部類
靜態內部類是用static關鍵字宣告的類,它不需要外部類的例項來建立。
特點:
可以訪問外部類的靜態成員,但不能訪問外部類的例項成員。
示例:
public class Outer {
static int outerStaticVariable = 10;
static class Inner {
void display() {
System.out.println("外部類的靜態變數: " + outerStaticVariable);
}
}
}
// 建立靜態內部類的例項
Outer.Inner inner = new Outer.Inner();
inner.display();
9.static 關鍵字的使用注意事項
不能訪問非靜態成員:在靜態方法中,不能直接訪問非靜態變數或方法,必須透過物件引用來訪問。
共享資料:static 變數是共享的,所有例項都共享同一個變數,因此對 static 變數的修改會影響到所有例項。
在單例模式中使用:static 可以用於實現單例模式,透過 static 方法或變數來確保只有一個例項存在。