Kotlin学习之-5.4 可见性描述符
类,对象,接口,构造函数,函数,属性以及他们的setter可以用可见性描述符来修改其可见性。getter方法的可见性通常和属性的可见性一致。Kotlin中有4中可见性描述符:private
, protected
, internal
和public
。如果没有显示写描述符,那么默认可见性是public
的。
下面是各种不同定义范围的解释。
包
函数,属性和类,对象和接口可以在顶级声明,例如,直接在包中声明
//file name: example.kt
package foo
fun baz() {}
class Bar {}
- 如果不指定任何可见性描述符的话,默认使用的是
pubic
, 意味着定义会在所有地方都可见 - 如果指定是
private
的,它只会在定义域内可见。 - 如果指定是
internal
的,它会在module
中的所有地方可见。 protected
不能用在顶级的定义
例如:
//file name: example.kt
package foo
private fun foo() {} // example.kt 中可见
public var bar: Int = 5 // 全局可见
private set // setter 仅在example.kt 中可见
internal val baz = 6 // 在同module 中可见
类和接口
对于类中定义的成员:
private
意味着仅在这个类范围内可见(包括所有的成员)protected
包括private
的可见性,并且在子类中可见。internal
在modele
中能够给看到类定义的部分,都可以看到internal
的成员public
任何可以看到类定义的部分,都可以看到public
的成员
Java用户需要注意:在Kotlin中,外部类无法看到内部类的私有
private
成员
如果复写一个protected
成员,并且不显式地指定可见性的话,复写的成员仍然是protected
的可见性。
例如:
open class Outer {
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4 // public by default
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a is not visible
// b, c and d are visible
// Nested and e are visible
override val b = 5 // b is protected
}
class Unrelated(o: Outer) {
// o.a, o.b are not visible
// o.c and o.d are visible (same module)
// Outer.Nested is not visible, and Nested::e is not visible either
}
构造器
为了指定类的主要构造器的可见性,可以使用如下语法(注意需要显式地使用constructor
关键字)
class C private constructor(a: Int) {
// ...
}
这里的构造器是私有的。默认情况下,所有的构造器都是共有的public
,这样当类可见时,它的构造器也是默认可见的。注意,一个internal
的类的构造器仅在同module
中可见。
局部声明
局部变量,函数和类都没有可见性修饰符。
模块Modules
修饰符internal
意味着它的成员在同模块中都是可见的。更确切的说,一个模块是一些Kotlin文件的集合被编译在一起。
- 一个 IntellJ IDEA 模块
- 一个Maven 或者Gradle 工程
- 一些文件的集合,他们被一个Ant任务编译
PS,我会坚持把这个系列写完,有问题可以留言交流,也关注专栏Kotlin for Android Kotlin安卓开发
作者:farmer_cc 发表于2017/6/28 9:12:17 原文链接
阅读:0 评论:0 查看评论