昨天开始对WebWork进行了一些初步的探索[1],虽然进展缓慢,但是在阅读与分析其源代码的时候,还是有颇多的收获。这些所得并不属于探索WebWork本身,因而将此篇列为号外。
        在ActionFactory类中,有如下代码:

public abstract class ActionProxyFactory {
   static ActionProxyFactory factory = new DefaultActionProxyFactory();
  public static void setFactory(ActionProxyFactory factory) {
     ActionProxyFactory.factory = factory;
   }
  public static ActionProxyFactory getFactory() {
     return factory;
   }
}

对于类ActionProxyFactory而言,setFactory方法用于设置静态类变量factory的初始值,如果该方法没有被调用的话,那么通过getFactory方法就会获得ActionProxyFactory默认派生子类的实例。这样的设计最大的好处就是灵活,即使在整个流程当中改变了ActionProxyFactory的实现,对外的接口也是一直保持不变。
        接着,就是DefaultActionProxyFactory的代码了:

public class DefaultActionProxyFactory extends ActionProxyFactory {
    public DefaultActionProxyFactory() {
            super();
       }
}

DefaultActionProxyFactory的实现平淡无奇,只是构造函数的实现激起了我的兴趣,首先,ActionProxyFactory作为其父类,本身是一个Abstract的类,既然是这样,ActionProxyFactory是不允许被实例化的,那么她哪里来构造函数呢?其次,子类被实例化的时候,就是构造函数被调用的时候,默认是先调用父类默认的构造函数的(默认构造函数就是不带参数的构造函数),那么代码中的super()是不是有点多余了呢?由第二个问题引申开去,就产生了另外一个很基本的问题,如果父类中定义了包含参数的构造函数,而且是多个的时候,子类在默认情况下会调用哪一个呢?
        第一、Abstract类是拥有构造函数的,可以通过在AbstractProxyFactory中定义带参数的构造函数来证明这一点。虽然Abstract类的构造函数不能够直接通过new操作去调用,但是它可以被子类的构造函数调用。因为继承是让子类拥有跟父类一样的行为和属性,而继承很大的一部分工作都是依靠调用父类的构造函数来完成,如果父类没有构造方法,又如何实现继承呢?
        第二、我个人认为super()是多余的,因为默认的构造函数本来就会做这样的工作;
        第三、在默认情况下,哪个都不会被调用。也就是说如果父类定义了包含参数的构造函数,那么子类必须在其构造方法中显式调用父类的构造方法,否则无法编译通过。
    
         [1] WebWork深度探索之盲人摸象

转载于:https://www.cnblogs.com/perhaps/archive/2004/08/14/33256.html

WebWork深度探索之号外相关推荐

  1. WebWork深度探索之Pitfall

    在使用WebWork进行开发的过程中,她的种种特性:简约为先的设计原则,IOC的实现,Interceptor的使用,Command模式的使用,利用OGNL作为其Expression Language, ...

  2. WebWork深入探索之初见端倪

    使用WebWork进行Web Application开发也有一个星期了,虽然对于WebWork框架本身的设计思路感觉还是一片模糊,但是我开始看到了一丝的光线.         虽然在前文提出的问题[1 ...

  3. 深度探索Hyperledger技术与应用之超级账本初体验(附部署代码)

    2019独角兽企业重金招聘Python工程师标准>>> 本章零基础地介绍了如何快速体验超级账本搭建的区块链网络,我们先绕过了比较复杂的初始化配置,用官方提供的fabric-sampl ...

  4. 《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动

    本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第1章,第1.6节 Linux设备驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区" ...

  5. Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记

    Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记     本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.A ...

  6. 《Android深度探索(卷1):HAL与驱动开发》——6.4节使用多种方式测试Linux驱动...

    本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第6章,第6.4节使用多种方式测试Linux驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区 ...

  7. 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学

     <深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...

  8. Android深度探索第五章

    开发板是开发和学习嵌入式技术的主要硬件设备,开发板拥有许多扩展的端口,可以很容易开发定制的硬件,并与开发板链接.目前市面上的开发板型号和种类很多,但目前最流行的是基于三星S3C6410ARM11架构的 ...

  9. 深度探索C++ 对象模型(7)-Data member的布局(虚继承)

    虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

最新文章

  1. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框颜色配置)实战
  2. Linux下du加强版,灵活快速定位硬盘使用情况,无需安装
  3. 富文本框让最大四百像素_TinyMCE 富文本编辑器 ━━ 基本配置
  4. [置顶] Spring中DI设置器注入
  5. Java ThreadLocal 使用详解
  6. vue如何获取年月日_BootstrapVue——Vue和Bootstrap的相结合,构建响应式应用更简单...
  7. [C++STL]C++实现vector容器
  8. python socket编程实现的简单tcp迭代server
  9. python 编辑距离 2组匹配_Python文本相似性计算之编辑距离详解
  10. Matlab下载 安装 与 和谐教程
  11. Windows快捷键使用和打开CMD的方式
  12. 轻仓的贵金属白银今日走势分析
  13. python列表姓氏_Python 批量生成中文姓名(百家姓)
  14. python二维数组第一列_Python遍历numpy数组的实例 python中如何提取一组数据中的第一列数据...
  15. 吃饭 睡觉 打豆豆!!!
  16. 利用栈实现中缀表达式转后缀表达式
  17. elementui组件中,树形组件的使用
  18. Python实现画图软件功能
  19. 360个人图书馆禁止复制问题
  20. CRC 循环冗余校验码 的计算方法

热门文章

  1. 开始使用-编写你的第一个Flutter应用程序
  2. ZIL (ZFS intent log) zil.c
  3. ROS Hotspot服务器的搭建与设定!(上网认证)
  4. UIPickerView
  5. 队列学习笔记 顺序队列
  6. 设计模式 2014-12-19
  7. Exchange 2010向外网发邮件的配置
  8. HTML与CSS(图解4):表格
  9. EasyUI Pagination 分页的两种做法
  10. ExtJS在树TreePanel之间拖放结点