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