Kotlin学习之-5.4 可见性描述符

来源:互联网 发布:htpc 用什么软件 编辑:程序博客网 时间:2024/05/21 22:38

Kotlin学习之-5.4 可见性描述符

类,对象,接口,构造函数,函数,属性以及他们的setter可以用可见性描述符来修改其可见性。getter方法的可见性通常和属性的可见性一致。Kotlin中有4中可见性描述符:private, protected, internalpublic。如果没有显示写描述符,那么默认可见性是public 的。

下面是各种不同定义范围的解释。

函数,属性和类,对象和接口可以在顶级声明,例如,直接在包中声明

//file name: example.ktpackage foofun baz() {}class Bar {}
  • 如果不指定任何可见性描述符的话,默认使用的是pubic, 意味着定义会在所有地方都可见
  • 如果指定是private的,它只会在定义域内可见。
  • 如果指定是internal的,它会在module中的所有地方可见。
  • protected 不能用在顶级的定义

例如:

//file name: example.ktpackage fooprivate fun foo() {} // example.kt 中可见public var bar: Int = 5 // 全局可见    private set         // setter 仅在example.kt 中可见internal val baz = 6   // 在同module 中可见

类和接口

对于类中定义的成员:

  • private 意味着仅在这个类范围内可见(包括所有的成员)
  • protected 包括private的可见性,并且在子类中可见。
  • internalmodele中能够给看到类定义的部分,都可以看到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安卓开发

阅读全文
1 0
原创粉丝点击