快速入门Kotlin(2)
继承
Kotlin的类默认是不能继承的,需要添加open
关键字才可以继承
1 | open classs Person(){ |
而在继承的时候则通过:XXX()
来继承,比如:
1 | class Student:Person(){ |
构造函数
kotlin有主构造函数和次构造函数的区别
主构造函数体
主构造函数是没有函数体的,直接在类名之后定义,如:
1 | class Student(val sno:String , val grade:Int){ |
如你想指定在构造时的额外逻辑,使用init
1 | class Student(val sno:String , val grade:Int){ |
遵循Java的规定:子类构造函数必须调用父类构造函数,因此我们在继承的时候写的是 :XXX()
值得注意的是,当我们继承的父类有有参构造的时候,我们必须在继承的时候处理这件事
而此时,用于构造的函数不需要添加val或者var,让他们的活动域就在构造函数中即可,比如:
1 | class Student(val sno:String , val grade:Int,name:String, age:Int):Person(name,age){ |
注意这里的 name 和 age
次构造函数
任何一个类只能有一个主构造函数,但是可以有多个次构造函数
次构造函数也可以被用于实例化一个类,并且它是有构造体的
Kotlin规定,当一个类既有主构造函数又有次构造函数的时候,所有的次构造函数都需要调用主构造函数(含间接调用)
次构造函数通过constructor
关键字进行定义
例子:
1 | class Student(val sno : String , val grade : Int , name:String , age:Int) : |
这里此构造函数中调用了this,是间接调用了主构造函数,因此是合法的
第一个次构造函数调用的this是主构造函数,第二个次构造函数调用的是前一个次构造函数
特殊情况
特殊情况下,Kotlin允许有次构造函数但是没有主构造函数
若是这样,继承的时候就不需要()了,因为子类构造函数必须调用父类构造函数,而此时这里并没有主构造函数
既然没有主构造函数了,那么就没必要加括号了
1 | class Student : Person { |
另外,此时因为没有主构造函数,因此次构造函数中的this自然而然变成了super
接口
在Kotlin中,因为统一使用了冒号,因此也不需要所谓implements来连接接口,直接使用逗号隔开
和Java一样,一个类只能有单个继承,但可以有多个接口。接口没有构造函数,因此不需要冒号
在类中,使用override1
关键字来达到重写父类函数或者实现接口的目的
1 | interface Study { |
在JDK1.8之后和Kotlin中,允许对接口中定义的函数进行默认实现
1 | interface Study { |
函数可见性修饰符异同
private:当前类可见
public: 默认的,对所有类可见,不过在Kotlin中,public是默认项
protected:对当前类和子类都可见(Java中是对单曲类、子类、同一包路径下的类都可见)
internal:对同一模块中的类可见
数据类与单例类
数据类
在Kotlin中,只要在类的头部写下data
关键字就表明你希望这一个类是数据类
此时Kotlin就会根据主构造函数中的参数自动帮你重写equals(),hashCode(),toString(),hashCode()
另外,当一个类中没有任何代码时,还可以将尾部的大括号省略
单例类
在Kotlin中,只需要将class关键字改成object关键字即可
1 | object Singleton(){ |