已经知道了“构造方法无法被继承”且“创建一个子类对象时会调用父类的构造方法”下面这段代码
当运行Test类的Main方法时加载了A,B,C三个类
那么"C c=new C();"时,是应当先调用根基类(A)的构造方法,然后再依次B,C“super会调用其直接父类的构造方法”
但是"super('xxx');"却是在C类的构造方法中,按照上面"A-B-C"的顺序应当最后才被指向其直接父类“B”的构造方法才对而结果却是
A
XXX-B望高人指点迷经class Test{ public static void main(String[] args) 
{
C c=new C();
}
}class A{

A(){
System.out.println("A");
} A(String s){
System.out.println("XXX-A");
}
}class B extends A{

B(){
System.out.println("B");
} B(String s){
System.out.println("XXX-B");
}
}class C extends B{

C(){
super("XXX");
}
}运行结果为
A
XXX-B

解决方案 »

  1.   

    调用父类的构造方法就是通过super()来调用的。任何类(除了Object)的构造方法被调用时,要做的第一件事就是调用super(),而不管你有没有书写"super();"语句,这就是为什么super()必须是构造函数中的第一条语句的原因。如果你没有在类的构造方法中显式书写super();语句,那么编译器会为你加上;这时如果编译器找不到父类中的无参构造函数,则不会继续编译并提示错误。所以,执行new C()的时候,先会寻找其父类B中与super("XXX")相匹配的构造函数版本,即B(String s){ System.out.println("XXX-B"); }方法,而这个方法中没有显式的super()语句,则调用编译器为你添加的super(),即父类中的无参构造函数,这将会和A中的A() { System.out.println("A"); }相匹配,当父类中的构造函数依次被调用完毕后,重新回到C的构造函数中往下执行。
      

  2.   

    super();指调用基类的构造方法..  c中构造方法调用super("xxx");到B(String s) B执行属于B的默认构造方法A();
      

  3.   

    Dan1980() 说得非常详细,又学到了点
      

  4.   

    默认添加的是super(),所以调用的是类A里的构造函数A()。
    以前还真没仔细考虑过这个问题呢。