首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 抽象類繼承:為什麼抽象類的子類可以實例化?

     編輯:程式設計綜合問答

代碼示例

abstract class Person {}
class Student extends Person {}

Person p = new Student(); // 編譯通過,運行正常
Student s = new Student(); // 同樣可實例化

核心規則

  • 抽象類不能直接實例化:new Person() 編譯報錯
  • 抽象類的非抽象子類可以實例化:前提是子類實現了所有繼承的抽象方法
  • 多態引用:父類類型引用指向子類對象 Person p = new Student()

為什鍵 Student 可以實例化?

  1. Person 無抽象方法 → Student 繼承後無需實現任何方法 即為具體類
  2. 即使 Person 有抽象方法,Student 只要全部重寫(或聲明為抽象類),即可實例化
  3. 關鍵在於:實例化的是子類對象,而非抽象類本身
  4. 內存模型圖解

    Person p = new Student();
    
    棧內存:p (Person 類型引用)
              |
              v
    堆內存:Student 對象 (包含 Person 部分 + Student 部分)
              - Person 字段
              - Student 字段
              - 方法表指針 -> Student 方法表
    

    常見誤區

    誤區正確理解
    「子類也是抽象類」只有子類用 abstract 修飾,或未實現所有抽象方法時才是抽象類
    「沒重寫方法就不能實例化」父類無抽象方法時,子類無需重寫即可實例化
    「Person p = new Student() 是實例化 Person」實例化的是 Student,賦值給 Person 類型引用(向上轉型)

    設計模式應用:模板方法模式

    abstract class DataProcessor {
        public final void process() { // 模板方法
            readData();
            abstractProcess(); // 抽象步驟
            writeData();
        }
        private void readData() { ... }
        private void writeData() { ... }
        protected abstract void abstractProcess(); // 子類實現
    }
    
    class CsvProcessor extends DataProcessor {
        protected void abstractProcess() { /* CSV 處理邏輯 */ }
    }
    

    抽象類定義算法骨架,子類填充具體步驟,實例化的是具體子類。

    總結

    抽象類是不完整的類定義,不能直接創建對象。其非抽象子類補全了所有抽象方法,成為完整類定義,故可正常實例化。多態引用 Parent p = new Child() 是面向對象設計的核心機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved