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() ;}
- 07 为什么会有多态?为什么会有抽象类?
- 为什么会有serialVersionUID
- 为什么会有“剩男剩女”
- 为什么会有句柄
- 为什么会有hibernate
- 为什么会有servlet?
- 为什么会有异常
- 为什么会有JavaScript???
- 为什么有抽象类还要接口
- 为什么会有java,为什么会有.net
- 为什么会有Java,为什么会有.NET
- 06 为什么会有继承?为什么会有super?
- 为什么会有这个blog
- 为什么会有类型转换?
- 为什么物体会有颜色
- 为什么会有Presentation Error
- java为什么会有serialVersionUID
- 为什么会有字符串函数?
- HDOJ 2084 数塔
- confuse & task
- 邻接表存储图Java实现
- svn 使用记录
- ASoC 概述(中文翻译) / ASoC Overview
- 07 为什么会有多态?为什么会有抽象类?
- STL——map的使用
- HDU 4461--水题
- Dalvik虚拟机
- 脏数据
- Bresenham画圆法(计算机图形学)
- Codeforces Round #366 (Div. 2) [D] Ant Man
- 8.8~8.15
- libcurl 使用及例程