Kotlin 类和对象:从零开始构建你的第一座代码大厦
在编程的世界里,类和对象就像建筑中的“图纸”与“实体建筑”。你有了设计图(类),就能批量建造出具体的房子(对象)。Kotlin 作为现代编程语言的佼佼者,让这一过程变得既清晰又优雅。今天,我们就来一起拆解 Kotlin 中的类与对象,不讲虚的,只讲你能立刻上手的干货。
类的定义与基本语法
在 Kotlin 中,定义一个类非常简单,使用 class 关键字即可。类是对象的蓝图,就像汽车的设计图,可以用来生成无数辆真实的汽车。
class Person {
// 类体中可以定义属性、方法、构造函数等
}
这里我们定义了一个名为 Person 的类。虽然它现在是空的,但已经具备了“模板”的能力。接下来,我们给它添加一些“血肉”——属性和行为。
属性与方法:类的“身体器官”
类的核心是属性(字段)和方法(函数)。属性代表对象的状态,方法代表对象的行为。你可以把类想象成一个“人”的模型:身高、体重是属性,走路、说话是方法。
定义属性
class Person {
// 声明一个名为 name 的字符串类型属性,初始值为 "未知"
var name: String = "未知"
// 声明一个 age 属性,类型为 Int,初始值为 0
var age: Int = 0
}
注意:Kotlin 中的
var表示可变属性,val表示不可变(只读)属性。建议优先使用val,除非你确实需要修改。
定义方法
方法在 Kotlin 中使用 fun 关键字定义。它就像人的“动作”。
class Person {
var name: String = "未知"
var age: Int = 0
// 定义一个方法,用于打印自我介绍
fun introduce() {
println("大家好,我叫 $name,今年 $age 岁。")
}
}
这个 introduce() 方法没有参数,但能访问类中的属性。$name 是 Kotlin 的字符串模板语法,类似 Java 的 String.format。
构造函数:对象的“出生仪式”
每个对象的创建都离不开构造函数。它是类的“出生仪式”,负责初始化对象的初始状态。
Kotlin 支持主构造函数(primary constructor)和次构造函数(secondary constructor)。我们先从主构造函数讲起。
主构造函数
主构造函数直接写在类名后面,可以接收参数。
class Person constructor(name: String, age: Int) {
var name: String = name // 使用传入的参数初始化属性
var age: Int = age
fun introduce() {
println("大家好,我叫 $name,今年 $age 岁。")
}
}
说明:
constructor关键字可省略,Kotlin 允许直接写class Person(name: String, age: Int)。
使用主构造函数创建对象
val person1 = Person("小明", 20)
val person2 = Person("小红", 22)
person1.introduce() // 输出:大家好,我叫 小明,今年 20 岁。
person2.introduce() // 输出:大家好,我叫 小红,今年 22 岁。
这样,你就可以用一行代码创建对象并初始化属性,非常高效。
次构造函数:灵活的“定制化选项”
有时候,你希望对象能以多种方式创建。比如,有人只提供名字,有人提供名字和年龄。这时,次构造函数就派上用场了。
class Person constructor(name: String, age: Int) {
var name: String = name
var age: Int = age
// 次构造函数:只提供名字,默认年龄为 0
constructor(name: String) : this(name, 0)
// 次构造函数:只提供年龄,默认名字为 "未知"
constructor(age: Int) : this("未知", age)
fun introduce() {
println("大家好,我叫 $name,今年 $age 岁。")
}
}
注意:次构造函数必须调用
this()调用主构造函数,这是 Kotlin 的规定。
使用示例:
val p1 = Person("小李") // 使用次构造函数,年龄为 0
val p2 = Person(25) // 使用次构造函数,名字为 "未知"
val p3 = Person("小王", 30) // 使用主构造函数
p1.introduce() // 大家好,我叫 小李,今年 0 岁。
p2.introduce() // 大家好,我叫 未知,今年 25 岁。
p3.introduce() // 大家好,我叫 小王,今年 30 岁。
对象声明与单例模式:Kotlin 的“单例神器”
在某些场景中,你只需要一个全局唯一的实例。比如配置管理器、日志工具类。Kotlin 提供了 object 关键字来实现单例模式。
object Logger {
fun log(message: String) {
println("[LOG] $message")
}
}
object声明的类没有构造函数,自动是单例。你不能用new创建实例。
使用方式:
Logger.log("程序启动成功") // 输出:[LOG] 程序启动成功
这比 Java 的 public static 更简洁、更安全,是 Kotlin 的一大亮点。
Kotlin 类和对象的实战案例:学生管理系统
我们来做一个小项目,模拟一个简单的学生管理系统。这能帮你理解类与对象在真实项目中的应用。
class Student constructor(val id: String, val name: String, var grade: Double = 0.0) {
// 学生的属性:学号、姓名、成绩
// 方法:显示学生信息
fun showInfo() {
println("学号:$id,姓名:$name,成绩:$grade")
}
// 方法:判断是否及格
fun isPass(): Boolean {
return grade >= 60.0
}
// 方法:升级成绩(模拟考试加分)
fun addScore(points: Double) {
grade += points
if (grade > 100.0) grade = 100.0 // 成绩不能超过100
}
}
使用示例:
fun main() {
val student1 = Student("S001", "张三", 85.0)
val student2 = Student("S002", "李四", 55.0)
student1.showInfo() // 学号:S001,姓名:张三,成绩:85.0
student2.showInfo() // 学号:S002,姓名:李四,成绩:55.0
println("张三是否及格?${student1.isPass()}") // true
println("李四是否及格?${student2.isPass()}") // false
student2.addScore(10.0)
student2.showInfo() // 学号:S002,姓名:李四,成绩:65.0
}
这个例子展示了如何用类封装数据和行为,让代码更清晰、可维护性更高。
总结:Kotlin 类和对象的核心价值
Kotlin 的类与对象设计,不仅仅是语法糖,更是一种编程思想的体现。它鼓励你:
- 将数据和操作封装在一起;
- 通过构造函数控制对象的创建;
- 使用
object实现优雅的单例; - 用
val保证不可变性,提升代码安全性。
当你熟练掌握 Kotlin 类和对象后,你会发现写代码不再是一堆零散的函数堆砌,而是一套有结构、有逻辑的“系统”。无论是开发 Android 应用,还是构建后端服务,这一基础都至关重要。
最后提醒一句:别急着写复杂代码。先从一个简单的 Person 类开始,一步步构建你的代码世界。每一个对象,都是你逻辑王国中的一个“居民”。
愿你在 Kotlin 的世界里,写出既优雅又健壮的代码。