Java笔记:多态polymorphic

什么是多态?为什么要使用多态?
首先我们通过下面的一个卫视宠物不同食物的例子引出

Java笔记:多态polymorphic_第1张图片
正常不使用多态的情况下,喂养不同的宠物不同的食物,我没都需要另写一个方法,构成feed方法重载
Java笔记:多态polymorphic_第2张图片
但是如果动物和食物过多,就需要定义更多方法,所以使用常规方法时代码的复用性不高,不利于代码的维护.由此引出多态
多态的基本介绍
Java笔记:多态polymorphic_第3张图片
方法的重写和重载就体现多态
Java笔记:多态polymorphic_第4张图片
Java笔记:多态polymorphic_第5张图片
对象的多态
Java笔记:多态polymorphic_第6张图片
编译类型就是javac的时候,运行类型就是程序运行时的类型
一个父类的引用既可以指向父类,也可以指向子类
Java笔记:多态polymorphic_第7张图片
在这里插入图片描述
然后我们现在用多态去解决之前宠物喂养的问题,下面的一个方法就可以代替上述所有传统写法,大大提高了效率
Java笔记:多态polymorphic_第8张图片
向上转型
Java笔记:多态polymorphic_第9张图片
多态中强调:编写java程序时,引用类型变量只能调用其编译时类型的变量.
Java笔记:多态polymorphic_第10张图片
向下转型
只能强转父类的引用,不能强转父类的对象.
Java笔记:多态polymorphic_第11张图片
我们再回到上面animal无法调用catchmouse方法的问题是,那么如果我们确实想让animal去调用子类cat的catchmouse方法该怎么办?
办法就是使用向下转型,具体如下
Java笔记:多态polymorphic_第12张图片

这里简述一下向下转型与 Cat cat = new Cat()的区别(个人理解,仅供参考).
强转不用开辟新的对象空间,创建cat的话,父类引用animal指向的子类对象就浪费了
强转之后指向的对象没有发生改变,而new Cat()过后是新创建了一个cat对象,新创建的对象与原来的对象不一致.(类似于 父类僵尸A想使用其子类自爆僵尸的自爆方法,但是父类僵尸A没有这个方法,于是僵尸A使用了向下转型拥有了自爆方法,如果直接 new 自爆僵尸的话就相当于又创建了一个新的自爆僵尸B,这两个对象完全不一样)
那为什么上面的animal向下转型成cat以后不能再向下转型成dog?
因为向下转型后,animal对象相当于一个cat类,如果这样做就相当于强行将cat转成dog,这是不可能的,最终编译没有问题,但是运行时会报"classcastexception(类型转换异常)"的错误.
Java笔记:多态polymorphic_第13张图片

属性没有重写之说,属性的值看编译类型
Java笔记:多态polymorphic_第14张图片
instanceOf比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型
在这里插入图片描述

Java笔记:多态polymorphic_第15张图片

Java笔记:多态polymorphic_第16张图片
多态练习
练习1
Java笔记:多态polymorphic_第17张图片
练习1答案
Java笔记:多态polymorphic_第18张图片
练习2
Java笔记:多态polymorphic_第19张图片
属性看编译类型,方法看运行类型,运行类型遵循先子后父
Java笔记:多态polymorphic_第20张图片

你可能感兴趣的:(java笔记,数据结构,java)