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. 使用开放类:当你提供一个基础实现,同时允许子类根据需要扩展或修改行为时
相关推荐
野生技术架构师31 分钟前
Java 21虚拟线程 vs Kotlin协程:高并发编程模型的终极对决与选型思考
java·开发语言·kotlin
言之。36 分钟前
Kotlin快速入门
android·开发语言·kotlin
常利兵2 小时前
Android Gradle 构建脚本现代化:Kotlin DSL (.kts) 与 Groovy DSL 深度对比与实战指南
android·开发语言·kotlin
baidu_247438613 小时前
Android kotlin 定时n秒完成时回调,含暂停和继续
android·kotlin
stevenzqzq3 小时前
kotlin和compose中使用by
kotlin·compose
符哥20083 小时前
Android 开发中如何使用Coroutines
android·kotlin
sinat_267611911 天前
跟着官网学习协程随笔
学习·kotlin
缺一句感谢和缺一句道歉1 天前
Module was compiled with an incompatible version of Kotlin.
java·kotlin
灯火不休ᝰ1 天前
[安卓] Kotlin中的架构演进:从MVC到MVVM
android·架构·kotlin
灯火不休ᝰ2 天前
[kotlin] 从Java到Kotlin:掌握基础语法差异的跃迁指南
java·kotlin·安卓