抽象類 (Abstract Class)
- 定義和特點
抽象類使用 abstract 關鍵字聲明,是一種不能被直接實例化的特殊類,主要用于被其他類繼承。
abstract class Base {open fun f() {}
}abstract class Derived : Base() {override abstract fun f() // 抽象成員在類中不存在具體實現
}
- 主要特征:
- 不能直接實例化:抽象類只能被繼承,不能創建實例
- 可以包含抽象成員:抽象成員使用 abstract 關鍵字標記,沒有具體實現
- 無需open注解:抽象類或抽象成員不需要標注 open 注解,默認就可以被繼承
- 可以包含具體實現:抽象類可以有具體的方法實現和屬
- 示例:
abstract class TestB {abstract fun bar() // 抽象方法,子類必須實現
}
開放類 (Open Class)
-
定義和特點
開放類使用 open 關鍵字聲明,是 Kotlin 中可以被繼承的類。在 Kotlin 中,所有類默認是 final 的(不能被繼承),需要顯式使用 open 關鍵字才能被繼承。 -
主要特征:
- 可以被實例化:開放類可以創建實例
- 可以被繼承:使用 open 關鍵字標記的類可以被其他類繼承
- 方法默認是final:類中的方法默認不能被重寫,需要使用 open 關鍵字標記才能被重寫
- 支持方法重寫:使用 open 關鍵字標記的方法可以在子類中被重寫
-
示例
open class TestC{open fun bar(){ // 使用open標記,可以在子類中重寫// 默認實現}fun a(){ // 普通方法,不能被重寫// 實現}
}
兩者區別對比
特性 | 抽象類 (Abstract Class | 開放類 (Open Class) |
---|---|---|
實例化 | ? 不能直接實例化 | ? 可以實例化 |
繼承 | ? 可以被繼承 | ? 可以被繼承 |
抽象方法 | ? 可以包含抽象方法 | ? 不能包含抽象方法 |
具體實現 | ? 可以包含具體實現 | ? 可以包含具體實現 |
主要用途 | 定義模板和契約 | 提供可擴展的基礎實現 |
在繼承中的應用
abstract class Base {open fun f() {}
}abstract class Derived : Base() {override abstract fun f() // 在抽象類中重新聲明為抽象方法
}
open class Person(var name : String, var age : Int) // 基類class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age)
實際應用建議
- 使用抽象類:當你需要定義一個基礎模板,強制子類實現某些方法時
- 使用開放類:當你提供一個基礎實現,同時允許子類根據需要擴展或修改行為時