推荐答案
在 Kotlin 中,public、private、protected 和 internal 是四种不同的可见性修饰符,用于控制类、函数、属性等的访问范围。它们的区别如下:
- public:默认的可见性修饰符。声明为
public的成员可以在任何地方访问。 - private:声明为
private的成员只能在声明它的类或文件(顶层声明)中访问。 - protected:声明为
protected的成员可以在声明它的类及其子类中访问。 - internal:声明为
internal的成员可以在同一个模块(module)内的任何地方访问。
本题详细解读
public
public 是 Kotlin 中默认的可见性修饰符。如果你没有显式指定可见性修饰符,Kotlin 会默认使用 public。这意味着 public 成员可以在任何地方被访问,无论是在同一个模块内还是不同的模块中。
class Example {
public val publicProperty: String = "I am public"
}
fun main() {
val example = Example()
println(example.publicProperty) // 可以访问
}private
private 修饰符限制了成员的访问范围,只能在声明它的类或文件(顶层声明)中访问。对于类成员,private 成员只能在类内部访问;对于顶层声明(如函数、属性),private 成员只能在同一个文件中访问。
// www.javascriptcn.com code example
class Example {
private val privateProperty: String = "I am private"
fun printPrivateProperty() {
println(privateProperty) // 可以访问
}
}
fun main() {
val example = Example()
// println(example.privateProperty) // 编译错误,无法访问
example.printPrivateProperty() // 通过类内部方法访问
}protected
protected 修饰符允许成员在声明它的类及其子类中访问。与 private 不同,protected 成员可以在子类中被访问,但不能在类的外部访问。
// www.javascriptcn.com code example
open class Example {
protected val protectedProperty: String = "I am protected"
}
class SubExample : Example() {
fun printProtectedProperty() {
println(protectedProperty) // 可以访问
}
}
fun main() {
val subExample = SubExample()
subExample.printProtectedProperty() // 通过子类方法访问
// println(subExample.protectedProperty) // 编译错误,无法直接访问
}internal
internal 修饰符允许成员在同一个模块(module)内的任何地方访问。模块是指一起编译的一组 Kotlin 文件,例如一个 IntelliJ IDEA 模块或一个 Maven/Gradle 项目。internal 成员在模块外是不可见的。
// www.javascriptcn.com code example
internal val internalProperty: String = "I am internal"
class Example {
internal fun internalFunction() {
println(internalProperty) // 可以访问
}
}
fun main() {
val example = Example()
example.internalFunction() // 可以访问
// println(internalProperty) // 在同一个模块内可以访问,模块外不可访问
}总结
public:默认修饰符,任何地方可访问。private:仅在声明类或文件内可访问。protected:在声明类及其子类中可访问。internal:在同一个模块内可访问。