多态(一)

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

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

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

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

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

容易发生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操作,同时子类重写的就会报错,删除即可。

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

原文地址:https://www.cnblogs.com/deepSleeping/p/9382580.html