可见性修饰符

类,对象,接口,构造器,函数,属性以及他们的setter都可以有可见性修饰符(getter总是和属性的可见性一样)。在Kotlin中,有4种可见性修饰符:private protected internal public,没有显示指定修饰符时默认是public 下面将解释不同声明类型的作用域

函数,属性和类,对象,接口都可以声明在顶层,直接在包内:

// file name: example.kt
package foo

fun baz() {}
class Bar {}
  • 如果你没有指定任何可见性修饰符,默认使用public,这意味着你的声明随处可见
  • 如果你把声明标记为private,仅在包含声明的文件内可见
  • 如果标记为internal,在同一个moudle内随处可见
  • protected不适用于顶层声明

举例:

// file name: example.kt
package foo

private fun foo() {} // visible inside example.kt

public var bar: Int = 5 // property is visible everywhere
    private set         // setter is visible only in example.kt

internal val baz = 6    // visible inside the same module

类和接口

对于声明在类中的成员:

  • private意味着仅在类中可见(包括类中所有成员)
  • protectedprivate一样,并且对所有子类可见
  • internal意味着在这个module中任意可以看到声明的这个类的客户端都可以看到它的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) { ... }

这里的构造函数是private的,默认情况下所有的构造函数都是public的。实际上只要类是可见的,他们就是随处可见的,但是一个internal类的构造函数只是同一个module中可见

局部声明

局部变量,函数和类不可以有可见性修饰符

Modules

internal可见性修饰符意味着成员在同一个module中是可见的,更具体的说,module是一系列Kotlin文件编译在一起:

  • 一个Intellij IDEAmodule
  • 一个Maven或者Gradle的工程
  • Ant任务编译的一系列文件

有任何疑问,欢迎加群讨论:261386924

results matching ""

    No results matching ""