class Student {
var sno = “”
var grade = 0
}
在Kotlin中任何一个非抽象类默认都是不可以被继承的,相当于Java中给类声明了final关键字。
Effective Java这本书中明确提到,如果一个类不是专门为继承而设计的,那么就应该主动将它加上final声明,禁止它可以被继承。Kotlin在设计的时候遵循了这条编程规范,默认所有非抽象类都是不可以被继承的。
class前面的open关键字就是在主动告诉Kotlin编译器,这个类是专门为继承而设计的,允许被继承。
为了让Student可以继承Person,在Person类的前面加上open关键字:
open class Person {
…
}
要让Student类继承Person类。在Java中继承的关键字是extends,而在Kotlin中变成了一个冒号,写法如下:
class Student : Person() {
var sno = “”
var grade = 0
}
为什么Person类的后面要加上一对括号呢?构造函数的原因。
四 构造函数
======
Kotlin将构造函数分成两种:主构造函数和次构造函数。
4.1 主构造函数
主构造函数是最常用的构造函数:每个类默认都会有一个不带参数的主构造函数,当然你也可以显式地给它指明参数。
主构造函数的特点是没有函数体,直接定义在类名的后面即可。比如下面这种写法:
class Student(val sno: String, val grade: Int) : Person() {
}
这里我们将学号和年级这两个字段都放到了主构造函数当中,这就表明在对Student类进行实例化的时候,必须传入构造函数中要求的所有参数。比如:
val student = Student(“a123”, 5)
主构造函数没有函数体,如果我想在主构造函数中编写一些逻辑,该怎么办呢?Kotlin给我们提供了一个init结构体,所有主构造函数中的逻辑都可以写在里面:
class Student(val sno: String, val grade: Int) : Person() {
init {
println("sno is " + sno)
println("grade is " + grade)
}
}
继承特性的规定,子类的构造函数必须调用父类的构造函数。Kotlin在继承的时候通过括号来指定子类的主构造函数调用父类中的哪个构造函数(没有主构造函数就不需要):
class Student(val sno: String, val grade: Int) : Person() {
}
这里,Person类后面的一对空括号表示Student类的主构造函数在初始化的时候会调用Person类的无参数构造函数,即使在无参数的情况下,这对括号也不能省略。
而如果我们将Person改造一下,将姓名和年龄都放到主构造函数当中,如下所示:
open class Person(val name: String, val age: Int) {
…
}
此时你的Student类一定会报错,这里出现错误的原因也很明显,Person类后面的空括号表示要去调用Person类中无参的构造函数,但是Person类现在已经没有无参的构造函数了,所以就提示了上述错误。