| 修飾對象 | 效果 | 典型場景 |
|---|---|---|
| 類 | 不可被繼承 | 工具類、不可變對象(如 String) |
| 方法 | 不可被覆寫 | 模板方法模式中的固定流程、安全敏感操作 |
| 變量 | 只能賦值一次(常量) | 配置常量、狀態標識、線程安全共享變量 |
static final,類加載階段初始化,命名全大寫下劃線分隔(如 MAX_CONNECTIONS);class Father01 {
final String FATHER01_NAME = "張三";
final int FATHER01_AGE = 20;
final void show() {
// FATHER01_AGE = 9; // 編譯錯誤:final 變量不可二次賦值
System.out.println("姓名: " + FATHER01_NAME);
}
}
final class Father02 {} // 不可繼承
class Son01 extends Father01 {
// @Override public void show() {} // 編譯錯誤:final 方法不可覆寫
}
// class Son02 extends Father02 {} // 編譯錯誤:final 類不可繼承
public abstract class BaseServlet extends HttpServlet {
public final void service(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
// 1. 記錄訪問日志
// 2. 權限判斷
if (hasPermission) {
try {
doService(req, resp); // 子類實現具體業務
} catch (Exception e) {
// 3. 統一異常處理
}
}
}
protected abstract void doService(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException;
}
final 確保核心流程不被子類破壞,體現「好萊塢原則」:Don't call us, we'll call you.
final List<String> list = new ArrayList<>(); list.add("x"); // 合法final 或「實際上 final」,Lambda 同理;