Kotlin构造函数

141 阅读2分钟

java构造函数

public class JavaPerson {
    int age;
    String name;

    public JavaPerson(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public JavaPerson(int age){
        this(age,"person");
    }
}

kotlin构造函数

在kotlin中有两种类型的构造函数:

  • 主构造函数(主构造器)
  • 次级构造函数(次级构造器)

在Kotlin类中只有一个主构造函数(主构造器),而辅助构造函数(次级构造器)可以是一个或者多个.

Kotlin主构造函数

主构造函数用于初始化类,它在类标题中声明

class 类名 constructor(参数1,参数2) {
}

主构造函数不包含任何代码,初始化程序块用于初始化代码

class Person constructor(name: String, age: Int) {
    val name: String
    val age: Int

    init {
        this.name = name
        this.age = age
    }
}

kotlin中通过constructor关键字标明构造函数,对于主构造函数来说,它的位置在类的标题中声明,而对于次级构造函数来说它的位置在类中.

当constructor关键字没有注解和可见性修饰符修饰时,上面的构造函数关键字可省略

class Person(name: String, age: Int) {
    val name: String
    val age: Int

    init {
        this.name = name
        this.age = age
    }
}

如果构造函数需要私有化时,此时constructor关键字则不可省略.

class Person private constructor(name: String, age: Int) {
    val name: String
    val age: Int

    init {
        this.name = name
        this.age = age
    }
}

而上面的代码在idea编辑中,一直存在黄色警告.

image.png

class Person private constructor(val name: String, val age: Int) {
}

当我们定义一个类并没有声明一个主构造函数的时候,kotlin会默认为我们生成一个无参的主构造函数.

kotlin 次级构造函数

kotlin在类中可以创建一个或者多个次级构造函数,并且使用constructor关键字创建次级构造函数

class Person {

    private val name: String
    private val age:Int

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

    }
}

我们可以在同一类中使用主构造函数和次级构造函数.通过在一个类中使用主和次级构造函数,次级构造函数需要授权给主构造函数,也就是次级构造函数会直接或者间接调用主构造函数.

使用this()关键字对同一个类中的另一个构造函数进行授权.

class Person(name:String) {

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

在kotlin中还可以用一个次级构造函数调用同一个类的另一个次级构造函数.

class Person(name:String) {

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

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

在kotlin中,子类的次级构造函数可以调用父类的次级构造函数,使用super关键字完成,属于继承.

open class Person(name: String) {

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

    }

    constructor(name: String, age: Int, sex: String) : this(name, age) {

    }
}

class Man : Person {
    constructor(name: String, age: Int) : super(name, age) {

    }

    constructor(name: String, age: Int, sex: String) : super(name, age, sex) {}
    
}