本文從五個維度剖析 static 用法:靜態成員變量、靜態方法、靜態塊、靜態內部類、靜態導包。
| 屬性 | 靜態對象 | 非靜態對象 |
|---|---|---|
| 歸屬 | 類共同擁有 | 各實例獨立擁有 |
| 內存分配 | 固定區域,優先分配 | 堆中隨實例分配 |
| 初始化順序 | 優於非靜態 | 次於靜態 |
以 static 修飾,類名直接調用無需實例化。優點:全局唯一、引用便捷。限制:只能調用 static 方法、只能訪問 static 數據、不能使用 this/super。
public class StaticExercise {
public static String sky = "jeyson";
public static String getMySky(String sky) { return sky; }
static {
System.out.println("靜態塊執行");
System.out.println(getMySky(sky));
}
// 測試略
}
適用於與外部類緊密關聯、僅在使用外部類時才需加載的場景。隨外部類加載而初始化,調用方式:OuterClass.InnerStatic.staticMember。
class StaticTest {
public static String sms = "to my sky";
static class InnerStatic {
public static final String MYSKY = "MY FINAL SKY";
}
}
// 調用:StaticTest.InnerStatic.MYSKY
使用 import static pkg.Class.staticMember 將靜態成員直接引入當前命名空間,無需類名前綴。優點:代碼簡潔;缺點:降低可讀性,慎用。
import static com.generic.MyStaticImportTest.number;
import static com.generic.MyStaticImportTest.getMyWords;
public class StaticExercise {
@Test public void testStatic3() {
int myNumber = number; // 直接使用
getMyWords(); // 直接調用
}
}