类的继承
这段时间刚从医院回来,,,又过年,就拖到现在才写这里的知识点emmmmmmm尴尬了,总的来说java和kotlin的继承还是蛮像的,就是个别地方有需要主要的地方
超类
超类就是所有的类都继承它,在java中超类是object类,在kotlin里面超类是Any这个就蛮有意思的哈
public open class Any {
// 比较
public open operator fun equals(other: Any?): Boolean
// hashCode()方法:其作用是返回该对象的哈希值
public open fun hashCode(): Int
// toString()方法
public open fun toString(): String
}
这里面看到了Any就三个方法,至于open修饰的问题下面会讲
继承的基本定义+要求
继承就是一个类继承另一个类的方法,变量 然后可以重写,覆盖继承类的方法和变量等等
B类继承A类 就是说A是父类 B是子类
写法: class B : A{} 就是用个:这个符号表示继承
要求
A类必须要用open修饰 要继承的方法和变量必须也要用open修饰
在这里要注意只要你不写open修饰默认都是不能继承的
open class jcDome{
open var name = "猪猪"
open var age = 16
open fun play(){
println("玩耍")
}
open fun eat(){
println("吃饭")
}
}
class Dome : jcDome(){
}
fun main(args: Array<String>) {
var s = Dome()
println(s.age)
s.eat()
s.play()
}
继承的构造函数问题
当B无主构造函数的时候
当实现类无主构造函数时,则每个辅助构造函数必须使用super关键字初始化基类型,或者委托给另一个构造函数。 请注意,在这种情况下,不同的辅助构造函数可以调用基类型的不同构造函数
class MyView : View(){
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
: super(context, attrs, defStyleAttr)
}
当B有主构造函数的时候
当存在主构造函数时,主构造函数一般实现基类型中参数最多的构造函数,参数少的构造函数则用this关键字引用即可了
class MyView(context: Context?, attrs: AttributeSet?, defStyleAttr: Int)
: View(context, attrs, defStyleAttr) {
constructor(context: Context?) : this(context,null,0)
constructor(context: Context?,attrs: AttributeSet?) : this(context,attrs,0)
}
重载和重写
重载就是多态性的表现,意思是函数名字一样但是参数不一样,根据不同的参数类型然后用不同的函数
重写就是将父类中的方法重写一遍
重写
用关键词over
open class jcDome{
open var name = "猪猪"
open var age = 16
open fun play(){
println("玩耍")
}
open fun eat(){
println("吃饭")
}
}
class Dome : jcDome(){
override fun eat(){
println("吃饭饭")
}
}
fun main(args: Array<String>) {
var s = Dome()
println(s.age)
s.eat()
s.play()
}
输出结果是:
16
吃饭饭
玩耍
注意的地方是
1.当父类中的函数,没有用open修饰符修饰的时候,子类中出现的函数的函数名不能与基类中没有用open修饰符修饰的函数的函数名相同,不管实现类中的该函数有无override修饰符修饰。
2当一个类不是用open修饰符修饰时,这个类默认是final的。
3当一个子去继承另外一个父类时,第二个基类不想去覆盖掉第一个基类的方法时,第二个基类的该方法使用final修饰符修饰。
重载
就是同一个方法名但是参数不一样 就是多态
open class jcDome{
open fun eat(){
println("吃饭")
}
}
class Dome : jcDome(){
fun eat(s:String){
println("${s}吃饭饭")
}
}
fun main(args: Array<String>) {
var s = Dome()
s.eat()
s.eat("笑笑")
}
运行结果:
吃饭
笑笑吃饭饭
跟java差不多。。。。
总结
类的继承相关知识思想都是和java一样的,就是有的小地方有区别