Kotlin笔记 七(五) 继承与多态.md

1、继承

和Java一样,Kotlin继承也是***单继承***,每个子类最多只有一个直接父类,子类继承父类,将获得父类全部的属性和方法;

Kotlin中所有有类和方法默认使用final修饰(不能继承、或者重写),为了让指定类、方法可以被继承、重写必须使用open关键字修饰该类、方法;

语法格式:

	[修饰符] class 子类名:父类名{




	}
  1. 定义一个Kotlin类没有显示指定父类,默认扩展Any类。Any类是所有类的父类(要么直接父类要么间接父类);Any类不是java.lang.Object类
  2. Kotlin的类默认时final修饰的,即不能派生子类,为了让其类可以派生子类,可以使用“open”修饰符修饰类
  3. Kotlin默认所有的方法添加final修饰符,阻止该方法被重写,添加open关键字阻止Kotlin自
    动添加final修饰符

open修饰符用于取消自动添加的final修饰符

1.2 重写父类方法

  1. Kotlin默认所有的方法添加final修饰符,阻止该方法被重写,添加open关键字阻止Kotlin自
    动添加final修饰符
  2. 子类重写父类方法:子类中重写的方法必须使用override修饰符,其次父类必须使用open修饰符,父类才能被继承,最后父类中被重写的方法必须也使用open修饰符

重写遵循的原则:两同两小一同

两同:方法名、参数列表必须相同(参数个数、参数类型)
两小:子类方法返回值类型必须父类方法返回值类型小或者相等、子类方法抛出的异常必须必父类方法抛出的异常小或者相等
一大:子类方法访问权限必须比父类方法访问权限相等或者更大

子类重写父类方法后,子类对象将无法访问父类中被覆盖的方法,但是可以***在子类的所有方法中调用父类被覆盖的方法(super.被重写方法())即在子类内部被覆盖的方法任然是可见的***;

如果父类的方法是private访问修饰符,该方法不能重写,即使子类中有一个和父类同样的方法,也不是重写,而且子类同名(相同方法名、相同形参列表、相同返回值类型)的这个方法不能使用override修饰符,因为不是方法重写;

如:

open class Base {

    private fun test() {

    }
}
class Sub:Base(){
     fun test(){
        
    }

}

1.3、属性重写

要求:

  1. 父类被重写的属性必须使用open修饰符
  2. 子类的属性类型与父类属性类型要兼容
  3. 子类重写属性访问权限要大于或者等于父类属性权限;
  4. 只读属性可以被读写属性重写,读写属性不能被只读属性重写

父类中private修饰的属性,只能在该类内部访问,不能别子类重写;

当父类中方法、属性被重写后,被重写的方法只能在子类的方法中访问(super.方法()、super.属性),在子类外部(被重写的方法、属性将被重写方法、属性覆盖);

1.4 强制重写

这种情况比较特殊:子类同时继承类和实现了接口(父类和接口中存在同名的成员(属性、方法)),Kotlin就要求子类必须重写该成员。子类中使用"super<超类型>.重写方法()"来调用超类方法

open class Animal{

    open val name:String="动物"


    public open fun say(){
        println("动物叫")
    }




}
interface  IAnimal{
    val name:String
    fun say(){
        println("接口-动物叫声")
    }
}
class Cat:Animal,IAnimal{

    constructor() : super()

    override val name: String
        get() = super<Animal>.name

    override fun say() {
        super<Animal>.say()
        super<IAnimal>.say()
    }




}

注意:接口中的方法默认有open修饰符;关于接口后面会详细讲解

2.多态

和Java一样,唯一需要不同的是:在Java中,属性不具有多态,而kotlin中的属性和方法一样具有多态

如Kotlin:

		var sub:Base=Sub();
		pritnln("${sub.age}")//将输出子类中重写的属性值

引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所引用的方法;

is检查类型

引用变量在编译阶段只能调用其编译时类型的方法,而不能调用其运行时的类型的方法,即使他实际所引用的对象确实包含该方法。如果要调用其运行时的方法,就必须强转(向下转换)成运行时类型;

Kotlin提供的类型转换运算符包含as和as?(

强制转换的前提:变量类型和转换的目标类型是父子继承关系,即编译时为父类类型,运行时为子类类型

在转换时保证类型不会出错,Kotlin提供了两个类型检查符:is和!is

语法格式:

	变量 is 类名或接口

判断前面的变量是否引用后面的类,或者其子类、实现类的实例;是返回true,否则,但会false;is或!is操作符对变量进行判断,如果是,将会自动完成转换为目标类型;

如:

	fun test(str:String){
	    if(str !is String)
	        return
	    println("str长度:${str.length}")
	
	}



when(a){
	is String->a.leng
	is Int->......
	
}

as运算符

as?:安全的强制转换符,如果转型失败,程序不会引发异常,而是返回null
as:如果转型失败,将引发ClassCastException异常;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值