Kotlin 类(构造参数)

kotlin中类是由class声明,kotlin的类声明有三部分, 类名,类头(指定类型参数,主构造函数),类体(花括号),类头和类体都是可选

//全类声明
class NetworkConfig(name: String) {
}

//只有类名
class NetworkConfig
//有类名和类体,没有主构造参数
class NetworkConfig{
}

构造参数

kotlin可以拥有一个主构造函数和多个次构造函数,主构造函数是类头的一部分:它跟在类名(与可选的类型参数)后.

//全类声明
class NetworkConfig constructor(name: String) {
}

其中constructor是可选的,如果主构造函数没有任何注解和可见性修饰符,可以省略constructor

//全类声明
class NetworkConfig (name: String) {
}

在主构造函数中,如果没有声明构造参数的类型,就是默认的val,不可修改,如果想要可以修改可以这样写

//全类声明
class NetworkConfig (var name: String) {
}

次构造参数

在类里也可以声明由constructor的次构造函数:

class NetworkConfig {
    var agent: Int

    constructor(ag: Int) {
        agent = ag
    }
}

如果有主构造函数,那么所有的次构造函数需要直接或者间接委托给主构造函数,
委托到同一个类的另一个构造函数用 this 关键字即可:

class NetworkConfig constructor(var name: String) {
    var agent: Int = 0
    var old: Int = 0

    constructor(ag: Int, name: String) : this(name) {
        agent = ag
    }
    constructor(old: Int, ag: Int, name: String) : this(ag, name) {
        this.old = old
    }
}

this这个字段的作用在这里和java中super有一定相似,但是其实完全不同,

类的属性初始化器

init是kotlin的属性初始化关键字

class NetworkConfig constructor(var name: String) {
    var agent: Int = 0

    constructor(ag: Int, name: String) : this(name) {
        Log.e("TAG", "init2")

        agent = ag
    }
    init {
        Log.e("TAG", "init1")
        agent = 0;
    }
  
}

init中的代码的执行级别是仅次于主构造函数的,在次构造函数之前

class NetworkConfig constructor(var name: String) {
    var agent: Int = 0
    var old: Int = 0
    var old1: String = name
    var ff: Good? = null

    init {
        Log.e("TAG", "init1")
        agent = 0;
    }

    init {
        Log.e("TAG", "init2")
        agent = 0;
    }

    constructor(ag: Int, name: String) : this(name) {
        Log.e("TAG", "init3")
        agent = ag
    }

    constructor(old: Int, ag: Int, name: String) : this(ag, name) {
        Log.e("TAG", "init4")
        this.old = old
    }
}
image

从这里可以看到

  • 第一执行的是主构造参数,
  • 其次就是属性赋值,
  • 第三就是init标识的类的属性初始化器,
  • 第四就是次构造参数
    同时因为对与this关键字的执行顺序也和java中的super一样,先执行this委托的函数

构造函数的默认值

class NetworkConfig  constructor(var name: String = "") {
}

如果一个非抽象类没有声明任何(主或次)构造函数,它会有一个生成的不带参数的主构造函数。构造函数的可见性是 public。如果你不希望你的类有一个公有构造函数,你需要声明一个带有非默认可见性的空的主构造函数:

class NetworkConfig private constructor() {
}

创建类

kotlin 没有 new关键字

        val networkConfig = NetworkConfig(1.0, 5,"bch")
        val networkConfig1 = NetworkConfig()

你可能感兴趣的:(Kotlin 类(构造参数))