Kotlin 类和对象
Kotlin 类和对象(2025年中文讲解)
Kotlin 的类和对象是面向对象编程(OOP)的核心,设计简洁、强大,相比 Java 减少了样板代码(如 getter/setter),并结合空安全、数据类和函数式特性,广泛用于 Android、后端(Spring Boot)和 Kotlin Multiplatform 项目。2025年,Kotlin 2.0(K2 编译器)优化了类初始化性能,特别是在 Android Jetpack Compose 和 KMP 中应用广泛。本教程详细讲解 Kotlin 类和对象的语法、用法和实践,基于官方文档、CSDN 和知乎,适合初学者和开发者。建议用 Kotlin Playground(https://play.kotlinlang.org/)练习。
一、Kotlin 类和对象概览(必知)
- 类(Class):定义对象的蓝图,包含属性(数据)和方法(行为)。
- 对象(Object):类的实例,或通过
object
关键字定义的单例。 - 核心特性:
- 简洁:主构造函数、主属性声明简化代码。
- 空安全:属性和方法支持可空类型(
?
)。 - 数据类:自动生成
toString
、equals
、copy
等。 - 单例/伴生对象:简化静态成员和单例实现。
- 继承与接口:支持开放继承(
open
)和多接口。 - 2025年趋势:Kotlin 2.0 优化类初始化(速度提升 30%),Android 开发中数据类结合 Jetpack Compose 占主导,KMP 项目强调跨平台类共享。
二、核心语法与用法(必会)
以下按类、对象、数据类等模块讲解,包含代码示例,直接可运行。
1. 类声明与实例化
- 基本语法:用
class
关键字,主构造函数直接定义。
class Person(val name: String, var age: Int) {
// 初始化块
init {
println("$name is $age years old")
}
// 方法
fun sayHello() = println("Hi, I'm $name")
}
fun main() {
val person = Person("Alice", 25) // 输出:Alice is 25 years old
person.sayHello() // 输出:Hi, I'm Alice
person.age = 26 // var 可修改
// person.name = "Bob" // val 不可修改,报错
}
- 说明:
val
属性:只读,自动生成 getter。var
属性:可读写,生成 getter 和 setter。init
块:构造函数执行时的初始化逻辑。- 无主构造函数:
class Car {
var brand: String = ""
var speed: Int = 0
fun drive() = println("$brand is driving at $speed km/h")
}
fun main() {
val car = Car()
car.brand = "Toyota"
car.speed = 100
car.drive() // 输出:Toyota is driving at 100 km/h
}
2. 数据类(Data Class)
- 用途:专为存储数据设计,自动生成
toString
、equals
、hashCode
和copy
。 - 语法:用
data class
,至少一个主构造函数参数。
data class User(val id: Int, val name: String)
fun main() {
val user = User(1, "Bob")
println(user) // 输出:User(id=1, name=Bob)
val user2 = user.copy(name = "Alice") // 复制并修改
println(user2) // 输出:User(id=1, name=Alice)
println(user == user2) // 输出:false(equals 比较内容)
}
- 注意:数据类适合简单数据模型,如 JSON 解析或数据库实体。
3. 单例(Object)
- 用途:通过
object
关键字定义单例,无需实例化。
object Singleton {
val appName = "MyApp"
fun log(message: String) = println("[$appName] $message")
}
fun main() {
Singleton.log("Started") // 输出:[MyApp] Started
}
- 说明:单例全局唯一,类似 Java 静态类,适合工具类或全局配置。
4. 伴生对象(Companion Object)
- 用途:类内的静态成员,替代 Java 的
static
。
class MyClass {
companion object {
val constant = "CONSTANT"
fun create() = MyClass()
}
}
fun main() {
println(MyClass.constant) // 输出:CONSTANT
val instance = MyClass.create()
}
- 命名伴生对象(可选):
class MyClass {
companion object Factory {
fun create() = MyClass()
}
}
fun main() {
val instance = MyClass.Factory.create()
}
5. 继承与接口
- 继承:Kotlin 类默认
final
,需用open
允许继承。
open class Animal(val name: String) {
open fun sound() = println("$name makes a sound")
}
class Dog(name: String) : Animal(name) {
override fun sound() = println("$name barks")
}
fun main() {
val dog = Dog("Buddy")
dog.sound() // 输出:Buddy barks
}
- 接口:支持多继承,方法可有默认实现。
interface Drivable {
fun drive() = println("Driving...")
}
class Car : Drivable {
override fun drive() = println("Car is moving")
}
fun main() {
val car = Car()
car.drive() // 输出:Car is moving
}
6. 空安全与类
- 属性可空:
class Student(val name: String?, var age: Int?) {
fun introduce() = println("Name: ${name ?: "Unknown"}, Age: ${age ?: 0}")
}
fun main() {
val student = Student(null, null)
student.introduce() // 输出:Name: Unknown, Age: 0
}
三、实践示例(综合应用)
- 命令行示例(学生管理系统):
data class Student(val id: Int, val name: String, var grade: String)
object StudentManager {
private val students = mutableListOf<Student>()
fun addStudent(student: Student) {
students.add(student)
println("Added: $student")
}
fun listStudents() = students.forEach { println(it) }
}
fun main() {
StudentManager.addStudent(Student(1, "Alice", "A"))
StudentManager.addStudent(Student(2, "Bob", "B"))
StudentManager.listStudents()
}
输出:
Added: Student(id=1, name=Alice, grade=A)
Added: Student(id=2, name=Bob, grade=B)
Student(id=1, name=Alice, grade=A)
Student(id=2, name=Bob, grade=B)
- Android 示例(用户信息显示):
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
data class User(val id: Int, val name: String)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button: Button = findViewById(R.id.button)
val textView: TextView = findViewById(R.id.textView)
val user = User(1, "Alice")
button.setOnClickListener {
textView.text = user.toString()
}
}
}
布局(res/layout/activity_main.xml
):
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Press button" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show User" />
</LinearLayout>
功能:点击按钮显示 User(id=1, name=Alice)
。
四、注意事项与最佳实践
- 优先数据类:
- 数据模型用
data class
,减少手动实现toString
等。
- 空安全:
- 属性声明时明确是否可空(
String?
vsString
),避免!!
。
class Person(val name: String?) {
fun getName() = name ?: "Unknown"
}
- 伴生对象 vs 单例:
- 类内静态逻辑用
companion object
,全局单例用object
。
- 继承谨慎:
- 默认用
final
类,需继承时加open
,避免复杂继承链。
- 2025年趋势:
- Jetpack Compose:类结合 Composable 函数(如
User
数据驱动 UI)。 - KMP:跨平台项目中,类需标记
expect
/actual
实现平台差异。 - AI 辅助:IntelliJ 的 Codeium 插件可自动生成类和方法。
五、学习建议
- 练习:用 Kotlin Playground 实践类、数据类和单例,写学生或商品管理程序。
- 资源:
- 官方文档:https://kotlinlang.org/docs/classes.html
- B站:尚硅谷 Kotlin 教程(免费,包含类和对象)。
- CSDN:搜索“Kotlin 类和对象”。
- 时间:2-3 天掌握类和对象,1 周熟悉 Android 结合。
- 实践:开发小型 App(如用户列表、设置管理)。
六、总结
Kotlin 类和对象必知主构造函数、数据类、单例和空安全,必会定义类、实例化、继承和接口实现。2025年,Kotlin 2.0 提升类性能,Android(Compose)和 KMP 项目中类是核心。相比 Java,Kotlin 类更简洁、安全,适合快速开发。
如果需要具体场景代码(如 Compose 数据类)或有问题,告诉我,我可以提供更详细解答!