对比Java学Kotlin可见性修饰符

Posted 陈蒙_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对比Java学Kotlin可见性修饰符相关的知识,希望对你有一定的参考价值。

与 Java 不同的是,Kotlin 默认可见性修饰符是 public。

对于 Java 的可见性修饰符,可以说是基础知识了,校招面试必问题目之一:

修饰类的方法/成员变量:

修饰符作用
private仅在当前类内部可见
缺省对同一 package 可见
protected对子类和同一 package 可见
public对所有类可见

Kotlin 可见性修饰符根据可能会出现在类、对象、方法、属性、构造方法和成员方法/变量的前面。根据出现的场景不同,具有不同的作用。下面我们分为包、类&接口、成员方法/变量来阐述。

对于一些直接声明在 .kt 文件内部且非类内部的方法、变量、对象,我们称之为“top-level” 声明,比如:

// 所在文件名称: dmeo.kt,以下为文件内容:
package foo
const val foo = "foobar"
fun baz() {...}
class Bar {...}

对于这种场景的可见性修饰符:

  • 缺省值是 public;
  • private 表示该变量、方法、类只能在当前文件中使用;
  • internal,对当前模块(module)可见;
  • 禁止使用 protected 修饰符;

一些例子:

// 所在文件名称: dmeo.kt,以下为文件内容:
package foo
private const val foo = "foobar" // 只对当前文件可见
public var bar: Int = 5 // 对所有类、方法等可见
    private set         // setter 方法只对当前文件可见
internal val baz = 0 // 对当前模块可见

注意,这里的 module 是指一组文件,这些文件在一起编译,module 可能是:

  • 一个 Intelij IDEA 的 module;
  • 一个 maven 工程;
  • 一组 gradle 源文件(with the exception that the test source set can access the internal declarations of main);
  • 通过 Ant 任务调用编译的一组文件;

类和接口

对于类和接口内部的成员变量和方法来说:

修饰符作用
private仅在当前类内部可见
缺省同 public
internal同一module可见
protected对子类和同一 package 可见
public对所有类可见

注意:

  • 内部类的 private 成员对外部类是不可见的;
  • 如果在子类中重写 protected 类型的父类成员,且无可见性修饰符,则重写后的成员仍然是 protected;

一些例子:

open class Outer {
    private val a = 1
    protected open val b = 2
    internal val c = 3
    val d = 4 // 默认是 public 权限

    protected class Nested {
        public val e : Int = 5
    }
}

class Subclass : Outer() {
    // a 不可见
    // b、c 和 d 是可见的
    // Nested 和 e 是可见的
    override val b = 5 // protected 权限
}

// Outer、Subclass 和 Unrelated 在同一个 module 内
class Unrelated (o: Outer) {
    // o.a o.b 不可见
    // c 和 d 可见
    // Outer.Nested 以及 Nested::e 不可见
}

构造方法

在 Kotlin 中,主构造方法默认是 public 的,这样就使得对应的类可以在任何地方被实例化。当然,也可以使用非 public 修饰符:

class C private constructor(a: Int) {...}

以上是关于对比Java学Kotlin可见性修饰符的主要内容,如果未能解决你的问题,请参考以下文章

对比Java学Kotlin可见性修饰符

从 internal 修饰符一探 kotlin 的可见性控制

从 internal 修饰符一探 kotlin 的可见性控制

Kotlin基础 常量变量可见性修饰符

Kotlin学习笔记之可见性修饰符

Kotlin 中内部可见性修饰符的范围