- 开发环境:IntelliJ IEDA
- 个人博客:http://blog.csdn.net/IInmy
- 项目源码:https://github.com/Rushro2m/KotlinForOfficial
- 官方文档中文版:https://www.kotlincn.net/docs/reference/visibility-modifiers.html
1、应用域
类、对象、接口、构造函数、方法、属性和它们的setter都可以有可见性修饰符。在Kotlin中有四个可见性修饰符:
- private
- protected
- internal
- public
如果没有显式指定修饰符的话,默认可见性都是public。
2、包名
函数、属性和类、对象和接口可以在顶层声明,即直接在包内:
package foo
fun baz(){}
class Bar{}
每一个修饰符都限制了一定的范围:
- 未指定修饰符时,默认为
public
,表明随处可见 - 声明为
public
时,它只会在声明它的文件内可见; - 声明为
internal
,它会在相同模块内随处可见; protected
不适用于顶层声明。
例如:
package foo
//在此类内随处可见
private fun foo(){}
//该属性随处可见
public var bar: Int = 5
//setter只在此文件内可见
private set
//相同模块内可见
internal val baz = 6
3、类和接口
对于类内部声明的成员:
private
意味着只在这个类内部(包含其所有成员)可见;protected
和private
一样+在子类中可见。internal
能剪刀类声明的本模块内的任何客户端都可见其internal
成员;public
能见到类声明的任何客户端都是可见其public
成员。
open class Outer {
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4
protected open class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
//b被open修饰,可以直接访问
override val b: Int
get() = 5
val xx = Outer()
//修饰符是protected或者private
private var yy = Outer.Nested()
fun foo() {
//c,d,e可见,但是需要通过对应对象
println(xx.c)
println(xx.d)
print(yy.e)
}
}
class Unrelated(o: Outer) {
val kk = o
fun stringPrint() {
//a,b不可见,c,,d可见
print(kk.c)
print(kk.d)
}
}
要指定一个类的主构造函数的可见性,使用以下语法,需要添加一个显式的constructor
关键字:
class C private constructor(a: Int){
//代码块
}
4、模块
可见性修饰符internal
意味着该成员只在相同模块内可见。更具体的说,一个模块是编译在一起的一套Kotlin文件:
- 一个IntellJ IEDA模块;
- 一个Maven或者Gradle项目;
- 一次
<kotlinc>
Ant任务执行所编译的一套文件。