成员函数
6.1 成员函数 vs 顶层函数
| 类型 | 核心定义 | 使用场景 | 示例 |
|---|---|---|---|
| 成员函数 | 定义在类 / 对象内部的函数 | 类的行为封装、访问类的成员属性 | class A { fun foo() { ... } } |
| 顶层函数 | 定义在文件顶层(无类包裹) | 通用工具函数、无状态的全局函数 | fun foo() { ... }(直接写在.kt 文件) |
示例:
// 顶层函数(直接定义在文件中)
fun printHello() {
println("Hello 顶层函数")
}
class User {
// 成员函数
fun sayHello() {
println("Hello 成员函数")
}
}
fun main() {
printHello() // 直接调用顶层函数
User().sayHello() // 通过类实例调用成员函数
}
成员函数
类成员函数(也叫类的成员方法),是定义在类(或接口、数据类等)内部,并且属于该类实例(或类本身)的函数。它是类的重要组成部分,和类的属性(成员变量)一起,共同构成了类的行为和状态,用于实现该类的具体功能。
简单来说:类就像一个 “模板”,成员函数就是这个模板赋予其实例的 “行为能力”。
类成员函数的两种常见类型
- 实例成员函数(最常用)
- 伴生对象成员函数(类级别的成员函数)
1. 实例成员函数(最常用)
就是上面示例中的setAge()、getPersonInfo(),也是默认的类成员函数类型:
- 依赖类的实例存在,必须先
val/var 实例名 = 类名()创建对象,才能调用; - 可以访问实例的所有成员属性(每个实例的属性值独立,函数调用结果可能因实例不同而不同)。
2. 伴生对象成员函数(类级别的成员函数)
如果想让类成员函数不依赖实例,直接通过「类名。函数名」调用(类似 Java 的static方法),可以使用companion object(伴生对象)内部的成员函数:
class Student {
var studentId: String = ""
var className: String = ""
// 伴生对象:属于类本身,而非实例
companion object {
// 伴生对象中的成员函数(类级别的成员函数)
fun createDefaultStudent(): Student {
val student = Student()
student.studentId = "S001"
student.className = "一年级一班"
return student
}
}
}
fun main() {
// 无需创建 Student 实例,直接通过「类名.函数名」调用伴生对象成员函数
val defaultStudent = Student.createDefaultStudent()
println("默认学生:学号${defaultStudent.studentId},班级${defaultStudent.className}")
}