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

Kotlin中类与构造器的区别及语法写法疑问

Kotlin类与构造器:核心区别与语法解析

1. 类和构造器的本质区别

  • 类:是定义对象模板的核心单元,包含属性、方法等所有成员,是一个完整的“类型”定义。
  • 主构造器:是类创建实例的入口逻辑,属于类声明的一部分,但只是负责初始化实例属性的组件,不等同于类本身。

2. 两种语法写法的底层逻辑

你看到的两段代码本质都是带主构造器的类声明,区别只在于是否需要给主构造器单独加访问修饰符:

  • 第一段代码open class SmartDevice protected constructor (val name: String, val category: String) {...}
    这里的protected是主构造器的访问修饰符,限制只有子类或同包类能调用这个构造器创建实例。因为要给构造器单独加修饰符,必须显式写出constructor关键字,明确修饰符的作用对象是构造器,所以被称作“构造器写法”。
  • 第二段代码internal open class SmartDevice(val name: String, val category: String) {...}
    这里的internal是类的访问修饰符,控制整个类的可见性。主构造器没有单独的修饰符,默认和类的可见性一致,所以可以省略constructor关键字,看起来像是“类写法”,但本质还是带主构造器的类声明。

3. 修正你的认知:主构造器≠类声明

你之前认为“主构造器等同于类声明”是错误的。类声明包含类修饰符、类名、主构造器(可选)、类体等多个部分,主构造器只是其中的一个组成部分。比如一个类可以完全没有主构造器,只靠次级构造器初始化:

class SmartDevice {
    val name: String
    val category: String

    // 只有次级构造器,没有主构造器
    constructor(name: String, category: String) {
        this.name = name
        this.category = category
    }
}

4. 次级构造器的用途

次级构造器是类的额外初始化入口,写在类体内部,主要用来:

  • 提供多种实例创建方式,比如给参数加默认值、接收不同类型的参数
  • 当继承的父类没有无参主构造器时,必须在次级构造器里显式调用父类的构造器

举个例子:

open class SmartDevice protected constructor(val name: String, val category: String) {
    // 次级构造器:只传name,category默认设为"unknown"
    constructor(name: String) : this(name, "unknown")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:33:31