1.1、kotlin中的接口
它与Java8中的相似:可以包含抽象方法以及非抽象方法的实现,不能包含任何状态。使用interface关键字声明。
接口和实现一个接口
interface Clickable{ fun click() }
class Button :Clickable{ override fun click() = println("clicked")}
冒号代替JAVA中的extends和implements关键字。使用override修饰符是强制要求。
1.2、如果实现的两个接口中有相同方法名的方法,调用时用super<基类>.方法。
例如接口Clickable和Focusable中都有showOff(),调用 super<Clickable>.showOff() super<Focusable>.showOff()
1.3、open、final、abstract修饰符:默认final ------ 控制继承的修饰符
Kotlin中的类和方法默认都是final的,如果你想允许创建子类需要使用open修饰符来标示这个类;允许重写方法,使用open标示方法。abstract类不能被实例化。抽象成员始终是open的。
不需要子类中被重写的类和方法应该显示的标注为final
1.4、可见性修饰符:默认public
可见性修饰符:protected 、private、public 。Java中省略修饰符默认为protected ,而Kotlin中为public 。
private 只在该类(以及它的成员)中可见+
protected 和 private 一样但在子类中也可见
internal 在本模块的所有可以访问到声明区域的均可以访问该类的所有 internal 成员(不同包情况下,protected的成员不能访问,internal成员能访问)
public 任何地方可见
例子:
internal open class TalkativeButton :Focusable{
private fun yell() = println("Hey!")
protected fun whisper() = println("Let's talk !")
fun get(){ val inner = InnerClass() ; inner.str = "100" ;} //错误,不能看到内部类的private成员
class InnerClass{ private val str = "" }
}
/*下面的调用是错误的*/
fun TalkativeButton.giveSpeech(){ //错误
yell() //错误
whisper() //错误
}
//调用
fun talkShow(button : TalkativeButton){
button. giveSpeech()
}
giveSpeech()是扩展函数。TalkativeButton是接收者,他的类型为internal,而giveSpeech是public,Kotlin禁止从public函数去引用低可见的类型。在引用类型时 , 从本例子可见 giveSpeech()和talkShow(button)都和类有关,在可见性上要和类的可见性相同或者低于类的可见性。Kotlin中,protected成员只在类和他的子类中可见,类的扩展函数不能访问它的private和protected成员。一个外部类不能看到其内部类中的private成员 。
1.5、内部类和嵌套类 : 默认嵌套类
Kotlin的嵌套类不能访问外部类的实例,除非你特别地做出了要求。Kotlin中没有显示修饰符的嵌套类和Java中的static嵌套类是一样的。要是嵌套类变为内部类需要使用inner修饰符 。
图1 Java和Kotlin嵌套类和内部类的对应关系
引用外部内需要使用this@类名从Inner类去访问Outer类。
class OuterClass{ inner class Inner{fun getOuterRef() : OuterClass= this@OuterClass}}
1.6、密封类:定义受限的类继承结构
sealed修饰符修饰的父类对可能创建的子类做出了严格的限制,所有的子类必须嵌套在父类中。
package ch04.ex1_5_2_SealedClasses1
sealed class Expr {
class Num(val value: Int) : Expr()
class Sum(val left: Expr, val right: Expr) : Expr()
}
fun eval(e: Expr): Int =
when (e) {
is Expr.Num -> e.value
is Expr.Sum -> eval(e.right) + eval(e.left)
}
}
当你在when中使用sealed类并且添加一个新的子类时,又返回值的when表达式会导致编译失败。
sealed修饰符隐含的这个类是一个open类,不需要再显示添加open。










网友评论