首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 基礎核心知識點大全(二):EJB vs JavaBean、內部類、JSP Include、Assert、GC、經典陷阱題

     編輯:Java 相關知識

續接上篇,本文聚焦進階基礎知識:組件模型差異、內部類機制、JSP 編譯期與執行期 Include、斷言最佳實踐、垃圾回收原理,並精選 20 道高頻陷阱題深度解析。

1. EJB vs JavaBean

2. Static Nested Class vs Inner Class

  • 靜態巢狀類別:static class Inner,無外部類別實例也能實例化,無法存取外部非靜態成員。
  • 內部類別:非靜態,必須依附外部類別實例(Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();),可存取外部所有成員(含 private)。

3. JSP 動態 Include vs 靜態 Include

維度JavaBeanEJB (Enterprise JavaBean)
定位可復用組件,本地進程內分散式組件,跨進程/跨機器
規範無嚴格規範(慣例:無參建構子、Serializable)嚴格規範(EJB 3.0+ 簡化為 POJO + 註解)
部署無需容器,Tomcat 等 Servlet 容器即可需 EJB 容器
存取方式直接 new 或反射實例化透過容器代理(JNDI 查找/依賴注入)
類比COM 進程內組件DCOM 分散式組件
靜態 include 將內容直接合併到主頁面 Servlet 代碼中,動態 include 則是執行期請求轉發/包含。

4. Assert 斷言最佳實踐

  • 用途:開發/測試階段驗證「必須為真」的前置/後置條件、不變量。
  • 啟用:java -ea 或 java -enableassertions。
  • 生產環境:關閉斷言(-da)以提升效能。
  • 慎用:不要用於參數驗證、業務邏輯控制流,因生產環境可能關閉導致邏輯失效。

5. GC (Garbage Collection) 核心機制

  • 目的:自動回收無引用物件記憶體,防止記憶體洩漏與 OutOfMemoryError。
  • 可達性分析:從 GC Roots(棧區引用、靜態欄位、常量、JNI 引用等)出發,不可達物件判定為垃圾。
  • 演算法:標記-清除、標記-整理、複製、分代收集(新生代/老年代)。
  • Java 無顯式釋放記憶體 API,System.gc() 僅建議,不保證執行。

6. 20 道經典陷阱題深度解析

Q6: short s1 = 1; s1 = s1 + 1; vs s1 += 1;


short s1 = 1; s1 = s1 + 1; // 編譯錯誤:s1+1 提升為 int,需強制轉型 (short)(s1+1)
short s1 = 1; s1 += 1;     // 正確:+= 內含隱式強制轉型

Q7: Math.round(11.5) / Math.round(-11.5)

Math.round(11.5)  == 12   // floor(x + 0.5)
Math.round(-11.5) == -11  // floor(-11.5 + 0.5) = floor(-11.0) = -11

Q8: String s = new String("xyz"); 創建幾個物件?

兩個:字串常量池中 "xyz" + 堆上 new String 物件。

Q9: 四執行緒對 j 遞增/遞減(含同步)


public class ThreadTest {
    private int j = 0;
    public static void main(String[] args) {
        ThreadTest tt = new ThreadTest();
        Runnable inc = tt::inc, dec = tt::dec;
        for (int i = 0; i < 2; i++) {
            new Thread(inc).start();
            new Thread(dec).start();
        }
    }
    private synchronized void inc() { j++; System.out.println(Thread.currentThread().getName() + "-inc:" + j); }
    private synchronized void dec() { j--; System.out.println(Thread.currentThread().getName() + "-dec:" + j); }
}

Q10: Java 有 goto 嗎?

goto 是保留字,未使用。可用 break/continue 標籤 實現類似跳轉。

Q11: 啟動執行緒用 run() 還是 start()?

start():建立新執行緒並排程執行 run()。直接呼叫 run() 只是普通方法調用,仍在主執行緒執行。

Q12: SessionBean/EntityBean 生命週期與事務

  • Stateless Session Bean:池化管理,容器決定生命週期,方法級事務。
  • Stateful Session Bean:與客戶端會話綁定,激活/鈍化,會話級事務。
  • Entity Bean:資料同資料庫壽命同在,容器管理 (CMP) 或 Bean 管理 (BMP) 持久化。
  • 事務技術:JTA (Java Transaction API)、JTS、OTS、XA。

Q13: 主流應用伺服器

WebLogic, WebSphere, JBoss/WildFly, Tomcat (Servlet 容器), GlassFish/Payara, Jetty。

Q14: 常見 RuntimeException

NullPointerException, IndexOutOfBoundsException, ClassCastException,
IllegalArgumentException, IllegalStateException, ArithmeticException,
ConcurrentModificationException, UnsupportedOperationException...

Q15: 介面/抽象類別繼承規則

  • 介面可繼承多介面 (extends)。
  • 抽象類別可實現介面 (implements)。
  • 抽象類別可繼承具體類別(前提:父類別有可見建構子)。

Q16: List/Set/Map 與 Collection 關係

List、Set 繼承 Collection;Map 不繼承 Collection(但提供 keySet()、values()、entrySet() 返回 Collection 視圖)。

Q17: 資料庫連線池機制

  1. 啟動建立初始連線數。
  2. 借用:取空閒連線標記忙碌;不足則按配置增量建立。
  3. 歸還:標記空閒,不關閉實體連線。
  4. 維護:定期檢測空閒連線有效性、回收超時連線。

Q18: abstract method 能否同時是 static/native/synchronized?

全不能:abstract 要求子類實現,static 屬於類、native 是原生實現、synchronized 需方法體,均與 abstract 衝突。

Q19: 陣列 length vs String length()

陣列:length 屬性。String:length() 方法。

Q20: Set 判重用 == 還是 equals()?

用 equals() 判斷邏輯相等。== 比較參考位址。HashSet 先比 hashCode() 再比 equals()。

Q21: 建構子能否 override?

不能:建構子不屬於繼承成員。可多載,不可覆寫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型語法處理時機適用場景參數傳遞
動態<jsp:include page="..." flush="true"/>請求處理階段(執行期)動態頁面、需傳參支援 <jsp:param>
靜態<%@ include file="..." %>JSP 編譯階段(轉譯期)靜態片段、頁首頁尾不支援