Kotlin 类与对象 #

一、类定义 #

1.1 基本语法 #

kotlin
class Person {
    var name: String = ""
    var age: Int = 0
    
    fun greet() {
        println("Hello, I'm $name")
    }
}

1.2 创建对象 #

kotlin
val person = Person()
person.name = "Kotlin"
person.age = 10
person.greet()  // Hello, I'm Kotlin

1.3 空类 #

kotlin
class Empty

// 或
class Empty()

二、属性 #

2.1 属性声明 #

kotlin
class Person {
    // 可变属性
    var name: String = ""
    
    // 只读属性
    val id: Int = 1
    
    // 延迟初始化
    lateinit var email: String
    
    // 懒加载
    val heavyData: Data by lazy {
        loadData()
    }
}

2.2 自定义 getter/setter #

kotlin
class Person {
    var name: String = ""
        get() = field.uppercase()
        set(value) {
            field = value.trim()
        }
    
    var age: Int = 0
        set(value) {
            field = if (value >= 0) value else 0
        }
}

2.3 幕后字段 field #

kotlin
class Counter {
    var count: Int = 0
        get() = field
        set(value) {
            if (value >= 0) {
                field = value
            }
        }
}

2.4 计算属性 #

kotlin
class Rectangle(val width: Int, val height: Int) {
    val area: Int
        get() = width * height
    
    val isSquare: Boolean
        get() = width == height
}

三、构造函数 #

3.1 主构造函数 #

kotlin
class Person(val name: String, var age: Int)

val person = Person("Kotlin", 10)

3.2 init 块 #

kotlin
class Person(val name: String, var age: Int) {
    init {
        require(age >= 0) { "Age cannot be negative" }
        println("Person created: $name")
    }
}

3.3 次构造函数 #

kotlin
class Person(val name: String, var age: Int) {
    // 次构造函数
    constructor(name: String) : this(name, 0)
    
    constructor() : this("Unknown", 0)
}

val p1 = Person("Kotlin", 10)
val p2 = Person("Kotlin")
val p3 = Person()

3.4 私有构造函数 #

kotlin
class Singleton private constructor() {
    companion object {
        val instance: Singleton by lazy { Singleton() }
    }
}

四、访问修饰符 #

4.1 可见性修饰符 #

修饰符 类成员 顶层声明
public 所有可见(默认) 所有可见
private 类内可见 文件内可见
protected 类及子类可见 不适用
internal 模块内可见 模块内可见

4.2 使用示例 #

kotlin
class Example {
    public var publicProp: String = ""      // 所有可见
    private var privateProp: String = ""    // 类内可见
    protected var protectedProp: String = "" // 类及子类可见
    internal var internalProp: String = ""  // 模块内可见
    
    private fun privateMethod() { }
    
    public fun publicMethod() { }
}

4.3 类的可见性 #

kotlin
// 公开类
public class PublicClass

// 文件内私有
private class PrivateClass

// 模块内可见
internal class InternalClass

五、方法 #

5.1 方法定义 #

kotlin
class Calculator {
    fun add(a: Int, b: Int): Int {
        return a + b
    }
    
    fun multiply(a: Int, b: Int) = a * b
}

5.2 默认参数 #

kotlin
class Printer {
    fun print(message: String, prefix: String = "[INFO]") {
        println("$prefix $message")
    }
}

val printer = Printer()
printer.print("Hello")           // [INFO] Hello
printer.print("Hello", "[WARN]") // [WARN] Hello

5.3 方法重载 #

kotlin
class Math {
    fun add(a: Int, b: Int) = a + b
    fun add(a: Double, b: Double) = a + b
    fun add(a: Int, b: Int, c: Int) = a + b + c
}

六、数据类 #

6.1 定义数据类 #

kotlin
data class User(val id: Int, val name: String, val email: String)

val user = User(1, "Kotlin", "kotlin@example.com")

6.2 自动生成的方法 #

kotlin
data class User(val id: Int, val name: String)

// 自动生成:
// - equals()
// - hashCode()
// - toString()
// - copy()
// - componentN()

val user = User(1, "Kotlin")
println(user)  // User(id=1, name=Kotlin)

// copy
val updated = user.copy(name = "Updated")
println(updated)  // User(id=1, name=Updated)

6.3 解构声明 #

kotlin
data class User(val id: Int, val name: String)

val user = User(1, "Kotlin")
val (id, name) = user

println("ID: $id, Name: $name")

七、嵌套类与内部类 #

7.1 嵌套类 #

kotlin
class Outer {
    val outerProp = "Outer"
    
    class Nested {
        fun greet() = "Hello from Nested"
    }
}

val nested = Outer.Nested()
nested.greet()

7.2 内部类 #

kotlin
class Outer {
    val outerProp = "Outer"
    
    inner class Inner {
        fun greet() = "Hello from Inner, $outerProp"
    }
}

val outer = Outer()
val inner = outer.Inner()
inner.greet()  // Hello from Inner, Outer

7.3 匿名内部类 #

kotlin
interface ClickListener {
    fun onClick()
}

class Button {
    var listener: ClickListener? = null
    
    fun click() {
        listener?.onClick()
    }
}

val button = Button()
button.listener = object : ClickListener {
    override fun onClick() {
        println("Button clicked")
    }
}
button.click()

八、静态成员 #

8.1 伴生对象 #

kotlin
class MyClass {
    companion object {
        const val CONSTANT = "Constant"
        
        fun staticMethod() {
            println("Static method")
        }
    }
}

MyClass.CONSTANT
MyClass.staticMethod()

8.2 命名伴生对象 #

kotlin
class MyClass {
    companion object Factory {
        fun create(): MyClass = MyClass()
    }
}

MyClass.create()
MyClass.Factory.create()

8.3 作为对象使用 #

kotlin
class MyClass {
    companion object : Logger {
        override fun log(message: String) {
            println(message)
        }
    }
}

MyClass.log("Hello")

九、实战示例 #

9.1 用户类 #

kotlin
class User(
    val id: Int,
    val name: String,
    private var _email: String
) {
    val email: String
        get() = _email.lowercase()
    
    var password: String = ""
        private set
    
    fun updatePassword(newPassword: String) {
        password = newPassword
    }
    
    fun validate(): Boolean {
        return name.isNotBlank() && email.contains("@")
    }
}

9.2 构建器模式 #

kotlin
class User private constructor(
    val name: String,
    val age: Int,
    val email: String
) {
    class Builder {
        private var name: String = ""
        private var age: Int = 0
        private var email: String = ""
        
        fun name(name: String) = apply { this.name = name }
        fun age(age: Int) = apply { this.age = age }
        fun email(email: String) = apply { this.email = email }
        
        fun build() = User(name, age, email)
    }
}

val user = User.Builder()
    .name("Kotlin")
    .age(10)
    .email("kotlin@example.com")
    .build()

9.3 单例模式 #

kotlin
object Database {
    init {
        println("Database initialized")
    }
    
    fun query(sql: String): List<Any> {
        return emptyList()
    }
}

Database.query("SELECT * FROM users")

十、最佳实践 #

10.1 使用数据类 #

kotlin
// 推荐
data class User(val id: Int, val name: String)

// 不推荐(手动实现)
class User(val id: Int, val name: String) {
    override fun equals(other: Any?): Boolean { }
    override fun hashCode(): Int { }
    override fun toString(): String { }
}

10.2 属性封装 #

kotlin
// 推荐
class Person {
    var age: Int = 0
        private set
    
    fun updateAge(newAge: Int) {
        if (newAge >= 0) age = newAge
    }
}

10.3 使用主构造函数 #

kotlin
// 推荐
class Person(val name: String, var age: Int)

// 不推荐
class Person {
    var name: String = ""
    var age: Int = 0
    
    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }
}

十一、总结 #

类与对象要点:

特性 说明
主构造函数 类头部定义
属性 val/var 声明
数据类 data class 自动生成方法
伴生对象 类似静态成员
内部类 inner 关键字

下一步,让我们学习 构造函数

最后更新:2026-03-27