新利国际中文登录
  咨询电话:13556246131

新利国际平台

多态(一)

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

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

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

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

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

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

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