- 主构造函数
- 次构造函数
- 默认构造函数
kotlin中的构造函数有主次之分,主构造函数只能有一个,此构造函数可以有多个。
一、主构造函数
- 主构造函数在类头中或类名后面声明,使用关键字 constructor 。主构造函数本身不能包含代码,所以需要借助于初始化代码块,在 init 代码块中可以进行主构造函数需要的初始化处理。
class Rectangle constructor(w: Int, h: Int) {
var width: Int = 0
var height: Int = 0
var area: Int = 0
init {
width = w
height = h
area = w * h
}
}
- 属性可以与主构造函数合并,这样函数体中就不需要属性声明了。
class Rectangle constructor(var width: Int, var height: Int) {
var area: Int = 0
init {
area = width * height
}
}
- 如果所有的属性都在主构造函数中初始化,可以省略 init 代码块。如果类型没有代码 { } 也可以省略。
class User constructor(var name: String, var password: String)
- 当主构造函数没有注解 (Annotation) 或可见性修饰符, constructor 关键字可以省略。
// 主构造函数无 annotation 和 可见修饰符
class User(var name: String, var password: String)
// 主构造函数有可见修饰符
class Grade private constructor(val a: Int, var b: User)
- 主构造函数与普通构造函数类似,可以声明带有默认值的参数,这样一来虽然只有一个主构造函数,但调用时可以省略一些参数,类似于多个构造函数重载。
class User(var name: String = "小三", var password: String = "123")
fun main(args: Array<String>) {
var user1 = User()
var user2 = User("小五")
var user3 = User("小五", "456")
var user4 = User(password = "789")
var user5 = User(password = "789", name = "小五")
}
二、次构造函数
由于主构造函数只能有一个,而且初始化时只有 init 代码块,有时候不够灵活,这时可以使用次构造函数。次构造函数是在函数体中声明的,使用关键字 constructor
声明,此构造函数需要调用主构造函数初始化部分属性。
class Rectangle(var width: Int, var height: Int) {
var area: Int = 0
init { // 无论调用主次构造函数,都会执行
area = width * height
Log.e("Rectangle", "执行 init 初始化代码块")
}
constructor(width: Int, height: Int, area: Int): this(width, height) {
this.area = area
}
constructor(area: Int): this(50, 100) {
this.area = area;
}
override fun toString(): String {
return "width=$width height=$height area=$area"
}
}
三、默认构造函数
如果一个非抽象类中根本看不到任何的构造函数,编译器会为其生成一个默认的构造函数,即: 无参数 public 的主构造函数。
// 默认构造函数
class User {
val username: String?
val password: String?
init {
username = null
password = null
}
}
网友评论