继承

Kotlin的类默认是不能继承的,需要添加open关键字才可以继承

1
2
3
open classs Person(){
...
}

而在继承的时候则通过:XXX()来继承,比如:

1
2
3
class Student:Person(){
...
}

构造函数

kotlin有主构造函数次构造函数的区别

主构造函数体

主构造函数是没有函数体的,直接在类名之后定义,如:

1
2
3
class Student(val sno:String , val grade:Int){
...
}

如你想指定在构造时的额外逻辑,使用init

1
2
3
4
5
class Student(val sno:String , val grade:Int){
init{
println("OK")
}
}

遵循Java的规定:子类构造函数必须调用父类构造函数,因此我们在继承的时候写的是 :XXX()

值得注意的是,当我们继承的父类有有参构造的时候,我们必须在继承的时候处理这件事
而此时,用于构造的函数不需要添加val或者var,让他们的活动域就在构造函数中即可,比如:

1
2
3
class Student(val sno:String , val grade:Int,name:String, age:Int):Person(name,age){
...
}

注意这里的 name 和 age

次构造函数

任何一个类只能有一个主构造函数,但是可以有多个次构造函数
次构造函数也可以被用于实例化一个类,并且它是有构造体的

Kotlin规定,当一个类既有主构造函数又有次构造函数的时候,所有的次构造函数都需要调用主构造函数(含间接调用)
次构造函数通过constructor关键字进行定义
例子:

1
2
3
4
5
6
7
8
9
10
class Student(val sno : String , val grade : Int , name:String , age:Int) : 
Person(name,age){
constructor(name:String , age:Int):this("",0,name,age){

}

constructor():this("",0){

}
}

这里此构造函数中调用了this,是间接调用了主构造函数,因此是合法的
第一个次构造函数调用的this是主构造函数,第二个次构造函数调用的是前一个次构造函数

特殊情况

特殊情况下,Kotlin允许有次构造函数但是没有主构造函数
若是这样,继承的时候就不需要()了,因为子类构造函数必须调用父类构造函数,而此时这里并没有主构造函数
既然没有主构造函数了,那么就没必要加括号了

1
2
3
4
5
class Student : Person {
constructor(name:String , age: Int ) : super(name,age){

}
}

另外,此时因为没有主构造函数,因此次构造函数中的this自然而然变成了super

接口

在Kotlin中,因为统一使用了冒号,因此也不需要所谓implements来连接接口,直接使用逗号隔开
和Java一样,一个类只能有单个继承,但可以有多个接口。接口没有构造函数,因此不需要冒号
在类中,使用override1关键字来达到重写父类函数或者实现接口的目的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface Study {
fun readBooks()
fun doHomrwork()
}

class Student(name:String , age :Int) : Person(name,age),Study {
override fun readBooks() {
...
}

override fun doHomework(){
...
}
}

在JDK1.8之后和Kotlin中,允许对接口中定义的函数进行默认实现

1
2
3
4
5
6
interface Study {
fun readBooks()
fun doHomework() {
println("doHomework");
}
}

函数可见性修饰符异同

private:当前类可见
public: 默认的,对所有类可见,不过在Kotlin中,public是默认项
protected:对当前类和子类都可见(Java中是对单曲类、子类、同一包路径下的类都可见)
internal:对同一模块中的类可见

数据类与单例类

数据类

在Kotlin中,只要在类的头部写下data关键字就表明你希望这一个类是数据类
此时Kotlin就会根据主构造函数中的参数自动帮你重写equals(),hashCode(),toString(),hashCode()

另外,当一个类中没有任何代码时,还可以将尾部的大括号省略

单例类

在Kotlin中,只需要将class关键字改成object关键字即可

1
2
3
object Singleton(){

}