原文: https://www.programiz.com/kotlin-programming/visibility-modifiers
在本文中,您将了解 Kotlin 中的所有 4 种可见性修饰符,以及它们在不同情况下的工作方式。
可见性修饰符是用于设置类,对象,接口,构造器,函数,属性及其设置程序的可见性(可见性)的关键字。 (您无法设置获取器的可见性修饰符,因为它们始终具有与属性相同的可见性。)
在 Kotlin 类和对象文章中,您简要了解了可见性修饰符public和private。 您将详细了解另外两个可见性修饰符protected和internal(以及public和private)。
包内的可见性修饰符
程序包组织了一组相关的函数,属性和类,对象和接口。 推荐阅读: Kotlin 包
| 编辑 | 描述 |
|---|---|
public |
声明随处可见 |
private |
在包含声明的文件内可见 |
internal |
在同一模块内可见(一组一起编译的 Kotlin 文件) |
protected |
不适用于包(用于子类) |
注意:如果未指定可见性修饰符,则默认为public。
让我们举个例子:
// file name: hello.ktpackage testfun function1() {} // public by default and visible everywhereprivate fun function2() {} // visible inside hello.ktinternal fun function3() {} // visible inside the same modulevar name = "Foo" // visible everywhereget() = field // visible inside hello.kt (same as its property)private set(value) { // visible inside hello.ktfield = value}private class class1 {} // visible inside hello.kt
类和接口内的可见性修饰符
这是可见性修饰符对在类内声明的成员(函数,属性)的工作方式:
| 修饰符 | 描述 |
|---|---|
public |
任何可以看到声明类的客户都可以看到 |
private |
仅在类内部可见 |
protected |
在类及其子类中可见 |
internal |
对于模块内可以看到声明类的任何客户端可见 |
注意:如果在派生类中覆盖protected成员而未指定其可见性,则其可见性也将为protected。
Let’s take an example:
open class Base() {var a = 1 // public by defaultprivate var b = 2 // private to Base classprotected open val c = 3 // visible to the Base and the Derived classinternal val d = 4 // visible inside the same moduleprotected fun e() { } // visible to the Base and the Derived class}class Derived: Base() {// a, c, d, and e() of the Base class are visible// b is not visibleoverride val c = 9 // c is protected}fun main(args: Array<String>) {val base = Base()// base.a and base.d are visible// base.b, base.c and base.e() are not visibleval derived = Derived()// derived.c is not visible}
更改构造器的可见性
默认情况下,构造器的可见性为public。 但是,您可以更改它。 为此,您需要显式添加constructor关键字。
在下面的示例中,构造器默认为public:
class Test(val a: Int) {// code}
您可以通过以下方法更改其可见性。
class Test private constructor(val a: Int) {// code}
这里的构造器是private。
注意:在 Kotlin 中,局部函数,变量和类不能具有可见性修饰符。
