在core java 2书中有下面一段话:
调用构造器的具体处理步骤:
1、所有数据域被初始化为默认值。
2、按照在类声明中出现的次序依次执行所有域初始化语句和初始化块。
3、如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
4、执行这个构造器主体。可是从下面的代码输出结果看却与上面的有些矛盾 class A {
    private int radius = 10;
    public A()
    {
        draw();
    }
    public void draw()
    {
        
    }
}
class B extends A
{
    private int radius = 1;
    public B()
    {
    }
    public void draw()
    {
        System.out.println(radius);
    }
    public static void main(String[] args)
    {
        B a = new B();
    }
}输出的结果为:
0如果按上面的第二条和条三条的顺序来执行的话应该输出1才是啊, 因为在调用第二个构造器之前完成了 “按照在类声明中出现的次序依次执行所有域初始化语句和初始化块。”,那么这时的radius就是1了啊?大家怎么看呢?

解决方案 »

  1.   

    输出结果是0没错!
    基类的构造器先于子类的构造器被调用。
    而在基类的构造器内部调用draw(); 根据多态行为,应该调用子类的draw()方法,就是System.out.println(radius);
    但此时,由于子类的初始化工作还没进行。radius 也就没有被初始化成1。所以此时输出的是0
      

  2.   

    其实是这样的: 
    public B(){ 
        super();

    老师讲过的,呵呵……
      

  3.   

    结果是0
    ECLIPSE自动在private int radius; 里面加了个final,变成private final int radius
    结果就成了1
    越来越有趣了
      

  4.   

    1楼是正解,如果该成下面这样,就有1输出了。
    class A { 
        private int radius = 10; 
        public A() //构造方法
        { 
            draw(); 
        } 
        public void draw() 
        { 
             
        } 

    class B extends A 

        private int radius = 1; 
        public B() 
        { 
        } 
        public void draw() 
        {
            System.out.println(radius); 
        } 
        public static void main(String[] args) 
        { 
            B a = new B(); 
    System.out.println(a.radius);
        } 

      

  5.   

    2、按照在类声明中出现的次序依次执行所有域初始化语句和初始化块。 
    3、如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。 按照上面这两条规则,
    如果先执行第二步的话,那么private int radius = 10;  (这一句将被执行),然后再调用基类的构造函数.那么就是输出1啊
      

  6.   

    程序的入口是main方法,并且main方法是静态的,而private int radius = 10;不是静态的,他必须要在实例化对象以后才被执行。所以我在你那个程序最后加上了System.out.println(a.radius); 意思就是,在前面实例化对象a以后再输出。也可以这样改。在后面加上a.draw();自己去揣摩一下,应该可以理解的。1楼说的很正确:由于子类对象的初始化工作还没进行。radius 也就没有被初始化成1。所以此时输出的是0 。
      

  7.   

    关于初始化顺序,可以参照下:http://hi.baidu.com/johnsoncr/blog/item/567053134b45c1015aaf5390.html