Kotlin 学习之可见性修饰符

可见性修饰符

类,对象,接口,构造函数,属性以及它们的 setter 方法都可以有可见性修饰词。(getter与对应的属性拥有相同的可见性)。在 Kotlin 中有四种修饰词: private , protected ,internal ,以及 public 。默认的修饰符是public
下面将解释不同类型的声明作用域。

函数,属性和类,对象和接口可以在 “top-level” 声明,即可以直接属于包:

// file name: example.kt
package foo

fun baz() {}
class Bar {}
  • 如果没有指明任何可见性修饰词,默认使用 public ,这意味着你的声明在任何地方都可见;
  • 如果你声明为 private ,则只在包含声明的文件中可见;
  • 如果用 internal 声明,则在同一模块中的任何地方可见;
  • protected 在 “top-level” 中不可以使用

例子:

// 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 在本模块的所有可以访问到声明区域的均可以访问该类的所有internal 成员;
  • public 任何地方可见

java 使用者注意:外部类不可以访问内部类的 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 类型的类中的 public 属性只能在同一个模块内才可以访问)

局部声明

局部的变量,函数和类是不允许使用修饰词的

模块

internal 修饰符是指成员的可见性是只在同一个模块中才可见的。模块在 Kotlin中就是一系列的 Kotlin 文件编译在一起:
* an IntelliJ IDEA module;
* a Maven project;
* a Gradle source set;
* a set of files compiled with one invocation of the Ant task.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值