Notes for Oracle Certified Professional Java 11 1Z0-819 1
Java 核心概念複習指南
測驗
請用 2-3 句話簡要回答以下問題。
- 什麼是 CallableStatement?它與 PreparedStatement 最主要的差異在哪裡?
- CallableStatement 支援哪三種參數類型?請簡述它們的用途。
- 請說明 Java 中的「內部類別(Inner Class)」和「靜態嵌套類別(Static Nested Class)」的主要區別。
- 在介面 (interface) 內部宣告的類別或介面有何特殊行為?
- 在 JDBC 連線中,auto-commit 模式的預設狀態是什麼?如何手動關閉它?
- 什麼是「短路邏輯運算子(short circuiting operators)」?請舉例說明。
- 請說明 finally 區塊在什麼情況下不會被執行?
- 什麼是 Java 中的「功能性介面(Functional Interface)」?它與 Lambda 表達式有何關係?
- 請簡述 Java 模組系統 (JEP 261) 中「模組化 JAR/JMOD 檔案」與「展開模組目錄」兩種形式的主要差異及適用情境。
- Java 中的「實例變數(Instance Variable)」、「靜態變數(Static Variable)」和「區域變數(Local Variable)」在記憶體位置上有何不同?
測驗答案
CallableStatement 是 Java JDBC API 中用於執行資料庫預存程序(stored procedure)或函數的介面。它繼承自 PreparedStatement,但主要差異在於 CallableStatement 支援 IN、OUT、INOUT 三種參數類型,而 PreparedStatement 僅支援 IN 參數。
使用示例:1
2
3
4
5CallableStatement 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 參數值CallableStatement 支援三種參數類型:
- IN 參數:用於傳遞值給預存程序,類似 PreparedStatement 的參數
- OUT 參數:用於從預存程序取得返回結果,需先註冊後讀取
- INOUT 參數:同時作為輸入和輸出,需先設置值再註冊為輸出
重要區別:OUT 和 INOUT 參數需要調用registerOutParameter()
方法註冊參數類型。
內部類別 vs 靜態嵌套類別:
- 內部類別:
- 需要外部類別實例才能建立:
Outer.Inner inner = outer.new Inner()
- 可訪問外部類別的實例成員(包括 private 成員)
- 不能聲明靜態成員(Java 16+ 允許靜態成員)
- 需要外部類別實例才能建立:
- 靜態嵌套類別:
- 直接建立:
Outer.StaticNested nested = new Outer.StaticNested()
- 只能訪問外部類別的靜態成員
- 行為類似頂層類別,更具靈活性
- 直接建立:
- 內部類別:
介面內部宣告的類別或介面預設是靜態的,即使沒有明確使用 static 關鍵字。這是因為介面不能實例化,所以其內部類別不需要綁定到介面實例。例如:
1
2
3
4
5
6interface MyInterface {
class Nested { // 隱含 static
// 類別內容
}
}
// 使用方式:MyInterface.Nested nested = new MyInterface.Nested();JDBC 連線的 auto-commit 模式預設啟用。關閉方式:
1
2Connection conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false); // 關閉 auto-commit事務管理:關閉後需手動調用
conn.commit()
提交事務或conn.rollback()
回滾。短路邏輯運算子 (
&&
和||
) 在確定結果後停止評估後續表達式。
示例:1
2
3if (obj != null && obj.isValid()) {
// 若 obj 為 null 則跳過 obj.isValid() 檢查
}非短路運算子
&
和|
會評估所有表達式,可能導致 NullPointerException。finally 區塊不會執行的情況:
- 調用
System.exit()
終止 JVM - 守護線程在所有非守護線程結束時(不保證 finally 執行)
- JVM 崩潰或硬體故障
重要:finally 在 return 後仍會執行!
- 調用
功能性介面是只有一個抽象方法的介面,可搭配 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");模組系統兩種形式:
形式 優點 缺點 適用場景 模組化 JAR/JMOD 易於分發部署 更新需重新打包 正式發布 展開模組目錄 快速修改測試 不易分發 開發階段 變數記憶體位置:
- 區域變數:stack 記憶體,方法結束即釋放
- 實例變數:heap 記憶體,隨物件生命週期
- 靜態變數:方法區(元空間),類別載入時初始化
多執行緒注意:靜態變數需同步控制(synchronized 或 volatile)
申論題
請根據提供的資料,選擇其中五題,以申論形式闡述您的理解。
PreparedStatement vs CallableStatement:
- 功能差異:
- PreparedStatement:執行參數化SQL查詢,防範SQL注入
- CallableStatement:執行預存程序(stored procedures)和函數
- 參數處理:
- PreparedStatement:僅支援IN參數
- CallableStatement:支援IN, OUT, INOUT三種參數
- OUT參數需使用
registerOutParameter()
註冊
- 應用場景:
- 優先使用CallableStatement時機:當資料庫已有複雜業務邏輯的預存程序時
- 範例:銀行轉帳事務處理
- 效能考量:預存程序通常比動態SQL更高效
- 功能差異:
內部類別 vs 靜態嵌套類別:
- 設計哲學:
- 內部類別:與外部類別實例緊密耦合
- 靜態嵌套類別:獨立於外部類別實例
- 實例化差異:
1
2
3
4
5
6// 內部類別實例化
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
// 靜態嵌套類別實例化
Outer.StaticNested staticNested = new Outer.StaticNested(); - 記憶體管理:內部類別持有外部類別引用,可能導致記憶體洩漏
- 介面嵌套類別:預設靜態,因介面無法實例化
- 設計哲學:
Java模組系統形式比較:
特性 模組化JAR/JMOD 展開模組目錄 結構 壓縮檔案格式 檔案系統目錄結構 部署 適合生產環境 適合開發環境 更新 需重新打包 直接修改檔案 效能 啟動較快 啟動較慢 應用策略:開發階段用展開目錄,發布時打包為JAR 功能性介面與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%以上
- 可讀性增強
- 減少樣板代碼
變數類型與執行緒安全:
- 區域變數:
- 生命週期:方法執行期間
- 執行緒安全:每個線程有自己的stack,天然安全
- 實例變數:
- 生命週期:物件存在期間
- 執行緒安全:需同步控制
- 靜態變數:
- 生命週期:類別載入期間
- 執行緒安全:高風險,需用
synchronized
或volatile
- 最佳實踐:盡量使用區域變數,減少共享狀態
- 區域變數:
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/