原文: https://beginnersbook.com/2019/03/kotlin-visibility-modifiers/

可见性修饰符将类,接口,函数,属性,构造函数等的访问限制到某个级别。在 kotlin 中,我们有四个可见性修饰符 - 公共,私有,受保护和内部。在本指南中,我们将借助示例了解这些可见性修饰符。

Kotlin 可见性修饰符

  • public:在任何地方都可见,这是 Kotlin 中的默认可见性修饰符,这意味着如果你没有指定修饰符,它默认是公共的。
  • private:包含声明的文件内可见。如果数据成员或成员函数在类中声明为private,则它们仅在类中可见。
  • protected:内部类和子类可见。
  • internal:在同一模块内可见。

让我们举个例子。在下面的示例中,我们有一个文件Example.kt,我们已经在文件中声明了一个数据成员,几个成员函数和一个类。注释中提到了每一个的可见性。

  1. // file name: Example.kt
  2. package beginnersbook.com
  3. // public so visible everywhere
  4. var str = "BeginnersBook"
  5. // By default public so visible everywhere
  6. fun demo() {}
  7. // private so visible inside Example.kt only
  8. private fun demo2() {}
  9. // visible inside the same module
  10. internal fun demo3() {}
  11. // private so visible inside Example.kt
  12. private class MyClass {}

Kotlin 可见性修饰符示例

在这个例子中,我们有两个类Parent类和Child类。我们在示例中使用了所有四种类型的可见性修饰符,请通过注释来了解当前类和子类中每个数据成员和成员函数的可见性。

  1. // file name: Example.kt
  2. package beginnersbook.com
  3. open class Parent() {
  4. // by default public
  5. var num = 100
  6. // visible to this this class only
  7. private var str = "BeginnersBook"
  8. // visible to this class and the child class
  9. protected open val ch = 'A'
  10. // visible inside the same module
  11. internal val number = 99
  12. // visible to this class and child class
  13. open protected fun demo() { }
  14. }
  15. class Child: Parent() {
  16. /* num, ch, number and function demo() are
  17. * visible in this class but str is not visible.
  18. */
  19. override val ch = 'Z'
  20. override fun demo(){
  21. println("demo function of child class")
  22. }
  23. }
  24. fun main(args: Array<String>) {
  25. /* obj.num and obj.number are visible
  26. * obj.ch, obj.demo() and obj.str not visible
  27. */
  28. val obj = Parent()
  29. /* obj2.ch and obj2.demo() are not visible because if
  30. * you override protected members in child class without
  31. * specifying modifier then they are by default protected
  32. */
  33. val obj2 = Child()
  34. }