/*
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 */