static 修飾的成員**屬於類本身,而非某個實例**。類加載時初始化,全類共享唯一副本,無需創建對象即可訪問。
public class Employee {
private static int nextId = 1; // 類共享,全員唯一編號生成器
private int id; // 實例域,每個對象獨有
public Employee() { this.id = nextId++; }
public static int getNextId() { return nextId; }
}
public static final double PI = 3.14159;,命名全大寫+下劃線,編譯期常量折疊優化。private static final Instance INSTANCE = new Instance();public class MathUtils {
public static int max(int a, int b) { return a > b ? a : b; }
// 無法訪問 this、實例字段、實例方法
// 僅能訪問靜態字段、靜態方法
}
Collections、Objects、Stream)全靜態方法。LocalDate.now()、Optional.of(value)。public class DatabaseConfig {
private static String URL, USER, PASS;
static {
// 類首次加載/首次主動使用時執行,僅一次,早於構造器
Properties prop = loadProps("db.properties");
URL = prop.getProperty("url");
USER = prop.getProperty("user");
PASS = prop.getProperty("pass");
// 僅加載一次驅動
try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (Exception e) { throw new ExceptionInInitializerError(e); }
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASS);
}
}
ExceptionInInitializerError。import static java.lang.Math.*; // 導入所有靜態成員
import static java.util.stream.Collectors.toList; // 導入單個
public class Demo {
public void calc() {
double r = sqrt(pow(PI, 3)); // 直接用方法名、常量名
List list = stream.of("a","b").collect(toList());
}
}
assertEquals、常用工具方法 toList、DSL 風格 API。public class Outer {
private static class StaticNested { // 不持有 Outer 實例引用
void print() { System.out.println("Static Nested"); }
}
class Inner { // 非靜態內部類,隱含持有 Outer.this
void print() { System.out.println("Inner"); }
}
}
// 使用
Outer.StaticNested nested = new Outer.StaticNested(); // 無需 Outer 實例
Outer.Inner inner = new Outer().new Inner(); // 需 Outer 實例
java.lang.Class 對象中。volatile/AtomicReference;static final 引用不可變對象天然安全。| 題目 | 答案 | 解析 |
|---|---|---|
| static 方法能否重寫? | 不能 | 靜態方法屬於類,子類同名方法為**隱藏**而非重寫,編譯期靜態綁定 |
| static 代碼塊 vs 構造代碼塊 執行順序? | static > 構造塊 > 構造器 | 類加載時執行 static,每次 new 時依次執行構造塊、構造器 |
| 介面中能否定義 static 方法? | Java 8+ 可 | interface I { static void log() {} },不可被實現類重寫 |
| static 變量會被序列化嗎? | 不會 | 屬於類不屬於對象,transient 無效 |
final + 私有構造器 + 全靜態方法。static final,基本類型/不可變對象編譯期內聯。enum 或靜態內部類(延遲加載+線程安全)。