目录
3.1 接口
interface Clickable {
//抽象方法
fun click()
//非抽象方法
fun showOff() = println(" i am clickable")
}
class Button : Clickable{
override fun click() {
//在Kotlin中override修饰符是强制要求的
TODO("Not yet implemented")
}
override fun showOff() {
super.showOff()
}
}
如上为接口的定义和它的实现类
如果一个类实现了两个接口,并且两个接口中有相同的方法(无论是抽象方法还是非抽象方法),这时必须在类中显式实现这个方法。
如下:
interface Clickable {
//抽象方法
fun click()
//非抽象方法
fun showOff() = println(" i am clickable")
}
interface Focusable {
//非抽象方法
fun showOff() = println(" i am Focusable")
}
class Button : Clickable,Focusable{
override fun click() {
//在Kotlin中override修饰符是强制要求的
println("in click")
}
override fun showOff() {
//此时必须显式实现此方法,否则编译错误。
super<Focusable>.showOff() //使用尖括号加上父类型名字的“super”表面你想要调用哪一个父类的方法
}
}
注意:
- Kotlin并不支持接口中的默认方法,它会把每个带默认方法的接口编译为一个普通接口和一个将方法体作为静态函数的类的结合体。接口中只包含声明,类中包含了以静态方法存在的所有实现。
- java中接口中不能定义非抽象方法。
3.2 open,final和abstract修饰符:默认为final
注意:没有特别需要在子类中被重写的类和方法应该被显式的标注为final
open:
- 如果类用open修饰符标识:其他类可以继承它
- 如果方法用open修饰符标识:可以在子类中重写它。
- 如果重写了一个基类或者接口的成员,重写的成员同样默认是open的
open class RichButton : Clickable{
fun disable(){
} // 默认为final,子类不能重写
open fun animate(){
} // 子类可以重写
override fun click() {
// 如果重写了一个基类或者接口的成员,重写的成员同样默认是open的
TODO("Not yet implemented")
}
}
abstract:
- 抽象类:这种类不能被实例化。类中包含一些没有实现并且必须在子类重写的抽象成员。抽象成员始终是open的,所以不需要显式的使用open修饰符。
- 抽象方法:在该类中不实现,必须被子类重写。
- 有抽象方法的类一定是的抽象类,但抽象方法不一定在抽象类中。接口中的方法都是抽象方法
- 抽象类中的非抽象函数并不是默认open的,但是可以标注为open
abstract class Animated{
//抽象类
abstract fun animate() //抽象方法
open fun openFun(){
} //抽象类中标注为open的非抽象方法
}
类中的修饰符总结
修饰符 | 相关成员 | 注解 |
---|---|---|
final | 不能被重写 | 类中成员默认使用 |
open | 可以被重写 | 需要明确的表明 |
abstract | 必须被重写 | 只能在抽象类中使用;抽象成员不能有实现 |
override | 重写父类或接口中的成员 | 如果没有使用final表明,重写的成员默认是开放的 |
3.3 声明枚举类
枚举类,enum在Kotlin中是一个软关键字:只有当它出现在class前面时才有特殊的意义
enum class Color {
RED,ORANGE,YELLOW,GREEN,BLUE,INDIGO,VIOLET
}
enum class Colorful(val r : Int, val g : Int, val b : Int){
RED(255,0,0),
ORANGE(255,165,0),
YELLOW(255,255,0),
GREEN(0,255,0),
BLUE(0,0,255),
INDIGO(75,0,130),
VIOLET(238,130,238); //这里必须要有';'
fun rgb() = (r * 256 + g) * 256 + b //给枚举类定义一个方法
}
注意:上面的例子是Kotlin语法中唯一使用分号的地方