对比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可见性修饰符的主要内容,如果未能解决你的问题,请参考以下文章
从 internal 修饰符一探 kotlin 的可见性控制