天天看点

【Kotlin 学习笔记】kotlin的类、对象和接口基础

接口

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()