Kotlin学习系列(六)Kotlin可见性说明

2019-05-05  本文已影响0人  Fakecoder_Sunis

本系列内容均来自《Kotlin从小白到大牛》一书,感谢作者关东升老师。
Kotlin可见性有4种: 公有、 内部、 保护和私有。 具体规则如下表所示。

Kotlin可见性修饰符使用规则
Kotlin语言的可见性修饰符与Java等语言有比较大的不同。 首先Kotlin语言中函数和属性可以是顶层声明也可以是类成员声明。 其次, Kotlin中没有Java中包私有可见性, 而具有模块可见性( internal) 。

1 可见性范围

首先, 需要搞清楚可见性范围, 可见性范围主要有三个: 模块、 源文件和类。 其中源文件和类很好理解, 下面重点介绍一下模块的概念。
模块就是多个文件编译在一起的集合, 模块可以指如下内容:
一个IntelliJ IDEA模块( module)

2 公有可见性

公有可见性使用public关键字, 可以修饰顶层函数和属性, 以及类成员函数和属性, 所有被public修饰的函数和属性在任何地方都可见。如果没有可见性修饰符修饰,默认看见性为public

3 内部可见性

内部可见性使用internal关键字, 在同一个模块内部与public可见性一样。 如果在模块module1中访问module1中的Person类。示例代码如下:

class Person(val name: String,// 名字
             private val birthDate: Date,// 出生日期
             internal val age: Int) // 年龄
{
    internal fun display() {
        println("[name:$name, birthDate:$birthDate, age:$age]")
    }
}
fun main(args: Array<String>) {
    val now = Date()
    val person = Person("Tony", now, 18)
    println(person.name)
    println(person.age)
// println(person.birthDate)//不能访问birthDate属性
    person.display()
}

从上述代码中可见, age属性和display()函数都可以访问, 它们都声明为internal,当前访问代码与Person都在同一个模块中, 所以可以访问它们。 而birthDate属性不能访问, 这是因为birthDate是private的.

4 保护可见性

保护可见性使用protected关键字, protected可以保证某个父类的子类都能继承该父类的protected属性和函数。 无论父类和子类是否在同一个模块中, 父类的protected属性和函数都可以被子类继承。
如果有一个父类ProtectedClass代码如下:

open class ProtectedClass {
    protected var x: Int = 0 
    init {
        x = 100
    }
    protected fun printX() {
        println("Value Of x is " + x)
    }
}

继承ProtectedClass类的子类SubClass代码如下:

class SubClass : ProtectedClass() {
    fun display() {
        printX() //printX()函数是从父类继承过来 ①
        println(x) //x属性是从父类继承过来 ②
    }
}

5 私有可见性

私有可见性使用private关键字, 当private修饰类中的成员属性和函数时, 这些属性和函数只能在类的内部可见
当private修饰顶层属性和函数时, 这些属性和函数只能在当前文件中可见

class PrivateClass { 
    private var x: Int = 0 
    private fun printX() { 
        println("Value Of x is" + x)
    } 
    fun display() { 
        x = 100
        printX()
    }
}

调用PrivateClass代码如下:

private var x: Int = 0 
private fun printX() {
    
    println("Value Of x is" + x)
}

fun main(args: Array<String>) {
    val p = PrivateClass() 
// p.printX() //PrivateClass中printX()函数不可见 ④
// p.x //PrivateClass中x属性不可见 ⑤
    println(x) 
    printX() 
}
上一篇 下一篇

猜你喜欢

热点阅读