用 Kotlin 写 Android 6—类(I)

2021-05-10  本文已影响0人  jkwen

类的基本用法

在 Kotlin 里,类的声明默认是 public final 的,所以在写一个类上直接 class 开头即可,如果允许类可以被继承,那就要用 open 修饰。Kotlin 这么做主要是遵循了滥用的继承会导致基类的脆弱以及后续不断改造扩充带来的不可维护,也就是说要么为继承做好设计并记录文档,要么禁止这么做,(这出自「Effective Java」)显然 Kotlin 选择后者。此外相比 Java,在继承和实现上的写法没有区别,都用 : 表示。

class TecBook : Book() {}

接口

写法和用法上都和 Java 相似,唯一的区别是 Kotlin 的接口可以有一个默认实现,且不需要任何特殊符号修饰。另外就是如果子类实现多个接口,而多个接口有着相同的方法(不管实现没实现),子类都要重写实现自己的方法。

可见性

同样有着 public, protected, private 还有一个 internal,这个我感觉要在分模块开发的项目中才会用到,普通的或者小型的可以不关心。其他三个修饰符含义和 Java 差不多,但 Kotlin 没有包的概念,所以包适用的可见性在 Kotlin 里没有,protected 只在类和子类中可见,private 只在自己类中可见。另外,扩展函数不能访问 protected 和 private 成员,外部类不能访问内部类,嵌套类的 private 成员。

构造

不像 Java 里定义构造方法那样,Kotlin 里定义类时,可以直接用 () 跟着,里面定义上具体变量就是一个构造方法了,并且这个方法就是主构造方法(这就像定义一个函数一样,区别是要在入参前面带上 var 或者 val 的修饰符才算是类的成员变量,否则仅是方法参数)。

如果针对入参不同,有多种创建类的方式,那么可以用参数默认值的方式,避免了像 Java 那样多个构造方法的现象。

class TecBook(val name: String, val author: String = "xiaoM"): Book(){}

像上面这么写,对于类的成员变量定义是没问题了,但如果想要做初始化操作,或者一些复杂的成员变量不想写在这该怎么办?那就用 init{} 语句块,

class TecBook(val name: String, val author: String = "xiaoM"): Book(){
    init {
    //就像这样,可以在这里进行初始化操作,并且这个语句块可以有多个
    }
}

当然如果非要写多个构造方法,Kotlin 也是支持的,只是其他的就叫从构造方法,相比之下紧跟类名后面的就是主构造方法,如果没有主构造方法,仅有一个或多个从构造方法也是可以的,但要求每个从构造方法必须初始化基类(如果继承了基类的话)

class TecBook: Book {
    constructor(name: String): super(name){
    //就像这样,以 constructor 作为方法名的就是构造方法,因为这里只有从构造方法,所以要调用基类的构造方法,这和 Java 的用法类似
    }
}

内部类和嵌套类

在 Java 中有两种比较常见的用法(内部类和静态内部类),相关的类可能会写在一个 Java 文件里,而在 Kotlin 里,实现上会有所区别。如果仅仅是想物理关联两个类,那就用嵌套类,这也是默认表示。嵌套类不会持有外部类的对象引用,而如果想要持有外部类对象引用就要使用内部类,用 inner 声明。

上一篇下一篇

猜你喜欢

热点阅读