WebWork深度探索之号外
昨天开始对WebWork进行了一些初步的探索[1],虽然进展缓慢,但是在阅读与分析其源代码的时候,还是有颇多的收获。这些所得并不属于探索WebWork本身,因而将此篇列为号外。
在ActionFactory类中,有如下代码:
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 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深度探索之号外相关推荐
- WebWork深度探索之Pitfall
在使用WebWork进行开发的过程中,她的种种特性:简约为先的设计原则,IOC的实现,Interceptor的使用,Command模式的使用,利用OGNL作为其Expression Language, ...
- WebWork深入探索之初见端倪
使用WebWork进行Web Application开发也有一个星期了,虽然对于WebWork框架本身的设计思路感觉还是一片模糊,但是我开始看到了一丝的光线. 虽然在前文提出的问题[1 ...
- 深度探索Hyperledger技术与应用之超级账本初体验(附部署代码)
2019独角兽企业重金招聘Python工程师标准>>> 本章零基础地介绍了如何快速体验超级账本搭建的区块链网络,我们先绕过了比较复杂的初始化配置,用官方提供的fabric-sampl ...
- 《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动
本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第1章,第1.6节 Linux设备驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区" ...
- Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记
Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记 本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.A ...
- 《Android深度探索(卷1):HAL与驱动开发》——6.4节使用多种方式测试Linux驱动...
本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第6章,第6.4节使用多种方式测试Linux驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区 ...
- 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学
<深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...
- Android深度探索第五章
开发板是开发和学习嵌入式技术的主要硬件设备,开发板拥有许多扩展的端口,可以很容易开发定制的硬件,并与开发板链接.目前市面上的开发板型号和种类很多,但目前最流行的是基于三星S3C6410ARM11架构的 ...
- 深度探索C++ 对象模型(7)-Data member的布局(虚继承)
虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...
最新文章
- R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框颜色配置)实战
- Linux下du加强版,灵活快速定位硬盘使用情况,无需安装
- 富文本框让最大四百像素_TinyMCE 富文本编辑器 ━━ 基本配置
- [置顶] Spring中DI设置器注入
- Java ThreadLocal 使用详解
- vue如何获取年月日_BootstrapVue——Vue和Bootstrap的相结合,构建响应式应用更简单...
- [C++STL]C++实现vector容器
- python socket编程实现的简单tcp迭代server
- python 编辑距离 2组匹配_Python文本相似性计算之编辑距离详解
- Matlab下载 安装 与 和谐教程
- Windows快捷键使用和打开CMD的方式
- 轻仓的贵金属白银今日走势分析
- python列表姓氏_Python 批量生成中文姓名(百家姓)
- python二维数组第一列_Python遍历numpy数组的实例 python中如何提取一组数据中的第一列数据...
- 吃饭 睡觉 打豆豆!!!
- 利用栈实现中缀表达式转后缀表达式
- elementui组件中,树形组件的使用
- Python实现画图软件功能
- 360个人图书馆禁止复制问题
- CRC 循环冗余校验码 的计算方法