news 2026/6/20 1:33:51

Kotlin类定义与使用全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kotlin类定义与使用全指南

在 Kotlin 里,class是定义“类型”的关键字,相当于“模板/蓝图”,通过它可以创建对象(实例)。下面按常用程度,从浅到深讲一遍。


1. 最基础的类定义

classSmartDevice{funturnOn(){println("Device is on")}}

使用:

valdevice=SmartDevice()// 创建实例device.turnOn()// 调用成员函数
  • class SmartDevice:定义了一个名为SmartDevice的类。
  • SmartDevice():调用构造函数创建对象。

2. 构造函数(Constructor)

2.1 主构造函数(primary constructor)

classSmartDevice(valname:String,varisOn:Boolean)

等价于:

classSmartDevice(valname:String,// 只读属性varisOn:Boolean// 可变属性){// 这里可以继续写函数、额外属性}

使用:

valdevice=SmartDevice("TV",false)println(device.name)// TVdevice.isOn=true

要点:

  • class名后面的括号里的是“主构造函数”的参数。
  • 前面加上val/var,就会自动生成属性,不需要再在类体内声明。

2.2 有初始化逻辑的构造函数

classSmartDevice(valname:String){varisOn:Booleaninit{// init 代码块在构造时执行println("Initializing device:$name")isOn=false}}

init代码块在对象创建时按顺序执行,可做检查、日志等。

2.3 次构造函数(secondary constructor)

现在使用较少,只在需要多个不同构建方式时使用:

classSmartDevice(valname:String,varisOn:Boolean){constructor(name:String):this(name,false){// 额外初始化逻辑}}

3. 属性(properties)

classSmartDevice(valname:String,// 只读属性:外部只能读varisOn:Boolean// 可读可写属性){varvolume:Int=0// 普通属性}
  • val:只读(类似 Java 的final字段引用)。
  • var:可变。

可以自定义 getter / setter:

varvolume:Int=0set(value){field=value.coerceIn(0,100)// 限制在 0..100}

field是该属性的“幕后字段”。


4. 成员函数(methods)

classSmartDevice(valname:String){varisOn:Boolean=falsefunturnOn(){isOn=trueprintln("$nameis ON")}funturnOff(){isOn=falseprintln("$nameis OFF")}}
  • 类内部可以使用其他成员(isOnturnOff()等)。
  • 在类内部调用本类方法时可以省略this.

5. 继承(inheritance)

默认类是final(不能被继承)。要允许被继承,需要open

openclassSmartDevice(valname:String){openfunturnOn(){println("$nameis ON")}}

子类使用:继承,并在构造时调用父类构造函数:

classSmartTvDevice(name:String,valchannel:Int):SmartDevice(name){overridefunturnOn(){println("Turning on TV at channel$channel")super.turnOn()}}

使用:

valtv=SmartTvDevice("Living Room TV",5)tv.turnOn()

6. 抽象类和接口

6.1 抽象类abstract

abstractclassSmartDevice(valname:String){abstractfunturnOn()abstractfunturnOff()}
  • 不能直接实例化。
  • 子类必须实现抽象函数:
classSmartTvDevice(name:String):SmartDevice(name){overridefunturnOn(){...}overridefunturnOff(){...}}

6.2 接口interface

interfaceSwitchable{funturnOn()funturnOff()}classSmartLamp:Switchable{overridefunturnOn(){...}overridefunturnOff(){...}}

一个类可以实现多个接口。


7. 数据类data class

用于保存数据的“值类型”:

dataclassUser(valid:Int,valname:String)

自动生成:

  • toString()
  • equals()/hashCode()
  • copy()
  • componentN()(支持解构)

使用:

valuser1=User(1,"Tom")valuser2=user1.copy(name="Jerry")println(user1)// User(id=1, name=Tom)println(user2==user1)// false(内容不同)

8. 单例object

objectDeviceManager{valdevices=mutableListOf<SmartDevice>()funadd(device:SmartDevice){devices.add(device)}}
  • object定义的是单例:全局只有一个实例,直接通过DeviceManager.add(...)使用。

9. 内部类和嵌套类

classOuter{privatevala=1classNested{funfoo()=2// 不访问 Outer.a}innerclassInner{funfoo()=a// 可以访问外部类实例的成员}}
  • class Nested:静态嵌套类,不持有外部类实例。
  • inner class:内部类,持有外部类实例引用,可以访问外部成员。

10. 可见性修饰符(访问控制)

  • public(默认):任何地方都能访问。
  • internal:同一模块内可访问。
  • protected:类及其子类中可访问。
  • private:当前文件或当前类内部可访问。

示例:

classSmartDevice{privatevarsecretId:String="xxx"// 外部看不到protectedfunlog(){...}// 只有子类看得到}

总结记忆

如果你刚入门 Kotlin,先记住几条常用规则:

  1. 普通类class Foo { ... },用Foo()创建实例。

  2. 构造 + 属性最常用写法

    classFoo(vala:Int,varb:String)
  3. 继承要加open/abstract,重写要加override

  4. 只存数据就用data class

  5. 需要全局唯一就用object

  6. 类内部函数互相调用,可以直接写turnOff(),等价this.turnOff()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 16:59:42

14.C++入门:vector|手撕vector

vector深度剖析及模拟实现 vector.h #pragma once #include<assert.h>namespace bit {template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;vector(){}/*vector(const vector<T>& v){_start new T[v.capacity(…

作者头像 李华
网站建设 2026/6/5 3:54:07

技术文章大纲:Bug悬案侦破大会

c技术文章大纲&#xff1a;Bug悬案侦破大会背景与活动目的通过模拟真实开发中的复杂Bug场景&#xff0c;提升团队协作与问题排查能力结合案例分析&#xff0c;分享常见Bug类型及其背后的技术原理培养开发者系统性思维和逆向工程能力活动形式设计悬案设定&#xff1a;选取历史上…

作者头像 李华
网站建设 2026/6/18 16:32:10

MATLAB高效算法实战技术文章大纲1

MATLAB高效算法实战技术文章大纲核心优化策略向量化运算&#xff1a;避免循环&#xff0c;利用矩阵运算提升速度&#xff0c;例如 sum(A, 2)替代逐行求和循环。预分配内存&#xff1a;通过 zeros() 或 prealloc() 提前分配数组空间&#xff0c;减少动态扩容开销。内置函数优先&…

作者头像 李华
网站建设 2026/6/15 17:42:38

大规模语言模型在复杂系统非线性动态预测中的创新应用

大规模语言模型在复杂系统非线性动态预测中的创新应用关键词&#xff1a;大规模语言模型、复杂系统、非线性动态预测、创新应用、人工智能摘要&#xff1a;本文深入探讨了大规模语言模型在复杂系统非线性动态预测中的创新应用。首先介绍了研究的背景、目的、预期读者等内容&…

作者头像 李华