Moosphan/Android-Daily-Interview

2019-11-04:谈谈kotlin中的构造方法?有哪些注意事项?

Moosphan opened this issue · 2 comments

2019-11-04:谈谈kotlin中的构造方法?有哪些注意事项?

一、概要简述

  1. kotlin中构造函数分为主构造次级构造两类
  2. 使用关键词constructor标记构造函数,部分情况可省略
  3. init关键词用于初始化代码块,注意与构造函数的执行顺序,类成员的初始化顺序
  4. 继承,扩展时候的构造函数调用逻辑
  5. 特殊的类如data classobject/componain objectsealed class等构造函数情况与继承问题
  6. 构造函数中的形参声明情况

二、详细说明

  • 主/次 构造函数

    1. kotlin中任何class(包括object/data class/sealed class)都有一个默认的无参构造函数
    2. 如果显式的声明了构造函数,默认的无参构造函数就失效了。
    3. 主构造函数写在class声明处,可以有访问权限修饰符private,public等,且可以省略constructor关键字。
    4. 若显式的在class内声明了次级构造函数,就需要委托调用主构造函数。
    5. 若在class内显式的声明处所有构造函数(也就是没有了所谓的默认主构造),这时候可以不用依次调用主构造函数。例如继承View实现自定义控件时,三四个构造函数同时显示声明。
  • init初始化代码块

    kotlin中若存在主构造函数,其不能有代码块执行,init起到类似作用,在类初始化时侯执行相关的代码块。

    1. init代码块优先于次级构造函数中的代码块执行。
    2. 即使在类的继承体系中,各自的init也是优先于构造函数执行。
    3. 在主构造函数中,形参加有var/val,那么就变成了成员属性的声明。这些属性声明是早于init代码块的。
  • 特殊类

    1. object/companion object是对象示例,作为单例类或者伴生对象,没有构造函数。

    2. data class要求必须有一个含有至少一个成员属性的主构造函数,其余方面和普通类相同。

    3. sealed class只是声明类似抽象类一般,可以有主构造函数,含参无参以及次级构造等。

  1. Kotlin 中的一个类可以有一个主构造函数以及一个或多个次构造函数。
  2. 如果主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字。
  3. 主构造函数初始化的代码可以放到以 init 关键字作为前缀的初始化块中。