2019-11-04:谈谈kotlin中的构造方法?有哪些注意事项?
Moosphan opened this issue · 2 comments
Moosphan commented
2019-11-04:谈谈kotlin中的构造方法?有哪些注意事项?
iOrchid commented
一、概要简述
kotlin
中构造函数分为主构造
和次级构造
两类- 使用关键词
constructor
标记构造函数,部分情况可省略 init
关键词用于初始化代码块,注意与构造函数的执行顺序,类成员的初始化顺序- 继承,扩展时候的构造函数调用逻辑
- 特殊的类如
data class
、object/componain object
、sealed class
等构造函数情况与继承问题 - 构造函数中的形参声明情况
二、详细说明
-
主/次 构造函数
kotlin
中任何class
(包括object/data class/sealed class
)都有一个默认的无参构造函数- 如果显式的声明了构造函数,默认的无参构造函数就失效了。
- 主构造函数写在
class
声明处,可以有访问权限修饰符private,public
等,且可以省略constructor
关键字。 - 若显式的在
class
内声明了次级构造函数,就需要委托调用主构造函数。 - 若在
class
内显式的声明处所有构造函数(也就是没有了所谓的默认主构造),这时候可以不用依次调用主构造函数。例如继承View
实现自定义控件时,三四个构造函数同时显示声明。
-
init
初始化代码块kotlin
中若存在主构造函数,其不能有代码块执行,init
起到类似作用,在类初始化时侯执行相关的代码块。init
代码块优先于次级构造函数中的代码块执行。- 即使在类的继承体系中,各自的
init
也是优先于构造函数执行。 - 在主构造函数中,形参加有
var/val
,那么就变成了成员属性的声明。这些属性声明是早于init
代码块的。
-
特殊类
-
object/companion object
是对象示例,作为单例类或者伴生对象,没有构造函数。 -
data class
要求必须有一个含有至少一个成员属性的主构造函数,其余方面和普通类相同。 -
sealed class
只是声明类似抽象类一般,可以有主构造函数,含参无参以及次级构造等。
-
jingerlovexiaojie commented
- Kotlin 中的一个类可以有一个主构造函数以及一个或多个次构造函数。
- 如果主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字。
- 主构造函数初始化的代码可以放到以 init 关键字作为前缀的初始化块中。