在Kotlin中,主构造函数参数的修饰符(如 private val
)与无修饰符的区别主要体现在参数是否成为类的属性 以及属性的可见性上。以下是详细对比:
1. 使用 private val
修饰
- 生成属性 :参数会成为类的私有只读属性 (
private val
)。 - 可见性:仅在类内部可访问,外部无法直接访问。
- 生命周期:作为类的属性,可在类的任何方法或初始化块中使用。
示例:
kotlin
class Example(private val a: Int) {
fun printA() {
println(a) // 正确:a是私有属性
}
}
val obj = Example(10)
// obj.a // 编译错误:a是private的
2. 无修饰符
- 不生成属性:参数仅为构造函数的临时参数。
- 可见性 :仅在初始化阶段 (如
init
块或属性初始化)可用,无法在类的方法中访问。 - 生命周期:初始化完成后参数被销毁。
示例:
kotlin
class Example(b: Int) {
init {
println(b) // 正确:b在初始化阶段可用
}
fun printB() {
// println(b) // 编译错误:b不是类的属性
}
}
3. 对比表格
修饰符 | 生成属性 | 可见性 | 可访问范围 |
---|---|---|---|
private val |
是 | 类内部 | 类的任何地方 |
无修饰符 | 否 | 仅初始化阶段 | init 块或属性初始化器 |
4. 其他情况
-
**
val
/var
无可见性修饰符**:生成公有属性(默认public
)。kotlinclass Example(val c: Int) // 外部可通过 obj.c 访问
-
手动声明属性:可通过构造函数参数初始化类体内声明的属性。
kotlinclass Example(d: Int) { val customD = d // 手动将参数转为公有属性 }
总结
- **用
private val
**:参数成为私有属性,类内可用。 - 无修饰符:参数仅用于初始化,不保留为属性。
- **
val
/var
**:参数成为公有属性,外部可访问。