16 多态

作者: ca8519be679b | 来源:发表于2020-02-20 10:17 被阅读0次

    面向对象我们讲过了封装和继承,其中继承就有extends,implements

    多态是指一个实例对象继承自父类或者接口,同时兼顾自身的功能和父类,接口的功能,完成多种任务

    多态声明

    多态如何使用,不外乎下面的2种格式,注意2测不再是同一个类,而是右侧为左侧的继承关系

    父类名 变量名 = new 子类名();

    或      接口名 变量名 = new 实现类名();

    1 2 3

    如上3图,我们父类定义2个方法,子类继承父类,重写了fun方法,我们在Demo的main函数里实例化,我们可以看到,我们使用a的fun,执行的是子类的方法,但是也能执行fun2父类方法

    多态成员变量使用特点

    方法能进行覆盖重写,成员变量不能,多态的情况下,先去本类(等号左侧)去找,如果没有再去继承关系向上去找

    4 5 6

    如上我们使用的父子类都定义num,Demo的main方法里使用的是多态,我们打印num是Fu即等号左侧的num

    7 8

    又比如我们在子类里定义了父类没有的age,我们尝试去打印age就不行,因为父类本身没有,只会向上到Object里找(不会向下),没有就会标红

    通过成员方法访问成员变量,从new的类往上谁有成员方法,则使用谁,没有则向上查找(子类复写使用子类,未复写使用父类)

    9 10

    我们在父类定义showNum,子类未定义,当然调用的是父类的showNum,然后这个方法是父类的,所以打印的是Fu类的num

    11 12

    如上我们子类复写了父类的方法,实际调用的是子类方法

    所以我们需要区分成员变量和方法,变量是看左边往上,而方法是右边往上

    13

    我们为什么使用多态,如上,我们定义了员工类,work方法为抽象我们不知道具体是做什么,我们实现2个子类,每个都有work,我们使用多态,就可以直接使用对象的work即可

    自动转换

    向上自动转换就是我们常见的多态,左侧为父类,右侧为子类,这样的含义是创建子类对象,当做父类来看待,向上转型是安全的,因为是小范围转向大范围

    14

    这里需要注意的是一旦向上转型为父类,子类的特有方法就无法使用

    15

    如上,实例子类Cat转型为Animal,子类除了父类的eat还有catchMouse方法,但是向上转型后无法使用这个方法,如果我们还是想用这个方法,就涉及到对象向下转型

    向下转型格式 子类名称 变量名 = (子类名)父类转型对象;这里就是将父类对象还原成子类对象,这强制类型转换必须要求父类是有当前子类转换成的,如本来是只猫,向上变成动物,然后可以强制转换成猫,但不能变成一只狗

    16

    如上,我们尝试将猫向上转换的animal还原成猫是可以的,但是转换成狗会编译能通过,但是运行报错,提示类型转换异常

    instanceof进行类型判断

    我们有了类型转换,就需要判断父类引用对象到底是什么子类转换来的呢

    对象 instanceof 类名     返回bool值

    17

    如上,注意的是,这里instanceof属于特殊格式,没有点和括号

    相关文章

      网友评论

          本文标题:16 多态

          本文链接:https://www.haomeiwen.com/subject/wzhpfhtx.html