Kotlin 类(构造参数)

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


从这里可以看到

  • 第一执行的是主构造参数,
  • 其次就是属性赋值,
  • 第三就是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()
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值