Kotlin中抽象类和开放类

抽象类 (Abstract Class)

  • 定义和特点
    抽象类使用 abstract 关键字声明,是一种不能被直接实例化的特殊类,主要用于被其他类继承。
kotlin 复制代码
abstract class Base {
    open fun f() {}
}

abstract class Derived : Base() {
    override abstract fun f()  // 抽象成员在类中不存在具体实现
}
  • 主要特征:
  1. 不能直接实例化:抽象类只能被继承,不能创建实例
  2. 可以包含抽象成员:抽象成员使用 abstract 关键字标记,没有具体实现
  3. 无需open注解:抽象类或抽象成员不需要标注 open 注解,默认就可以被继承
  4. 可以包含具体实现:抽象类可以有具体的方法实现和属
  • 示例:
kotlin 复制代码
abstract class TestB {
   abstract fun bar()  // 抽象方法,子类必须实现
}

开放类 (Open Class)

  • 定义和特点

    开放类使用 open 关键字声明,是 Kotlin 中可以被继承的类。在 Kotlin 中,所有类默认是 final 的(不能被继承),需要显式使用 open 关键字才能被继承。

  • 主要特征:

    1. 可以被实例化:开放类可以创建实例
    2. 可以被继承:使用 open 关键字标记的类可以被其他类继承
    3. 方法默认是final:类中的方法默认不能被重写,需要使用 open 关键字标记才能被重写
    4. 支持方法重写:使用 open 关键字标记的方法可以在子类中被重写
  • 示例

kotlin 复制代码
open class TestC{
    open fun bar(){  // 使用open标记,可以在子类中重写
        // 默认实现
    }
    
    fun a(){  // 普通方法,不能被重写
        // 实现
    }
}

两者区别对比

特性 抽象类 (Abstract Class 开放类 (Open Class)
实例化 ❌ 不能直接实例化 ✅ 可以实例化
继承 ✅ 可以被继承 ✅ 可以被继承
抽象方法 ✅ 可以包含抽象方法 ❌ 不能包含抽象方法
具体实现 ✅ 可以包含具体实现 ✅ 可以包含具体实现
主要用途 定义模板和契约 提供可扩展的基础实现

在继承中的应用

kotlin 复制代码
abstract class Base {
    open fun f() {}
}

abstract class Derived : Base() {
    override abstract fun f()  // 在抽象类中重新声明为抽象方法
}
kotlin 复制代码
open class Person(var name : String, var age : Int)  // 基类

class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age)

实际应用建议

  1. 使用抽象类:当你需要定义一个基础模板,强制子类实现某些方法时
  2. 使用开放类:当你提供一个基础实现,同时允许子类根据需要扩展或修改行为时
相关推荐
Kapaseker3 小时前
如果你的 View 不支持 Compose 怎么办
android·kotlin
前行的小黑炭4 小时前
Android:在项目当中可能会遇到的ANR,应该如何解决?
android·java·kotlin
FunnySaltyFish12 小时前
Kotlin 2.2.20 上新:新contract、跨平台编译稳定、默认Swift导出……
kotlin
alexhilton12 小时前
runBlocking实践:哪里该使用,哪里不该用
android·kotlin·android jetpack
萧雾宇18 小时前
Android Compose打造仿现实逼真的烟花特效
android·flutter·kotlin
叽哥1 天前
Kotlin学习第 4 课:Kotlin 函数:从基础定义到高阶应用
android·java·kotlin
前行的小黑炭1 天前
Android :如何快速让布局适配手机和平板?
android·java·kotlin
Yang-Never1 天前
Kotlin协程 -> Job.join() 完整流程图与核心源码分析
android·开发语言·kotlin·android studio
XeonYu1 天前
Kotlin 协程之 突破 Flow 限制:Channel 与 Flow 的结合之道
kotlin·coroutine·channelflow·callbackflow·receiveasflow·consumeasflow