在本文中,您将了解Kotlin中的4种可见性修饰符,以及它们在不同情况下的工作方式。
可见性修饰符是用于设置类,对象,接口,构造函数,函数,属性及其设置器的可见性(可访问性)的关键字。(不能设置 getters 的可见性修饰符,因为它们总是具有与属性相同的可见性)
在Kotlin类和对象文章中,您简要了解了可见性修饰符 public 和 private。本文您将详细了解另外两个可见性修饰符 protected 和 internal(以及public 和 private)。
包组织一组相关的函数、属性和类、对象和接口。
修饰符 | 描述 |
---|---|
public | 在任何地方都可见 |
private | 在包含声明的文件内可见 |
internal | 在同一模块内可见(一组一起编译的Kotlin文件) |
protected | 不可用于包(用于子类) |
注意:如果未指定可见性修饰符,则默认情况下为默认值 public 。
让我们举个实例:
//文件名: hello.kt package test fun function1() {} //默认情况下是公共的,并且在任何地方都可见 private fun function2() {} //在hello.kt内部可见 internal fun function3() {} //在同一模块内可见 var name = "Foo" //随处可见 get() = field //在hello.kt内可见(与其属性相同) private set(value) { //在hello.kt内部可见 field = value } private class class1 {} //在hello.kt内部可见
下面是可见性修饰符对类内声明的成员(函数、属性)的工作方式:
修饰符 | 描述 |
---|---|
public | 对任何可以看到声明类的客户端可见 |
private | 仅在类内部可见 |
protected | 在类及其子类内可见 |
internal | 对模块内可以看到声明类的任何客户端可见 |
注意:如果您在派生类中重写 protected 成员而不指定其可见性,则其可见性也将为 protected。
让我们举个实例:
open class Base() { var a = 1 //默认情况下为公共 private var b = 2 // Base 类私有 protected open val c = 3 //对 Base 类和 Derived 类可见 internal val d = 4 //在同一模块内可见 protected fun e() { } //对 Base 类和 Derived 类可见 } class Derived: Base() { // a, c, d, 和 e()Base 类的所有属性都是可见的 // b 不可见 override val c = 9 // c 是 protected } fun main(args: Array<String>) { val base = Base() //base.a和base.d可见 // base.b, base.c 和 base.e() 不可见 val derived = Derived() // derived.c 不可见 }
默认情况下,构造函数的可见性为 public。但是,你可以改变它。为此,您需要显式地添加 constructor 关键字。
在下面的示例中,构造函数默认为 public:
class Test(val a: Int) { // code }
您可以通过以下方法更改其可见性。
class Test private constructor(val a: Int) { // code }
这里的构造函数是 private。
注意: 在Kotlin中,局部函数,变量和类不能具有可见性修饰符。