前面的代理设计模式用到了多态所以就去学习巩固了下多态知识, 稍微了解了之后, 在写这篇笔记博客的时候突然想到一个问题,
为什么要用多态 (不知道)? 于是我百度查:
额,??? 喵喵喵? 看了心里也清楚, 但是想到如果面试官问我, 我回答这个或者别的百度的, 我感觉有些奇怪, 可能还是没有透彻的理解多态把.
多态: 同一种事物的多种形态
什么时候使用向上转型, 向下转型?
答: 当面对一些共性类型的时候可以采用向上转型, 提高扩展性, 当想要去用子类的特有方法时, 会有向下转型, 但向下转型存在风险
容易发生 ClassCastException. 只要转换类型和对象类型不匹配就会发生.
先来个入门的多态代码小项目把, 可能都见过的小猫小狗吃东西
首先定义一个 Animal 类, 动物能干什么, 都得吃东西是吧, 那就定义一个 eat 方法
- package deep.demo1;
- /**
- * 定义一个动物类
- * @author DeepSleeping
- *
- */
- public class Animal {
- public void eat(){
- System.out.println("动物在吃东西");
- }
- }
然后定义一个 Dog 类和 Cat 类都继承 Animal 类并且都重写父类中的 eat 方法
- package deep.demo1;
- /**
- * 定义一个小狗类, 并且继承动物类
- * @author DeepSleeping
- *
- */
- public class Dog extends Animal{
- /**
- * 重写父类中 eat 方法
- */
- @Override
- public void eat() {
- System.out.println("小狗在吃东西");
- }
- }
- package deep.demo1;
- public class Cat extends Animal{
- /**
- * 重写方法
- */
- @Override
- public void eat() {
- System.out.println("小猫在吃东西");
- }
- }
然后创建一个 Test 类进行测试
- package deep.demo1;
- public class Test {
- public static void main(String[] args) {
- // 实例化 Dog 并且调用 eat 方法
- Animal dog = new Dog();
- dog.eat();
- //cat
- Animal cat = new Cat();
- cat.eat();
- }
- }
上面的创建 dog 和 cat 的对象的动作应该就是向下转型, 从而调用子类里的方法.
动物都有吃的行为, 小猫小狗也是动物, 所以继承了动物类, 但是它们吃东西不一样啊, 所以它们就分别有自己的吃东西的行为.
如果把 dog 中的重写方法去掉, 然后再调用一次
- package deep.demo1;
- /**
- * 定义一个小狗类, 并且继承动物类
- * @author DeepSleeping
- *
- */
- public class Dog extends Animal{
- /**
- * 重写父类中 eat 方法
- */
- /*@Override
- public void eat() {
- System.out.println("小狗在吃东西");
- }*/
- }
此时发现, 就不是 "小狗在吃东西了", 因为小狗没有重写父类中的 eat 方法, 所以执行的是父类中自带的 eat 方法 (可以定义父类加 abstract 关键字, 这样子类继承就强制实现父类中的方法了 eg:public abstract void eat();)
通过上面的例子应该大概知道了多态是干什么的了.
但是我也有自己的疑问:
请问为什么要使用多态啊?
Animal 中 eat 方法, Dog 继承 Animal 重写自己的 eat 方法
Animal dog = new Dog();
dog.eat(); 调用 dog 中的 eat 方法
我就非要自己创建 Dog 类, 也写 eat 方法, 创建 cat 类也写自己的 eat 方法, 都不用写 Animal 了,
Dog dog = new Dog();dog.eat(); Cat cat = new Cat(); 不也能实现同样功能吗?
还是说多态是为了父类限制子类的行为, 为了一种 "规范", 你继承我就必须也得能做这些事情. pencil 就不能继承 Animal 然后调用 eat() 因为这样不符合逻辑, 因为铅笔不可能吃东西. 所以就定义大的父类, 然后子类继承实现多态, 可以理解为是为了规范么? 项目开发上面的人定义好父类的方法, 然后让底层的人去实现子类里的方法就是了?
最近看多态总结的时候突然想起, 为什么要用多态? 百度查的都是那种看不懂的, 什么增强软件的灵活性和拓展性, 但是感觉拿不出大白话来解释就是没有真正理解
群里让我茅塞顿开的回答: 所谓的增加灵活性和扩展性, 其实很好理解, 你维护一个接口肯定比维护所有的实现类方便, 你一个类只要实现了一定的接口就具有接口的功能, 当然很灵活
我自己之后的理解: 赞同, 一个真正的项目, 某个父类或者接口, 本来用户是有 A,B,C 操作, 突然用户更改需求, 增加 D 操作, 只要在父类增加 D 方法, 子类全部实现一边就可以了 (eclipse 报错, 强制实现), 同理 ABCD 操作, 突然更改需求, 不能有 CD 操作, 就只要在父类中删除 CD 操作, 同时子类重写的就会报错, 删除即可.
我的眼见没有那么高, 毕竟如果项目大了, 一个父类不知道有多少个子类要继承它, 如果没有多态, 就得一个一个维护, 有一点需求的变更, 就得大动干戈, 就不够灵活了. 所以我也就理解了: 多态可以增强软件的灵活性和拓展性.
来源: https://www.cnblogs.com/deepSleeping/p/9382580.html