接口
kotlin中的接口与java8相似,可以包含抽象方法的定义以及非抽象方法的实现,但是不能包含任何状态。kotlin中使用interface关键字而不是class来声明。
声明简单接口
interface Clickable{
fun click()
}
所有实现这个接口的非抽象类都需要提供这个方法的一个实现。
实现该简单接口
class Button : Clickable{
override fun click() = println("I was clicked")
}
Kotlin在类名后使用:代替extends和implements关键字。和java一样,一个类可以实现多个接口但是只能继承一个类。在Kotlin中,override修饰符用来标注被重写的父类或者接口的方法和属性。与java不同的是,在kotlin中使用override修饰符是强制要求的。
接口的方法可以有一个默认实现,并且不需要标注default关键字。在上述接口中,添加一个带方法体的方法。
interface Clickable{
fun click()
fun showOff() = println("I'm clickable!")
}
使用某个类实现这个接口时,必须提供click方法的实现,可以重新定义showOff方法的实现也可以不更改直接调用。
类
- open、final和abstract修饰符:默认为final
java允许创建任何类的子类并重写任何方法(除了显示的final关键字)而kotlin中则默认使用final,不加修饰符就不能被重写。
kotlin中需要使用open修饰符来显式的表示该类可创建子类。也可以用open修饰符来修饰可以被重写的方法和属性。
//该类可以被继承
open class Button : Clickable{
fun disable(){} //该函数不可在子类中被重写
open fun animate() {} //该函数可以在子类中重写
override fun click() {}
//该函数重写了一个open函数,并且它本身同样是open的。也就是该函数仍可在子类中被重写。
}
abstract修饰符是同java一样都是修饰抽象类的。抽象类中包含一些没有实现并且必须在子类重写的抽象成员,抽象成员始终是open的,所以不需要显式地使用open修饰符。抽象成员是不可以在抽象类中有具体实现的。
abstract class Animated{
abstract fun animate() //该函数必须被子类重写
open fun stopAnimating() {} //抽象类中的非抽象函数并不是默认open的,但是可以标注为open
fun animateTwice(){}
}
- 可见性修饰符:默认public
修饰符 | 类成员 | 顶层声明 |
public | 所有地方可见 | 所有地方可见 |
internal | 模块中可见 | 模块中可见 |
protected | 子类中可见 | - |
private | 类中可见 | 文件中可见 |
internal可见性的优势在于它是提供了对模块实现细节的真正封装。
protected修饰符在java和kotlin中不同的行为,java中可以允许同一个包的类访问protected成员 但在kotlin中 只有类和它的子类成员才可以访问protected函数。类的扩展函数也不能访问它的private和protected成员。
- 构造类(类的构造函数)
class User(val nickname:String)
val意味着相应的属性会用构造方法的参数来初始化。在kotlin中,如果一个类未指定构造函数。那么在新建该类时,需要显式的调用该类的主构造方法。即在类名称后加()。
类中可以使用constructor来声明从构造方法。
open class View{
constructor(ctx:Context){ //从构造方法,该函数未声明主构造方法。(没有括号)
}
}
对象
- "object"关键字
kotlin中使用object声明对象。一个对象声明在定义的时候就立即创建了,不需要在其他地方调用构造方法。因此在对象声明中不允许存在构造方法。对象声明可以继承自类和接口。
object roll{
fun caculateSalary(){
}
}
与变量一样,对象声明是允许你用对象名和.字符来调用的。调用时代码如下:
roll.calculateSalary()