news 2026/5/8 1:59:43

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/4/18 8:34:05

基于SpringBoot的社区生鲜团购系统毕业设计项目源码

题目简介 在生鲜消费升级、社区团购模式兴起的背景下&#xff0c;传统生鲜流通存在 “中间环节多、损耗率高、配送响应慢” 的痛点。基于 SpringBoot 构建的社区生鲜团购系统&#xff0c;适配平台管理员、团长、供应商、社区用户等角色&#xff0c;实现生鲜商品上架、团购开团、…

作者头像 李华
网站建设 2026/4/26 22:35:27

基于Android的宠物社区app设计与实现(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦宠物主人社交需求分散、宠物养护知识获取不系统、宠物相关服务对接不畅等痛点&#xff0c;设计并实现一款基于Android的宠物社区APP&#xff0c;旨在为宠物主人搭建集中化的交流互动平台&#xff0c;同时整合宠物相关资源&#xff0c;提供全面的宠物服务支持…

作者头像 李华
网站建设 2026/4/24 13:57:02

Memcached单条数据极限有多大?内存数据库的存储边界解析

文章目录Memcached 最大能存储多大的单个 Item&#xff1f;前言第一部分&#xff1a;Memcached 是什么&#xff1f;第二部分&#xff1a;Memcached 的内存分配机制SlabAllocator 是什么&#xff1f;Slab 分类第三部分&#xff1a;单个 Item 的最大存储容量默认情况下的限制如何…

作者头像 李华
网站建设 2026/5/3 17:03:12

Agentic AI开发工具对比:提示工程架构师的选择指南,前景与挑战

Agentic AI开发工具对比&#xff1a;提示工程架构师的选择指南&#xff0c;前景与挑战 引言 背景介绍 在人工智能飞速发展的当下&#xff0c;Agentic AI&#xff08;具身智能体人工智能&#xff09;逐渐崭露头角。Agentic AI强调智能体能够自主地感知环境、做出决策并采取行动&…

作者头像 李华
网站建设 2026/4/26 23:35:42

一棵树里藏了多少“自己人”?——聊聊《统计同值子树》背后的递归哲学

一棵树里藏了多少“自己人”?——聊聊《统计同值子树》背后的递归哲学 大家好,我是 Echo_Wish。 今天咱不聊分布式、不聊大模型,回到一个看似朴素、但非常能体现算法功力的题目: 👉 统计同值子树(Count Univalue Subtrees) 这道题在 LeetCode 上不算“天花板难度”,…

作者头像 李华