- /*
- 如果方法的中使用了这个类中的字段,那么这些字段完全有可能还没有初始化。
- */
- class X
- {
- int xmask = 1;
- int mask;
- X()
- {
- mask = xmask;
- System.out.println("mask="+mask);//1
- method();//调用了可以被子类重载的方法,获取的ymask=0;
- //ymask尚未完成显示初始化。
- }
- void method()
- {
- System.out.println("父类的method方法,xmask="+xmask);
- }
- }
- class Y extends X
- {
- int ymask = 2;
- Y()
- {
- mask += ymask;
- System.out.println("mask="+mask);//3
- method();
- }
- void method()
- {
- System.out.println("子类的method方法,ymask="+ymask);
- }
- }
- class Demo4
- {
- public static void main(String[] args)
- {
- Y test = new Y();
- }
- }
- /*
- 运行结果:
- mask=1
- 子类的method方法,ymask=0
- mask=3
- 子类的method方法,ymask=2
- 分析:
- 子类和父类的构造函数都调用了method方法,
- 执行的都是子类的method方法,
- 但是method输出的结果却不一样;
- 总结:在设计对象构造阶段调用的这些方法必须考虑上面这些因素。
- 构造函数应该避免调用那些可覆盖的方法,即不是私有的,静态的或final的方法。
- 如果调用了这些方法,必须在文档中特别说明。
- */
复制代码 |