Kotlin语言的次构造函数
Kotlin 中的继承
1 2 3 | open class People { } |
Java 中类是可以默认继承的,但是 Kotlin 不一样。如果想要在 Kotlin 中的类被继承,那么需要使用关键字 open。
1 2 3 | class Student : People() { } |
Java 中继承使用 extends,Kotlin 中继承使用 " : " 来处理。Java 中类继承不需要括号, Kotlin 中类继承需要括号。
主构造函数
- 父类无参构造函数
1 2 3 4 | //不带参数 class Student (): People() { } |
每个类有个默认不带参数的主构造函数。
主构造函数的特点-> 没有函数体,直接定义在类名后。
1 2 3 4 | //带参数 class Student(sno: String, grade: Int) : People() { } |
Java 和 Kotlin 一样,子类的构造函数必须调用父类的构造函数。
上面代码中 Student 类初始化主构造函数时候会调用 People 类的无参主构造函数,即使没有参数也不能省略,所以这也是 Kotlin 中继承类有括号的原因。
- 父类有参构造函数
1 2 3 | class Student(sno: String, grade: Int, name: String, age: Int) : People(name, age) { } |
当父类主构造函数带参数时,由于子类必须实现父类主构造函数,所以可以在子类的主构造函数中加入父类构造函数需要的参数。
次构造函数
1 2 3 4 5 6 7 8 9 10 11 | class Student(sno: String, grade: Int, name: String, age: Int) : People(name, age) { constructor(name: String, age: Int) : this("", 0, name, age) { } constructor() : this("", 0) { } } |
1-> 次构造函数通过 constructor 关键字定义
2-> Kotlin 规定所有次构造函数必须调用主构造函数
有没有很像 Java 中的重载
- 特殊情况,子类和父类都没有构造函数
1 2 3 4 5 6 7 8 9 10 11 12 | class Students : Persons { constructor(name: String, age: Int) : super(name, age) { } } open class Persons { constructor(name: String, age: Int) { } } |
子类没有主构造函数所以不用带括号,同理父类也是一样。
this 关键字和 super 关键字也会比较好理解。