Kotlin 全面学习之路 (四) -- 类与构造器

1、类声明

class People { ... }

类声明由 class 关键字类名类头(指定类型参数、主构造器等)由花括号包围的 类体 构成,其中类头和类体是可选。

class People

2、构造函数

在 Kotlin 中一个类可以有 一个主构造函数多个次构造函数

2.1 主构造函数

主构造器是类头的一部分,在类名与可选参数后:

class People constructor (name: String) { ... }

如果主构造函数 没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字,反之,constructor 关键字不可以被省略。

//constructor 可以被省略
class People (name: String) { ... }

//constructor 不可以被省略
class public @Inject People (name: String) { ... }

2.2 初始化块

由于主构造器不可以含有任何代码,初始化代码可以放在 init 初始化块 中。

class People(var name: String) {
    init {
        name = "Mike"
    }

    init {
        name = name.toUpperCase()
    }
}

如果类体中存在多个 init 代码块,那么其执行顺序和其在类体中的顺序一致。

2.3 次构造函数

类体中可以声明以 constructor 为前缀的次构造函数。

class People{
  constructor{
    ....
  }
}

如果类存在主构造函数,那么每个次构造函数需要直接 委托给主构造函数,或者通过其他次构造函数间接 委托给主构造函数

class People(var name: String){
  init{
    name = "Mike"
  }

  constructor(name: String, age: Int):this(name){
    ....
  }
}

2.4主构造函数、初始化块、次构造函数的执行顺序

代码示例:

class People(var name: String) {
    init {
        println(name)
    }

    init {
        name = name.toUpperCase()
        println(name)
    }

    constructor(name: String, age: Int, sex: String) : this(name, age) {
        println("the age of $name is $age is $sex")
    }

    constructor(name: String, age: Int) : this(name) {
        println("the age of $name is $age")
    }

}

Main 中的调用:

val people = People("mike",34,"man")

可以看到我们仅仅是初始化了一个变量 – people, 没有做其他操作。其打印日志如下:

mike
MIKE
the age of mike is 34
the age of mike is 34 is man

从上面的打印日志我们可以发现

  1. 初始化块优先于次构造函数执行
  2. 初始化块间的执行顺序和其在类体中的顺序一致
  3. 次构造函数之间的执行顺序和其依赖关系一致。

其原因如下:

初始化块中的代码实际上会成为主构造函数的一部分,它委托给主构造函数
会作为次构造函数的第一条语句,因此所有初始化块中的代码都会在次构造函数体
之前执行。即使该类没有主构造函数,这种委托仍会隐式发生,并且仍会执行初始
化块。

class People{
init{
....
}
}

2.5 默认主构造函数

一个非抽象而且没有声明任何构造函数的类,它会默认生成一个不带参数的主构造函数,其可见性默认为 public 。如果你不希望你的类有一个公有的构造函数,你可以显式的声明该主构造函数为 private

class People private constructor(){
  ....
}

猜你喜欢

转载自blog.csdn.net/Strange_Monkey/article/details/82626195
今日推荐