Kotlin面向对象 (3)✔️构造函数

  • 主构造函数
  • 次构造函数
  • 默认构造函数

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) {
    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
    }
}

你可能感兴趣的:(Kotlin面向对象 (3)✔️构造函数)