每天学一点 Kotlin -- 类的进阶:修饰符

----《第一季Kotlin崛起:次世代Android开发 》学习笔记

总目录:每天学一点 Kotlin ---- 目录
上一篇:每天学一点 Kotlin -- 类的进阶:接口
下一篇:每天学一点 Kotlin -- 类的进阶:扩展

1. 修饰符

1.1 在 Kotlin 中,修饰符有:open/final,private/protected/internal/public

1.2 open/final:一个类能不能被继承。

1.3 private/protected/internal/public:一个类中或 Kotlin 文件中的变量或方法能不能被其他类或其他 Kotlin 文件访问。

2. open/final

2.1 一个类在类的定义前加上 open 修饰符才可以被继承。如果没有加 open 关键字,那么默认是 final,即不可被继承的。

2.2 被 open 修饰的类中只有被 open 修饰的属性或方法才可以被子类重写,如果在属性或方法前没有加 open 关键字,那么默认是 final,是不可被覆盖重写的。

2.3 在子类中覆盖重写父类中的属性或方法是,需要使用关键字 override 修饰。

2.4 子类中重写了父类的属性或方法,那么此时子类中的属性或方法没有加 open 关键字,子类的子类也是可以重写的,也就是 override 默认是 open 的。如果不想被子类的子类进行重写,需要显示用 final 修饰。 举个栗子:

class ModifierSmallStudent : ModifierStudent() {
    override var name: String = "small student-name"
    // override var age: Int = 8  // 报错了,不能重写
    override var studentId: Int = 100

    override fun printInfo() {
        super.printInfo()
        println("I am a small student")
    }
}

open class ModifierStudent : ModifierPerson() {
    override var name: String = "student-name"
    final override var age: Int = 10;

    open var studentId: Int = 0;

    override fun printInfo() {
        super.printInfo()
        println("student id = ${studentId}")
    }
}

open class ModifierPerson {
    open var name: String = ""
    open var age: Int = 0;
    open fun printInfo() = println("name: ${name}, age = ${age}")
}

2.5 在 Kotlin 中,接口不需要加上 open 修饰符。接口本身和它内部的方法和属性都是默认加上 open 修饰符的,而普通类默认是加上 final 修饰符。而且在接口中也不能手动加上 final 修饰符,因为接口的作用就是为了抽象,如果不能被赋值或实现,那么接口就没用了。

3. private/protected/internal/public

3.1 这4个修饰符为可见性修饰符。
(1) 如果用 private 修饰,那么只能在这个类的内部(包含其所有成员)可见;
(2) 如果用 protected 修饰,不但可以在类内部可见,在子类中也可见;
(3) 如果用 internal 修饰,则类声明的本模块内的客户端都可见(模块的概念同 Java 中包的概念);
(4) 如果用 public 修饰,则任何地方可见。

3.2 在类的外部如何访问 private 修饰的属性,很简单,提供一个对外的方法就可以了。原理同 Java 中的 getter 和 setter 方法。

3.3 在 Kotlin 中,如果没有显示指定 private/protected/internal/public 这几个修饰符,那么默认是 public。

3.4 上面的四种可见性修饰符不仅可以用在类中,也可以用在全局变量中,即在 Kotlin 文件中也是可以的。

相关代码:https://gitee.com/fzq.com/test-demo

你可能感兴趣的:(每天学一点 Kotlin -- 类的进阶:修饰符)