在Kotlin中,类、对象、接口、构造函数、方法、属性和它们的setter都可以有 可见性修饰符。 (getter 总是与属性有着相同的可见性。) 在 Kotlin 中有这四个可见性修饰符:private、 protected、 internal 和 public。 如果没有显式指定修饰符的话,默认可见性是 public。
包内顶层声明的访问修饰符
可以在函数、属性和类、对象和接口顶层声明,即直接在包内声明
package com.xiaoying.base
fun main(args: Array<String>) {
}
// 只在文件内可见
private fun test() {
}
class Base {
}
顶层声明的访问修饰符有以下特点
- 如果你不指定任何可见性修饰符,默认为
public,这意味着你的声明将随处可见; - 如果你声明为
private,它只会在声明它的文件内可见(如果类内部的); - 如果你声明为
internal,它会在相同模块内随处可见; protected不适用于顶层声明。
- 一个文件只能有一个包声明。
- 虽然
public修饰符随处可见,但是在不同的包进行引用时,必须导入包。
类和接口中声明的修饰符
对于类内部声明的成员:
private只在这个类内部(包含类所有成员)可见;protected在这个类的内部极其子类中可见(如果覆盖一个 protected 成员并且没有显式指定其可见性,该成员还会是 protected 可见性);internal只在能见到类声明的本模块内可见;public在能见到类声明的任何地方都可见这个类的public成员。
注意: 跟Java不同的是,Kotlin中外部类不能访问内部类的 private 成员。
open class A {
// 没有指定默认public
open fun printTest() {
test()
val b = B()
b.printTest() // public的成员,只要能看见类声明的地方都可以访问
// b.test() B类中的private成员,只能在B内部访问,外部无法访问
}
private fun test() {
println("This is test in A")
}
protected open fun play() {
println("Play in A")
}
internal fun stopPlay() {
println("Stop play in A")
}
}
class B {
fun printTest() {
test()
}
private fun test() {
println("This is test in B")
}
}
class C: A() {
// 重写父类的protected成员,没有指定访问修饰,默认是protected
override fun printTest() {
val d = D()
d.printTest() // 内部类的public成员可以访问
// d.test() // 内部类的private成员不可访问,这是跟java的不同之处
}
fun superPlay() {
// 父类protected的成员,在子类中可以访问
super.play()
}
override fun play() {
println("Play in C")
}
class D {
fun printTest() {
test()
}
// 内部类的private成员,外部类无法访问
private fun test() {
println("This is test in D")
}
}
}
为构造函数添加访问修饰
默认情况下,构造函数都是public的。
注意:如果主构造函数修改了默认的(
public)访问修饰符,则需要显式使用constructor关键字
// 主构造函数如果修改默认的修饰符,需要添加constructor关键字
class B private constructor(var id: String) {
private constructor(id: String, name: String): this(id) {
}
fun printTest() {
test()
}
private fun test() {
println("This is test in B")
}
}
博客介绍了Kotlin中类、对象、接口等的可见性修饰符。包括包内顶层声明的访问修饰符特点,如默认随处可见等;类和接口中声明的修饰符在不同范围的可见性,还指出与Java的不同;以及为构造函数添加访问修饰的相关注意事项。
701

被折叠的 条评论
为什么被折叠?



