日期:2014-05-20  浏览次数:20647 次

新手求助:关于子类调用构造器的继承问题!!
很简单的一个程序,但是就是想不明白,大牛们来帮下吧~ java编程思想上面的一个练习题。

class Component1b { 
public Component1b(int i) { 
System.out.println("Component1b " + i); 


 
class Component2b { 
public Component2b(int i) { 
System.out.println("Component2b " + i); 


 
class Component3b { 
public Component3b(int i) { 
System.out.println("Component3b " + i); 


 
class Rootb { 
Component1b c1 = new Component1b(1); 
Component2b c2 = new Component2b(2); 
Component3b c3 = new Component3b(3); 
public Rootb() { System.out.println("Rootb1");}
public Rootb(int i) { System.out.println("Rootb2"); } 

 
class Stemb extends Rootb { 
 
Component1b c1 = new Component1b(4); 
Component2b c2 = new Component2b(5); 
Component3b c3 = new Component3b(6); 
 
public Stemb(int i) {
super(i);
System.out.println("Stemb"); 



 
public class test { 
public static void main(String args[]) { 

new Stemb(47); 
 

}



程序的输出结果如下:
Component1b 1
Component2b 2
Component3b 3
Rootb2
Component1b 4
Component2b 5
Component3b 6
Stemb

我有个地方想不明白。按照正常的初始化顺序应该是先初始化变量和对象,然后才是构造器方法。得出的结果应该是
Component1b 1
Component2b 2
Component3b 3
Rootb2
Component1b 4
Component2b 5
Component3b 6
Rootb2
Stemb

倒数第二行的结果没有出现,super(i)自动被忽略了。 我设置了断点之后 发现执行过程是这样的:程序首先跳到子类的构造函数中找到super(i),然后才初始化基类成员变量,基类对象。然后初始化子类成员变量,执行子类构造函数。在执行子类构造函数的时候,自动跳过了super(i)这一父类构造函数。  

这一点和我上面提到的正常初始化顺序又有矛盾了。如果是这样的话 子类的成员变量应该优先被初始化才对。
大牛们 谁能帮我解答下疑惑。是不是,在涉及到新建子类是,java默认设定的规则就是先到子类的构造函数中寻找合适的父类构造方法,然后按照正常的顺序初始化父类成员变量,执行父类构造方法,初始化子类成员变量,执行子类构造函数。而最重要的一点,子类构造函数中父类的构造方法在这时候不会执行??谢谢啦



------解决方案--------------------
探讨
引用:

很好理解啊,首先初始化基类的成员变量,然后调用super(i),就是public Rootb(int i) { System.out.println("Rootb2"); } 这个方法,然后在System.out.println("Stemb"); 之前又会初始化子类的成员变量,这时super(i)已经执行过了,当然不会再执行了,之后再执行System.o……