Notes for Oracle Certified Professional Java 11 1Z0-819 1

Java 核心概念複習指南

測驗

請用 2-3 句話簡要回答以下問題。

  1. 什麼是 CallableStatement?它與 PreparedStatement 最主要的差異在哪裡?
  2. CallableStatement 支援哪三種參數類型?請簡述它們的用途。
  3. 請說明 Java 中的「內部類別(Inner Class)」和「靜態嵌套類別(Static Nested Class)」的主要區別。
  4. 在介面 (interface) 內部宣告的類別或介面有何特殊行為?
  5. 在 JDBC 連線中,auto-commit 模式的預設狀態是什麼?如何手動關閉它?
  6. 什麼是「短路邏輯運算子(short circuiting operators)」?請舉例說明。
  7. 請說明 finally 區塊在什麼情況下不會被執行?
  8. 什麼是 Java 中的「功能性介面(Functional Interface)」?它與 Lambda 表達式有何關係?
  9. 請簡述 Java 模組系統 (JEP 261) 中「模組化 JAR/JMOD 檔案」與「展開模組目錄」兩種形式的主要差異及適用情境。
  10. Java 中的「實例變數(Instance Variable)」、「靜態變數(Static Variable)」和「區域變數(Local Variable)」在記憶體位置上有何不同?

測驗答案

  1. CallableStatement 是 Java JDBC API 中用於執行資料庫預存程序(stored procedure)或函數的介面。它繼承自 PreparedStatement,但主要差異在於 CallableStatement 支援 IN、OUT、INOUT 三種參數類型,而 PreparedStatement 僅支援 IN 參數。
    使用示例

    1
    2
    3
    4
    5
    CallableStatement cstmt = conn.prepareCall("{call get_employee(?, ?)}");
    cstmt.setInt(1, 101); // IN 參數
    cstmt.registerOutParameter(2, Types.VARCHAR); // OUT 參數
    cstmt.execute();
    String name = cstmt.getString(2); // 獲取 OUT 參數值
  2. CallableStatement 支援三種參數類型:

    • IN 參數:用於傳遞值給預存程序,類似 PreparedStatement 的參數
    • OUT 參數:用於從預存程序取得返回結果,需先註冊後讀取
    • INOUT 參數:同時作為輸入和輸出,需先設置值再註冊為輸出
      重要區別:OUT 和 INOUT 參數需要調用 registerOutParameter() 方法註冊參數類型。
  3. 內部類別 vs 靜態嵌套類別

    • 內部類別
      • 需要外部類別實例才能建立:Outer.Inner inner = outer.new Inner()
      • 可訪問外部類別的實例成員(包括 private 成員)
      • 不能聲明靜態成員(Java 16+ 允許靜態成員)
    • 靜態嵌套類別
      • 直接建立:Outer.StaticNested nested = new Outer.StaticNested()
      • 只能訪問外部類別的靜態成員
      • 行為類似頂層類別,更具靈活性
  4. 介面內部宣告的類別或介面預設是靜態的,即使沒有明確使用 static 關鍵字。這是因為介面不能實例化,所以其內部類別不需要綁定到介面實例。例如:

    1
    2
    3
    4
    5
    6
    interface MyInterface {
    class Nested { // 隱含 static
    // 類別內容
    }
    }
    // 使用方式:MyInterface.Nested nested = new MyInterface.Nested();
  5. JDBC 連線的 auto-commit 模式預設啟用。關閉方式:

    1
    2
    Connection conn = DriverManager.getConnection(url, user, password);
    conn.setAutoCommit(false); // 關閉 auto-commit

    事務管理:關閉後需手動調用 conn.commit() 提交事務或 conn.rollback() 回滾。

  6. 短路邏輯運算子 (&&||) 在確定結果後停止評估後續表達式。
    示例

    1
    2
    3
    if (obj != null && obj.isValid()) {
    // 若 obj 為 null 則跳過 obj.isValid() 檢查
    }

    非短路運算子 &| 會評估所有表達式,可能導致 NullPointerException。

  7. finally 區塊不會執行的情況:

    • 調用 System.exit() 終止 JVM
    • 守護線程在所有非守護線程結束時(不保證 finally 執行)
    • JVM 崩潰或硬體故障
      重要:finally 在 return 後仍會執行!
  8. 功能性介面是只有一個抽象方法的介面,可搭配 Lambda 表達式使用。
    示例

    1
    2
    3
    4
    5
    6
    7
    // 傳統匿名類別
    Runnable r1 = new Runnable() {
    public void run() { System.out.println("Hello"); }
    };

    // Lambda 等效寫法
    Runnable r2 = () -> System.out.println("Hello");
  9. 模組系統兩種形式

    形式 優點 缺點 適用場景
    模組化 JAR/JMOD 易於分發部署 更新需重新打包 正式發布
    展開模組目錄 快速修改測試 不易分發 開發階段
  10. 變數記憶體位置

    • 區域變數:stack 記憶體,方法結束即釋放
    • 實例變數:heap 記憶體,隨物件生命週期
    • 靜態變數:方法區(元空間),類別載入時初始化
      多執行緒注意:靜態變數需同步控制(synchronized 或 volatile)

申論題

請根據提供的資料,選擇其中五題,以申論形式闡述您的理解。

  1. PreparedStatement vs CallableStatement

    • 功能差異
      • PreparedStatement:執行參數化SQL查詢,防範SQL注入
      • CallableStatement:執行預存程序(stored procedures)和函數
    • 參數處理
      • PreparedStatement:僅支援IN參數
      • CallableStatement:支援IN, OUT, INOUT三種參數
      • OUT參數需使用registerOutParameter()註冊
    • 應用場景
      • 優先使用CallableStatement時機:當資料庫已有複雜業務邏輯的預存程序時
      • 範例:銀行轉帳事務處理
    • 效能考量:預存程序通常比動態SQL更高效
  2. 內部類別 vs 靜態嵌套類別

    • 設計哲學
      • 內部類別:與外部類別實例緊密耦合
      • 靜態嵌套類別:獨立於外部類別實例
    • 實例化差異
      1
      2
      3
      4
      5
      6
      // 內部類別實例化
      Outer outer = new Outer();
      Outer.Inner inner = outer.new Inner();

      // 靜態嵌套類別實例化
      Outer.StaticNested staticNested = new Outer.StaticNested();
    • 記憶體管理:內部類別持有外部類別引用,可能導致記憶體洩漏
    • 介面嵌套類別:預設靜態,因介面無法實例化
  3. Java模組系統形式比較

    特性 模組化JAR/JMOD 展開模組目錄
    結構 壓縮檔案格式 檔案系統目錄結構
    部署 適合生產環境 適合開發環境
    更新 需重新打包 直接修改檔案
    效能 啟動較快 啟動較慢
    應用策略:開發階段用展開目錄,發布時打包為JAR
  4. 功能性介面與Lambda

    • 協同機制:Lambda自動實現功能性介面的單一抽象方法
    • Predicate示例
      1
      2
      3
      4
      5
      6
      7
      // 匿名內部類別
      Predicate<Integer> oldWay = new Predicate<Integer>() {
      public boolean test(Integer i) { return i > 0; }
      };

      // Lambda表達式
      Predicate<Integer> newWay = i -> i > 0;
    • 優勢
      • 代碼簡潔度提升50%以上
      • 可讀性增強
      • 減少樣板代碼
  5. 變數類型與執行緒安全

    • 區域變數
      • 生命週期:方法執行期間
      • 執行緒安全:每個線程有自己的stack,天然安全
    • 實例變數
      • 生命週期:物件存在期間
      • 執行緒安全:需同步控制
    • 靜態變數
      • 生命週期:類別載入期間
      • 執行緒安全:高風險,需用synchronizedvolatile
    • 最佳實踐:盡量使用區域變數,減少共享狀態
  6. try-catch-finally進階

    • finally保證執行:即使return後仍會執行
    • 例外情況
      • System.exit()立即終止JVM
      • 守護線程隨JVM結束
      • JVM崩潰
    • break/continue限制
      • 只能在循環結構中使用
      • 在if/else中直接使用會導致編譯錯誤
      • 解決方案:使用標籤(label)跳出嵌套循環

關鍵詞彙表

  • CallableStatement
    Java JDBC API 中用於執行資料庫預存程序 (stored procedure) 或函數的介面,繼承自 PreparedStatement。支援 IN、OUT 和 INOUT 三種參數類型。使用時需調用 prepareCall() 方法建立實例,並使用 registerOutParameter() 註冊輸出參數。

  • PreparedStatement
    Java JDBC API 中用於執行參數化 SQL 語句的介面,可有效防止 SQL 注入攻擊。使用 ? 作為參數佔位符,通過 setXxx() 方法設置參數值。比 Statement 更高效,特別是在重複執行相同SQL時。

  • IN 參數
    CallableStatement 和 PreparedStatement 共用的輸入參數類型。用於將Java程式中的值傳遞給SQL語句或預存程序。設置方法:setInt(), setString() 等。

  • OUT 參數
    僅 CallableStatement 支援的參數類型,用於從預存程序獲取返回值。必須先使用 registerOutParameter() 註冊參數類型和位置,執行後通過 getXxx() 方法獲取值。

  • INOUT 參數
    CallableStatement 特有的參數類型,兼具輸入和輸出功能。使用時需先設置輸入值,再註冊為輸出參數,最後獲取更新後的值。

  • ResultSet
    代表資料庫查詢結果集的物件,提供游標導航和資料讀取方法。可通過 next() 遍歷結果,使用 getInt(), getString() 等方法讀取欄位值。支援可滾動和可更新結果集。

  • 嵌套類別 (Nested Class)
    定義在另一個類別或介面內部的類別,分為靜態和非靜態兩類。主要用於封裝僅在外部類別中使用的輔助邏輯,提高封裝性。

  • 頂層類別 (Top Level Class)
    直接定義在.java檔案中的類別,非嵌套類別。每個頂層類別必須與文件名相同,且只能有一個public頂層類別。

  • 內部類別 (Inner Class)
    非靜態嵌套類別,與外部類別實例關聯。可訪問外部類別的所有成員,常用於事件處理器和回調實現。實例化需通過外部類別實例。

  • 靜態嵌套類別 (Static Nested Class)
    靜態的嵌套類別,不依賴外部類別實例。行為類似頂層類別,但可訪問外部類別的靜態成員。常用於工具類別實現。

  • 自動提交模式 (Auto-commit mode)
    JDBC 連線的預設事務模式,每個SQL語句執行後自動提交。關閉後需手動調用 commit() 提交事務或 rollback() 回滾。

  • System.exit()
    終止JVM的靜態方法,參數為狀態碼(0表示正常終止)。調用後不會執行finally區塊,應謹慎使用。

  • 短路邏輯運算子 (Short-circuiting operators)
    &&|| 運算子,在結果確定後跳過後續評估。例如:if (obj != null && obj.isValid()) 可避免NullPointerException。

  • 覆寫 (Overriding)
    子類別重新定義父類別方法,需滿足:方法名相同、參數列表相同、返回類型兼容、訪問修飾符不更嚴格。Java 5+ 支援協變返回類型。

  • 協變返回類型 (Covariant return type)
    Java 5+ 特性,允許覆寫方法返回原返回類型的子類型。提高API靈活性,減少類型轉換。

  • 介面欄位 (Interface fields)
    介面中宣告的欄位默認為 public static final,必須初始化。常用於定義常數,Java 8+ 可通過靜態方法提供更靈活的常數管理。

  • 構造函數 (Constructor)
    類別實例化時調用的特殊方法,方法名與類名相同。可重載,但不可覆寫。第一行必須調用 super()this(),兩者不可共存。

  • 私有方法 (Private method)
    僅類別內部可訪問的方法,子類別不可見。Java 9+ 允許介面定義私有方法,用於提取公共邏輯。

  • 飢餓 (Starvation)
    線程因長期無法獲取CPU時間而”飢餓”。常見原因:高優先級線程壟斷CPU,或同步機制設計不當。解決:公平鎖、線程優先級調整。

  • 抖動 (Thrashing)
    系統因過度線程上下文切換導致效能急降。通常由太多活動線程競爭有限CPU資源引起。解決:減少線程數、使用線程池。

  • ScheduledExecutorService
    ExecutorService 子介面,支援延遲和週期性任務執行。通過 Executors.newScheduledThreadPool() 創建,比 Timer 更靈活可靠。

  • ScheduledFuture
    ScheduledExecutorService 提交任務後返回的對象,可取消任務或查詢狀態。get() 方法獲取結果,可能阻塞。

  • scheduleAtFixedRate
    固定速率執行任務,忽略任務執行時間。適用於嚴格週期性任務,如每分鐘採集數據。

  • scheduleWithFixedDelay
    固定延遲執行任務,每次任務結束後等待固定間隔。適用於需要冷卻期的任務,如API調用限流。

  • Executor
    線程執行基礎介面,僅定義 execute(Runnable) 方法。將任務提交與執行機制解耦。

  • ExecutorService
    Executor 擴展介面,增加任務提交、關閉管理等功能。支援 Callable 任務和 Future 獲取結果。

  • Executors
    工廠類別,提供創建各種線程池的靜態方法,如:

    • newFixedThreadPool():固定大小線程池
    • newCachedThreadPool():可擴展線程池
    • newSingleThreadExecutor():單線程執行器
  • 模組化 JAR (Modular JAR)
    包含 module-info.class 的JAR文件,定義模組邊界和依賴。Java 9+ 的標準分發格式,支援強封裝和可靠配置。

  • JMOD 檔案
    Java模組系統專用格式,可包含原生代碼和配置。主要用於JDK模組,應用開發較少使用。

  • 展開模組目錄 (Exploded-Module Directory)
    模組的未打包目錄結構,便於開發調試。目錄名為模組名,包含展開的類別和資源文件。

  • 功能性介面 (Functional Interface)
    僅含一個抽象方法的介面,可用 @FunctionalInterface 註解標記。Java 內建 java.util.function 包提供常用功能性介面。

  • Lambda 表達式 (Lambda Expression)
    匿名函數簡寫語法:(參數) -> 表達式。自動實現功能性介面,簡化集合操作和事件處理。

  • Predicate
    java.util.function 包中的功能性介面,定義 test(T t) 方法。常用於過濾操作:list.stream().filter(predicate)

  • 區域變數 (Local Variable)
    方法或代碼塊內聲明的變數,無默認值必須初始化。Java 10+ 支援 var 類型推斷。線程安全,存在於stack內存。

  • 實例變數 (Instance Variable)
    類別內聲明的非靜態字段,每個實例獨立。有默認值(0、false、null),存在於heap內存。

  • 靜態變數 (Static Variable / Class Variable)
    類別內 static 字段,所有實例共享。類別加載時初始化,存在於方法區內存。多線程環境需同步控制。

  • 元註解 (Meta-annotations)
    用於註解其他註解的註解,包括:

    • @Target:指定可應用元素類型
    • @Retention:指定註解保留策略
    • @Documented:包含在Javadoc
    • @Inherited:允許子類別繼承
    • @Repeatable:允許多次應用
  • @Target
    指定註解適用目標,如 ElementType.TYPE(類別)、METHOD(方法)、FIELD(字段)等。

  • @Retention
    定義註解生命周期:

    • SOURCE:僅源代碼
    • CLASS:編譯後保留(默認)
    • RUNTIME:運行時可通過反射讀取
  • @Documented
    指示註解應包含在生成文檔中。

  • @Inherited
    允許子類別繼承父類別的註解,僅對類別註解有效。

  • @Repeatable
    Java 8+ 特性,允許同一位置多次應用相同註解。需定義容器註解。

  • switch statement rules
    Java 17+ 支持:

    • 表達式類型:整型、枚舉、String(Java 7+)
    • case 可為常量、枚舉值或文本
    • default 可選但建議使用
    • Java 12+ 支持箭頭語法:case X -> ...
  • JEP 261
    Java 模組系統(Project Jigsaw)核心規範,定義:

    • 模組聲明語法(module-info.java)
    • 模組路徑(modulepath)
    • 訪問控制規則(exports/opens)
    • 兩種模組形式:JMOD和展開目錄
  • OUT 參數:CallableStatement 中用於從預存程序取得返回結果的輸出參數。

  • INOUT 參數:CallableStatement 中同時作為輸入和輸出的參數。

  • ResultSet:在 JDBC 中,用於存放查詢結果集的物件。

  • 嵌套類別 (Nested Class):在另一個類別或介面內部定義的類別。

  • 頂層類別 (Top Level Class):不是嵌套類別的類別,直接定義在 Java 檔案中。

  • 內部類別 (Inner Class):一種非靜態的嵌套類別,必須依賴外部類別的實例才能創建。

  • 靜態嵌套類別 (Static Nested Class):一種使用 static 關鍵字宣告的嵌套類別,行為上等同於頂層類別,不需外部類別實例即可創建。

  • 自動提交模式 (Auto-commit mode):JDBC 連線的預設模式,每個 SQL 陳述式會被視為一個事務並自動提交。

  • System.exit():Java 中用於終止 JVM 執行的靜態方法。

  • 短路邏輯運算子 (Short-circuiting operators):指 && (AND) 和 || (OR) 運算子,如果在評估過程中可以確定整個表達式的值,則不會評估剩餘的子表達式。

  • 覆寫 (Overriding):子類別重新定義父類別中已有的方法。

  • 協變返回類型 (Covariant return type):Java 1.5 之後,覆寫方法可以返回原方法返回類型的一個子類別。

  • 介面欄位 (Interface fields):在介面中宣告的欄位,預設為 public、static 和 final。

  • 構造函數 (Constructor):用於建立物件實例的特殊方法。在其中只能呼叫 super() 或 this() 之一,不能同時呼叫。

  • 私有方法 (Private method):只能在其宣告的類別內部訪問的方法,子類別無法直接訪問或覆寫父類別的私有方法。

  • 飢餓 (Starvation):指一個執行緒因為其他執行緒長時間獨佔 CPU 而無法獲得執行時間的現象。

  • 抖動 (Thrashing):指程式因為執行緒過度頻繁地上下文切換,導致程式進度緩慢或停滯的現象。

  • ScheduledExecutorService:ExecutorService 的子介面,提供延遲和週期性執行任務的功能。

  • ScheduledFuture:ScheduledExecutorService 的 schedule 方法返回的物件,可用於取消任務或檢查執行狀態。

  • scheduleAtFixedRate:ScheduledExecutorService 中用於固定頻率執行任務的方法,不考慮任務本身的執行時間。

  • scheduleWithFixedDelay:ScheduledExecutorService 中用於每次任務執行完畢後,再延遲一段時間執行的任務方法,會考慮任務執行時間。

  • Executor:Java java.util.concurrent 套件中的基礎介面,只定義了 execute(Runnable command) 方法,用於執行任務。

  • ExecutorService:繼承自 Executor,提供更豐富的管理功能,如提交任務、取得結果 (Future)、關閉執行緒池等。

  • Executors:一個工具類別,提供靜態工廠方法來建立各種 ExecutorService 實例,例如 newFixedThreadPool、newSingleThreadExecutor 等。

  • 模組化 JAR (Modular JAR):包含編譯後的模組定義 (module-info.class) 及相關類別和資源檔案的 JAR 檔,是 Java 模組常見的打包方式。

  • JMOD 檔案:Java 模組系統中另一種模組打包格式,類似於模組化 JAR。

  • 展開模組目錄 (Exploded-Module Directory):以模組名稱命名的目錄,其內容是對應於套件階層的展開目錄樹,方便開發與測試。

  • 功能性介面 (Functional Interface):只包含一個抽象方法的介面,可選擇性地包含多個預設方法或靜態方法。

  • Lambda 表達式 (Lambda Expression):Java 8 引入的語法糖,用於簡潔地實現功能性介面。

  • Predicate:java.util.function 套件中的功能性介面,包含一個 test(T t) 抽象方法,返回布林值,常用於過濾條件。

  • 區域變數 (Local Variable):在方法、建構子或程式區塊內部宣告的變數,作用範圍僅限於宣告它的區塊。

  • 實例變數 (Instance Variable):在類別內、方法外宣告且沒有 static 關鍵字的變數,每個物件都有獨立的副本。

  • 靜態變數 (Static Variable / Class Variable):在類別內、方法外宣告並加上 static 關鍵字的變數,屬於類別本身,所有物件共享同一份。

  • 元註解 (Meta-annotations):用於註解其他註解的特殊註解,例如 @Target、@Retention 等,用來為自定義註解提供元信息。

  • @Target:元註解,指定自定義註解可以應用於哪些程式元素 (如類別、方法、欄位)。

  • @Retention:元註解,定義自定義註解的生命週期 (僅原始碼、編譯後保留、運行時保留)。

  • @Documented:元註解,表示該註解會被包含在 JavaDoc 生成的文檔中。

  • @Inherited:元註解,表示子類別可以繼承父類別上的註解。

  • @Repeatable:元註解 (Java 8 新增),表示該註解可以在同一個地方多次使用。

  • switch statement rules:定義 switch 陳述式中允許的資料類型、case 常數的限制、default 標籤的使用規則等。

  • JEP 261:Java 模組系統的規範提案,定義了 Java 模組的兩種形式。

Notes for Oracle Certified Professional Java 11 1Z0-819 1

https://blog.kwunlam.com/Notes-for-Oracle-Certified-Professional-Java-11-1Z0-819-1/

Author

Elliot

Posted on

2025-06-10

Updated on

2025-06-10

Licensed under