继承(三):子父继承中构造函数的执行顺序

/*
1,Zi类进堆后,先初始化num为0,
2,紧接着执行super语句,跳转到父类构造函数处
3,父类构造函数中有show()函数,但是它会先在子类中寻找此函数,发现子类中有这个函数,则执行子类中的show()函数。此时num仍然为0
4,接着super语句完成,继续回到子类构造函数中执行接下来的语句。num初始化为9,并执行下面的输出语句
*/
1
class Fu 2 { 3 Fu() 4 { 5 show(); 6 } 7 8 void show() 9 { 10 Sop("Fu show");//父类中的输出 11 } 12 13 } 14 15 class Zi extends Fu 16 { 17   int num = 9; 18 19   Zi() 20   { 21     //super();隐性,是父类索引,必须放在构造函数第一行,意味先执行父类初始化,再执行子类初始化,这样可以让子类初始化不被父类覆盖 22     Sop("Zi show..."+num); 23   } 24 25   void show() 26   { 27     Sop("show..."+num); 28   } 29 30 } 31 32 /* 33 34 show...0 35 Zi show...9 36 37 */

 

2、构造代码块

/*
构造代码块先于构造函数执行
*/

1
class Zi 2 { 3 int num = 9; 4 5 { 6 Sop("constructor code ..."+num); 7 } 8 Zi() 9 { 10 Sop("Zi constructor..."+num); 11 } 12 13 } 14 /* 15 constructor code ...9 16 Zi constructor ...9 17 */

 

3、子父类中的构造代码块、构造函数的执行顺序

super()(show()函数的调用参照上一条)→显示初始化→构造代码块(如有赋值操作则再次赋值)→构造函数(完成Zi类中super后剩余的部分)

class Fu
{
    Fu()
    {
        show();
    }
    void show()
    {
        Sop("Fu show");
    }
}
class Zi
{
    int num = 9;
    
    { 
        Sop("constructor code ..."+num);
        num = 10;//给num重新赋值
    }
    
    Zi()
    {
        //super();
        Sop("Zi constructor ..."+num);
    }

    void show()
    {
        Sop("Zi show..."+num);
    }
}

/*
show...0
constructor code ...9
Zi constructor ... 10
*/

 

posted @ 2016-04-05 16:50  生姜不爱蒜  阅读(397)  评论(0编辑  收藏  举报