You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中“存储状态”的含义是什么?结合接口与抽象类解析

Kotlin接口“无法存储状态”到底指什么?

所谓“存储状态”,本质是指拥有能在实例中保存具体值的幕后字段(backing field)——这些字段的值是对象实例的状态载体,会随着对象的操作发生变化。

1. 抽象类可以存储状态

Kotlin的抽象类允许定义带幕后字段的属性,这些属性会在每个子类实例中占据内存空间,用来存储实例的状态数据:

abstract class Person {
    // 带幕后字段的属性,存储实例状态
    var name: String = ""
    abstract fun introduce()
}

class Student : Person() {
    override fun introduce() {
        println("我是学生,叫$name")
    }
}

fun main() {
    val stu = Student()
    stu.name = "张三" // 修改状态
    stu.introduce() // 输出"我是学生,叫张三"
}

这里name属性有幕后字段,每个Student实例都有自己的name值,这就是存储状态。

2. Kotlin接口不能存储状态

Kotlin接口里的属性只能是两种情况,都无法存储实例状态:

  • 抽象属性:必须由实现类提供具体实现(包括幕后字段),接口本身不持有状态
  • 带访问器实现的属性:只能通过计算返回值,不能有幕后字段

示例:

interface Identifiable {
    // 抽象属性,接口不存储值,由实现类负责
    val id: String

    // 带访问器的属性,无幕后字段,值是计算出来的
    val type: String
        get() = "通用标识"
}

class User : Identifiable {
    // 实现抽象属性,这里的id有幕后字段,属于User实例的状态
    override val id: String = "user_123"
}

fun main() {
    val user = User()
    println(user.id) // 输出"user_123"
    println(user.type) // 输出"通用标识"
    // 无法修改type,因为它没有幕后字段,只是计算值
}

接口Identifiable里的id是抽象的,本身不存值;type的访问器只是返回固定字符串,没有幕后字段,所以接口本身没有存储任何实例状态。

结合Java的等效概念

如果你熟悉Java,这个逻辑很好对应:

  • Java的抽象类可以定义实例字段(比如private String name;),这些字段就是存储状态的载体,每个实例都有自己的副本。
  • Java的接口在JDK8之前只能有public static final常量(属于类级别,不是实例状态);JDK8+支持默认方法,但依然不能定义实例字段——所有接口成员本质都是类级别的,无法持有实例独有的状态,这和Kotlin接口“无法存储状态”完全一致。

简单总结:状态是实例独有的、可变(或可持有)的数据,接口作为行为契约,只定义行为(或计算式属性),不持有这类数据;而抽象类作为类的半实现,可以同时包含状态和行为。

内容的提问来源于stack exchange,提问作者stardep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:40:26