07 为什么会有多态?为什么会有抽象类?

来源:互联网 发布:woc什么意思网络用语 编辑:程序博客网 时间:2024/05/15 07:08

为什么会有多态?

为了让程序可以选择多个运行状态,增强软件的灵活性和扩展性。

先来看多态的表现形式,如果父亲还有很多孩子。

Dad a = new Boy1();

Dad a = new Boy2();

......

多态,顾名思义就是:有多个形态的表现。

尽管每个孩子都长的不一样,但都是Dad的孩子。长的不一样,不就是多个形态么,简称多态。

 

现在父亲想要去买东西,自己又不想去,就给他们的孩子们说,我要买个东西,你们去帮我买回来。那么,谁去买呢?

我们用代码的形式表现一下:

 

package com.junc.test;public class Test {public static void main(String[] args) {Who who = new Who();who.buy(new Boy1());who.buy(new Boy2());}}class Dad {public void shopping() {}}class Boy1 extends Dad{public void shopping() {System.out.println("男孩1去买");}}class Boy2 extends Dad{public void shopping() {System.out.println("男孩2去买");}}class Who {/*写这么多代码很麻烦的,程序员都很懒,只要知道是Dad指派去的就好了,解决这个问题将是多态的优点所在。  public void buy(Boy1 boy1) { boy1.shopping();} public void buy(Boy2 boy2) {boy2.shopping();}*/public void buy(Dad dad) { //Dad dad = new Boy1();或new Boy2();这就是多态dad.shopping();}}

现在问题来了,是否可以删除Dad类中的shopping方法呢?这代码好像也没做什么事啊?

class Dad {public void shopping() {}}
答案是不可以的,因为编译器会先查看是否是父亲要求去买的东西,当去掉Dad里的shopping()方法后,父亲不要求买,Boy()里的shopping()方法就是男孩自己特有的了,男孩也就不可以买。必须父亲说要买东西才行,小孩要听父亲的。


所以,结合多态的优点,多态主要应用于当参数传递的时候,让程序可以选择多个运行状态。

通常来说,在参数传递的时候,参数接收方越大越好,比如Object类


为什么会有抽象类?

提取共性,将注意力集中在与当前目前有关的方面。为此建立一种机制,强制子类必须重写此方法,完成此任务。

人都会犯错,都会忘记事,要是男孩没有重写shopping方法,他忘记了Dad说要购买东西,最终的结果就没有输出,系统也不会报错,也就是没有买回来任何Dad所需要的东西,这是非常糟糕的一件事。

为了避免这样的事发生,Dad就将shopping这个抽象化,抽象化也就是定义一种机制,告诉子类你一定要按我的要求来,必须重写我的方法。那么,Dad怎么传达这个消息呢,现实生活中,我们会选择打电话或发短信以做提示,在java代码中,我们选择添加关键字abstract。提示Boy子类要重写我的方法,当然Dad是不会自己去买的,所以他的方法体为空,即shopping()里面没有任何传递信息;又因为自己不会去,也就没有具体的对象,即不可以new Dad(),不能实例化,故“Dad dad = new Dad();”是一个错误的表达。但“Dad dad = new Boy1();”是可以的,他只是声明是Dad说的话,而创建的是Boy对象。

所以,说到底,就是Dad类自己不想去,又怕Boy忘记,也就将注意力集中在买东西上,所以做一个短信机制(abstract)提醒Boy必须完成这个方法。

所以将代码改为:

abstract class Dad {public abstract void shopping() ;}


0 0