Kotlin中抽象类和开放类
抽象类 (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)
实际应用建议
- 使用抽象类:当你需要定义一个基础模板,强制子类实现某些方法时
- 使用开放类:当你提供一个基础实现,同时允许子类根据需要扩展或修改行为时