zoukankan      html  css  js  c++  java
  • JAVA-初步认识-第八章-继承-子父类中成员变量的特点-覆盖的应用

    一.

    覆盖讲解了好几节,看来确实是个很重要的知识点。

    其实我们最关心的不是覆盖的特点和覆盖的注意事项,这些小东西只要稍加注意,不写错就可以了。我们要注重什么,什么时候使用覆盖操作,这是我们开发时,使用最频繁的。

    先不管什么覆不覆盖了,先用一个案例演示一遍。

    先描述一个小事物,手机。手机有个功能就是来电显示,早期的手机,显示的只有num。编译后,一运行,发现没有任何问题。

    接下来,遇到一些问题。现在手机出来很多新的版本,来电显示功能发生了一些变化,有显示姓名和照片。我们要将这些东西加进来,

    直接在原有的基础上,加上一些新的内容。编译运行没有问题。

     

    但是有一些小问题,无论是name,还是picture都是后来的,把它们写在一起,合适么?不太合适,因为添加的name和pic相当于升级,这也是后期维护中的一部分。如果每次升级,都是修改源代码的话,如果发现升级的不对,还得该回去,这就会造成修改成本。这样就不利于该程序的扩展。而且,一升级就去修改代码的话,往往修改的不是一处,是多处,就会给你的升级带来灾难,甚至是毁灭性的,等你改完,不一定能改回去。所以,一般情况下,我们不建议对源代码进行修改,这样最危险。因此,在设计的时候就变得很重要,如果设计不好,后面全都出现不行。

    因此,我们可以这么做,可以搞一个新类,newphone,它也是电话中的一种,让它去继承以前的phone就可以了,创建新的显示方法,来显示后期添加的东西。

    (这里为什么会有number的重复出现,是不是显得有点多余?)

    一样是产生变化,但我们不准备去修改原来的类,直接通过一个类去继承它。用继承的方式来进行扩展。如果单独设计个类,和之前的一点关系都没有,会显得很麻烦,因为这个phone类中还有其他功能是不需要修改的,比如说通话,从以前到现在,通话功能一直都是一样的。也就是phone类中还有call()方法,你觉着newphone类中还需要重新定义么?就不需要了,而且我们知道新的东西,就是老的类中的一种,为什么不直接继承call(),拿来用呢?只是show()方法变了。因此,用继承就可以提高程序的扩展性。

    DOS结果显示,没有任何问题。看样子是解决了问题,但是还有不爽。这个newphone继承了phone,相当于继承了父类中的两个方法,意味着它也可以调用show(), 结果显示是可以的,

    但是爽吗?不爽了。子类出现以后,无非是为了改良父类中的来电显示功能,但是它有必要更改来电显示声明吗(这里是说show的名字)?父类本身就有来电显示的功能,子类只要继承过来就可以了,但是呢?子类想说,这个功能,我可以保留,但是我想改变功能的内容(保留show方法声明,但是里面的执行内容要发生变化)。这该怎么操作?没必要定义新方法,新方法定义完以后,老方法一样可以拿来用,而我要做的,就是把已有的来电显示功能改良。

    想改良做的最简单的动作就是覆盖,保留父类原有功能,创建子类特有内容。以前有来电显示,我不喜欢,但是功能还得要,因为我也需要来电显示,只是我的来电显示的内容和你不一样。

    只要创建的是子类的对象,那么既能用show(), 也能用call(),p走的是子类的来电显示,和phone走的不一样,但也能走phone的call()。

    这里还有一点要注意,子父类的方法中num写了两遍,

    为什么不直接省略num这个语句呢?因为是覆盖,如果省略了num语句,那么调用子类的show()方法时,就没有num输出了。

  • 相关阅读:
    日期型数据知识
    如何让VS检查函数和类Comment的添加情况
    HTTP request is unauthorized with client authentication scheme 'Anonymous'.
    将SerializableAttribute序列化为xml
    使用EnterpriseLibrary Validation Block对WCF做验证
    表达式树中递归方法
    使用SignalR在Asp.net中实现进度条
    SQLServer中列出数据库的所有表的创建时间
    用Knockoutjs与Asp.net MVC实现级联下拉列表
    使用UnityAutoMoq简化单元测试
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/7739903.html
Copyright © 2011-2022 走看看