在做Swing的时候,为了把通用的界面框架抽象出来,经常采用模板方法,但是由于界面组件的初始化及布局都在构造函数中实现,于是就出现了下面的调用顺序
1.子构造函数->2.父构造函数->3.子模板方法->4.子类的实例变量初始化,在子类模板方法中初始化子类中的实例变量(子类的界面组件)之后,子类开始初始化自己的实例变量,结果把在模板方法中已经初始化的实例变量又初始化了一遍。如果子类不对其实例变量做初始化,那么第4步也不会进行,也就避免了这个问题
这就引出了一个问题,初始化实例变量为null和不初始化实例变量有了区别,下面是对这个问题写的测试代码,注意子类Child中的ch实例变量
当Child的ch变量不初始化时的代码:
此时输出“Parent”
当Child的ch变量初始化为null时的代码:
此时输出“null"
结论:当变量没有初始化时,会在分配对象内存时将所有变量置为初始值,但是不会在构造时自动为其再初始化一遍;
当初始化变量时,首先在分配内存时将所有变量都置为初始值,并在构造时再执行其初始化语句;
如果是在构造函数中使用模板方法模式,那么就要注意:如果在模板方法里为子类的变量做了赋值操作,那么在定义该变量时千万不要初始化,即使是初始化为null也会导致该变量被重新赋值