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

2019-05-29  本文已影响0人  狼性代码人
  • 主构造函数
  • 次构造函数
  • 默认构造函数

kotlin中的构造函数有主次之分,主构造函数只能有一个,此构造函数可以有多个。

一、主构造函数
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
    }
}
class User constructor(var name: String, var password: String)
// 主构造函数无 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
    }
}
上一篇 下一篇

猜你喜欢

热点阅读