本文譯自 JournalDev Core Java Interview Q&A,精選 33 道高頻面試題,覆蓋 JVM 架構、基礎語法、集合、並發、Java 8 新特性等核心知識點,附帶深度解析與避坑指南。
答:四大支柱 ——
default/static 打破接口不能有實現的限制,支持向後兼容擴展。@FunctionalInterface,行為參數化,代碼更簡潔。Collection.stream(),聲明式數據處理,支持並行流。java.time.*,線程安全、不可變、領域驅動設計。加分點:提及 Optional、CompletableFuture、Nashorn JS 引擎、Base64 內置支持、StringJoiner。
答:一次編寫,到處運行。Java 源碼編譯為字節碼,由特定平台的 JVM 解釋/編譯執行。同樣的 .class 文件可在 Windows/Linux/macOS 上無修改運行。
答:JVM 是 Java 虛擬機,負責將字節碼轉為機器碼執行。JVM 本身平台相關(不同 OS 有不同實現),但它屏蔽了底層差異,提供統一運行接口。可通過 -Xms/-Xmx 調優內存。
| 組件 | 包含 | 用途 |
|---|---|---|
| JDK | JRE + 編譯/調試工具 | 開發 |
| JRE | JVM + 核心類庫 | 運行 |
| JVM | 解釋器、JIT、GC、類加載器等 | 執行字節碼 |
答:java.lang.Object,隱式繼承,提供 equals/hashCode/toString/clone/finalize/wait/notify 等通用方法。
答:菱形繼承問題。若 A、B 繼承 C 並覆寫同一方法,D 繼承 A、B 時編譯器無法決定調用哪個。接口支持多繼承,因接口只有聲明無實現(Java 8 前),無衝突;Java 8 默認方法引入衝突時需顯式 super 調用或重寫。
答:存在8 種基本類型(int/long/double...),非對象。雖有包裝類,但基本類型為性能保留(無對象頭、無 GC 壓力、棧上分配)。
path:OS 環境變量,定位可執行程序(java.exe、javac.exe)。
classpath:JVM 參數,定位類文件(.class、.jar、目錄),運行時使用。
public static void main(String[] args)
public:JVM 外部調用入口static:無需實例化類即可調用void:無返回值String[] args:命令行參數數組| 重載 | 覆蓋 | |
|---|---|---|
| 關係 | 同一類/父子類 | 父子類 |
| 方法名 | 相同 | 相同 |
| 參數列表 | 不同 | 相同 |
| 返回類型 | 可不同 | 兼容/相同 |
| 異常 | 無限制 | 子類異常 ≤ 父類 |
| 註解 | 無 | @Override |
答:可。類可有多個 main 方法,但 JVM 只識別標準簽名作為入口。
答:不可。一個 .java 文件僅允許一個 public class,文件名必須與之同名。可有多個 package-private 類。
包:組織類、避免命名衝突、訪問控制。
默認導入:java.lang.*,無需 import 直接用 String、Object、System 等。
| 修飾符 | 同類 | 同包 | 子類 | 異包 |
|---|---|---|---|---|
| private | ✓ | ✗ | ✗ | ✗ |
| default | ✓ | ✓ | ✗ | ✗ |
| protected | ✓ | ✓ | ✓ | ✗ |
| public | ✓ | ✓ | ✓ | ✓ |
類只能 public 或 default。
String、Integer)。public static final。this/super。static { },類加載時執行一次,用於靜態初始化。try-catch-finally 塊,異常/返回/正常流程均執行,用於資源釋放。Object 方法,GC 回收前調用,不可靠、已棄用,勿用於關鍵資源釋放。頂層類不可。內部類可 static(靜態內部類),不持有外部類引用,行為同頂層類。
import static java.lang.Math.PI; // 直接用 PI,無需 Math.PI
慎用:濫用降低可讀性,難知來源。
try (Resource res = new Resource()) {
res.use();
} // 自動調用 res.close(),實現 AutoCloseable
解決資源洩漏,代碼更簡潔。
catch (IOException | SQLException | Exception ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}
異常參數隱式 final,不可修改。
| 接口 | 抽象類 | |
|---|---|---|
| 關鍵字 | interface | abstract class |
| 方法實現 | Java 8 前無,8+ 有 default/static | 可有抽象/具體方法 |
| 繼承 | 多實現 | 單繼承 |
| 構造器 | 無 | 有 |
| main 方法 | 不可運行 | 可運行 |
| 變量 | 隱式 static final | 任意 |
可,interface A extends B, C。無實現故無菱形問題。
無方法接口,標識能力:Serializable、Cloneable、Remote。
8 基本類型對應:Integer、Long 等。不可變、final。Java 5 自動拆裝箱。
enum Direction { EAST, WEST, NORTH, SOUTH }。常量隱式 static final,可帶字段/方法/實現接口,switch 支持。
元數據,@interface 定義。內置:@Override、@Deprecated、@SuppressWarnings。可指定保留策略(SOURCE/CLASS/RUNTIME)。
運行時檢查/修改類行為:Class.forName、getMethods、newInstance。破壞封裝、性能差、破壞單例,框架專用,業務代碼慎用。
has-a 關系,對象引用實現復用。優於繼承:封裝性好、耦合低、運行時可換實現。