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 关键字定义的单例。
  • 核心特性
  • 简洁:主构造函数、主属性声明简化代码。
  • 空安全:属性和方法支持可空类型(?)。
  • 数据类:自动生成 toStringequalscopy 等。
  • 单例/伴生对象:简化静态成员和单例实现。
  • 继承与接口:支持开放继承(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)
  • 用途:专为存储数据设计,自动生成 toStringequalshashCodecopy
  • 语法:用 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
  }

三、实践示例(综合应用)

  1. 命令行示例(学生管理系统)
   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)
  1. 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)

四、注意事项与最佳实践

  1. 优先数据类
  • 数据模型用 data class,减少手动实现 toString 等。
  1. 空安全
  • 属性声明时明确是否可空(String? vs String),避免 !!
   class Person(val name: String?) {
       fun getName() = name ?: "Unknown"
   }
  1. 伴生对象 vs 单例
  • 类内静态逻辑用 companion object,全局单例用 object
  1. 继承谨慎
  • 默认用 final 类,需继承时加 open,避免复杂继承链。
  1. 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 数据类)或有问题,告诉我,我可以提供更详细解答!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注