java 中的父类默认都是 可以继承的,所以我们在写 BaseActivity 或者 BaseFragment 的时候都要慎重的设计,因为一不小心 就会让子类实现很多没有的类。所以 kotlin中 的方法默认都是 final ,如果需要子类继承就要特地标记 open 修饰符。
class MeButton : Clicker{
override fun click() { // 实现 Clicker 方法 默认 为open 可继承
println(“not implemented”)
}
fun dieable(){} // 默认为 final
open fun openClass(){} // 明确表明 为open 可继承
}
如果是实现 基类的方法 或者 接口的方法,默认是open 的,如果希望改变,可以自己添加修饰符 final 。
Kotlin 中所有类都有一个共同的超类 Any,这对于没有超类型声明的类是默认超类
2.2 继承属性
继承属性和继承函数差不多,在父类中声明然后在子类中重新声明的属性必须以 override 开头,并且它们必须具有兼容的类型。每个声明的属性可以由具有初始化器的属性或者具有 getter 方法的属性覆盖。 注意: var 属性可以继承自一个 val 属性 ,反之则不可以。(var 属性不能 让val 继承 )
interface Foo {
val count: Int
}
class Bar1(override val count: Int) : Foo
class Bar2 : Foo {
override var count: Int = 0
}
上述代码,我们在主构造函数中也可以使用 override 。
2.3 abstract
我们通过一段代码 来了解一下 abstract
// 抽象类,不能创建实例
abstract class abClas{
// 抽象方法 默认就是open(此处省略) 不能实例,必须继承实现
abstract fun ab1()
//抽象类中的 方法 不是默认open的,所以需要标明
open fun ab2(){}
fun ab3(){}
}
其他地方和 java 的都比较相似,这里就不多赘述
2.4 重载函数
由于在Java中是没有默认值参数的概念,当我们需要从Java中调用Kotlin中的默认值重载函数的时候,必须显示的指定所有参数值。但是这个绝对不是我们想要,否则Kotlin就失去了重载的意义了不能和Java完全互操作。所以在Kotlin给出了另一个方案就是使用**@JvmOverloads**注解这样就会自动生成多