多态
多态是继封装、继承之后,面向对象的第三大特性。
定义
多态:是指同一行为,具有多个不同表现形式 。
多态的实现
多态体现的格式:
1 父类类型 变量名 = new 子类对象;
2 变量名.方法名();
代码如下:
1 Fu f = new Zi();
2 f.method();
当使用多态方式调用方法时,首先检查父类中是否有该类方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。
引用类型转换
多态的转型分为向上转型与向下转型两种:
向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
当父类引用指向一个子类对象时,便是向上转型。
使用格式:
1 父类类型 变量名 = new 子类类型();
2 如:Animal a = new Cat();
向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。
⼀个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。
使用格式:
1 子类类型 变量名 = (子类类型) 父类变量名;
2 如: Cat c =(Cat) a;
为什么要转型:
在学习的时候遇到了以下困惑:
1.向上转型有什么用?直接创建子类对象不是更方便?
答:采用向上转型设置的方案更加简单灵活。
2.为什么向下转型?直接实例化对象不是更简单?
答:借由向下转型,可以在灵活应用多态的基础上,同时兼顾子类的独有性,相较于直接创建子类实例,提高了代码加灵活性。
具体详细的解答参考以下博客:
多态类详解文档:
Java多态性详解(父类引用子类对象) - 百度文库https://wenku.baidu.com/view/0822f4acd3d233d4b14e852458fb770bf78a3b8b.html
插曲:
做题时遇到一个困惑:Calendar(日历的抽象类)为何可以被实例化?
Calendar本身是一个抽象类,抽象类是不允许被实列化的。但是Calendar提供了一个方法:static Calendar getInstance()来获取实例化的对象。
结论是:Calendar c = Calendar.getInstance();这句代码是获取的子类对象,利用多态传参,左边是父类,右边是子类。
参考博客: