zoukankan      html  css  js  c++  java
  • 多态(一)

    前面的代理设计模式用到了多态所以就去学习巩固了下多态知识,稍微了解了之后,在写这篇笔记博客的时候突然想到一个问题,

    为什么要用多态(不知道)?于是我百度查:为了让程序可以选择多个运行状态,增强软件的灵活性和扩展性。额,???喵喵喵?看了心里也清楚,但是想到如果面试官问我,我回答这个或者别的百度的,我感觉有些奇怪,可能还是没有透彻的理解多态把。

    多态:同一种事物的多种形态

    什么时候使用向上转型,向下转型?

    答:当面对一些共性类型的时候可以采用向上转型,提高扩展性,当想要去用子类的特有方法时,会有向下转型,但向下转型存在风险

    容易发生ClassCastException。只要转换类型和对象类型不匹配就会发生。

    先来个入门的多态代码小项目把,可能都见过的小猫小狗吃东西

    首先定义一个Animal类,动物能干什么,都得吃东西是吧,那就定义一个eat方法

     1 package deep.demo1;
     2 
     3 /**
     4  * 定义一个动物类
     5  * @author DeepSleeping
     6  *
     7  */
     8 public class Animal {
     9 
    10     public  void eat(){
    11         System.out.println("动物在吃东西");
    12     }
    13 }

    然后定义一个Dog类和Cat类都继承Animal类并且都重写父类中的eat方法

     1 package deep.demo1;
     2 
     3 /**
     4  * 定义一个小狗类,并且继承动物类
     5  * @author DeepSleeping
     6  *
     7  */
     8 public class Dog extends Animal{
     9 
    10     /**
    11      * 重写父类中eat方法
    12      */
    13     @Override
    14     public void eat() {
    15         System.out.println("小狗在吃东西");
    16     }
    17 
    18 }
     1 package deep.demo1;
     2 
     3 public class Cat extends Animal{
     4 
     5     /**
     6      * 重写方法
     7      */
     8     @Override
     9     public void eat() {
    10         System.out.println("小猫在吃东西");
    11     }
    12 
    13     
    14 }

    然后创建一个Test类进行测试

     1 package deep.demo1;
     2 
     3 public class Test {
     4 
     5     public static void main(String[] args) {
     6         
     7         //实例化Dog并且调用eat方法
     8         Animal dog = new Dog();
     9         dog.eat();
    10         
    11         //cat
    12         Animal cat = new Cat();
    13         cat.eat();
    14     }
    15 }

    上面的创建dog和cat的对象的动作应该就是向下转型,从而调用子类里的方法。

    动物都有吃的行为,小猫小狗也是动物,所以继承了动物类,但是它们吃东西不一样啊,所以它们就分别有自己的吃东西的行为。

    如果把dog中的重写方法去掉,然后再调用一次

     1 package deep.demo1;
     2 
     3 /**
     4  * 定义一个小狗类,并且继承动物类
     5  * @author DeepSleeping
     6  *
     7  */
     8 public class Dog extends Animal{
     9 
    10     /**
    11      * 重写父类中eat方法
    12      */
    13     /*@Override
    14     public void eat() {
    15         System.out.println("小狗在吃东西");
    16     }*/
    17 
    18 }

     此时发现,就不是"小狗在吃东西了",因为小狗没有重写父类中的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操作,同时子类重写的就会报错,删除即可。

    我的眼见没有那么高,毕竟如果项目大了,一个父类不知道有多少个子类要继承它,如果没有多态,就得一个一个维护,有一点需求的变更,就得大动干戈,就不够灵活了。所以我也就理解了:多态可以增强软件的灵活性和拓展性。

  • 相关阅读:
    Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测
    点击率预估
    论文列表——text classification
    retrofit+RXjava二次封装
    Twitter Lite以及大规模的高性能React渐进式网络应用
    《设计模式》结构型模式
    maven多module项目中千万不要引入其它模块的单元測试代码
    Jenkins配置基于角色的项目权限管理
    读《百度基础架构技术发展之路》有感
    <html>
  • 原文地址:https://www.cnblogs.com/deepSleeping/p/9382580.html
Copyright © 2011-2022 走看看