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

11 月 Java 面試題精選(一):super()、volatile、互斥鎖、I/O 流分類、繼承關係

     編輯:Java 相關知識

一、super() 用法與作用

public class Bird {
    private String name;
    public Bird() {}
    public Bird(String name){ this.name = name; }
    // getter/setter...
}

public class Chicken extends Bird {
    private String crest;
    public Chicken(){ super(); }
    public Chicken(String name, String crest) {
        super(name);   // 呼叫父類有參建構子
        this.name = name; // 注意:這行重複,super(name) 已設定 name
    }
}

關鍵規則:

  1. 子類建構過程必須呼叫父類建構子(顯式或隱式)。
  2. super() 必須寫在子類建構子第一行。
  3. 若無顯式呼叫,隱式呼叫父類無參建構子;若父類無無參建構子,編譯報錯。
  4. super(name) 對應父類 Bird(String name);super() 對應 Bird()。

二、volatile vs synchronized

volatile:輕量級同步

  • 確保可見性:讀寫直接作用於主記憶體,不使用執行緒本地快取。
  • 適用於單次讀寫的基本類型/引用(long/double 除外,JVM 1.2+ 已保證原子性)。
  • 不保證原子性:n++、n = n + 1 非原子,需配合 synchronized 或 AtomicInteger。
  • 效能優於 synchronized,但功能較弱。

synchronized:重量級同步

  • 提供互斥 + 可見性 + 有序性(禁止指令重排)。
  • 鎖住物件/類,進入同步區塊時刷新本地快取至主記憶體,退出時寫回。
  • 支援 wait/notify 協作機制。

選擇建議

場景推薦
單一變數狀態標記、單次賦值volatile
複合操作(檢查-執行)、多變數不變式synchronized / Lock
已在同步區塊內、或常量無需 volatile

三、互斥鎖與死鎖

鎖池與等待池

  • 鎖池:嘗試取得 synchronized 鎖失敗的執行緒在此等待。
  • 等待池:呼叫 wait() 釋放鎖並進入等待;notify() 隨機喚醒一個到鎖池,notifyAll() 喚醒全部。

死鎖預防:統一鎖順序

// 物件 1 的方法
synchronized(a) { synchronized(b) { ... } }

// 物件 2 的方法 —— 必須相同順序
synchronized(a) { synchronized(b) { ... } }

生產者-消費者模範

使用 wait()/notifyAll() 協調緩衝區滿/空狀態,注意必須在 synchronized 區塊內呼叫。

四、Java I/O 流分類總覽

按資料類型

  • 位元組流:InputStream/OutputStream 為抽象父類;實作類含 FileInputStream、BufferedInputStream、DataInputStream、PipedInputStream 等。
  • 字元流:Reader/Writer 為抽象父類;實作類含 FileReader、BufferedReader、StringReader、InputStreamReader(橋接器)等。

按流向

  • 輸入流:InputStream、Reader
  • 輸出流:OutputStream、Writer

按功能

  • 節點流:直接操作目標(檔案、記憶體、網路)。
  • 過濾流/包裝流:包裝節點流或其它過濾流,增加功能(緩衝、轉換、格式化),體現裝飾器模式。

五、父類與子類關係要點

  • 父類 非 private 成員(含 default,跨套件不可見)預設被繼承。
  • 父類 建構子不被繼承,無覆蓋概念;子類建構子預設隱式呼叫 super()(養成寫無參建構子習慣)。
  • 需呼叫父類有參建構子:子類建構子第一行顯式 super(參數)。
  • 物件建立順序:先父後子(遞歸向上至 Object)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved