class A{
int a = 1;
A(){
System.out.println("执行了A的构造函数");
}
}
class B extends A{
int b = 2;
B(){
System.out.println("执行了B的构造函数");
}
}
class C extends B{
int c = 3;
C(){
System.out.println("执行了C的构造函数");
}
}
public class Inher14 {
public static void main(String[] args) {
C ob = new C();
System.out.println(ob.a);
System.out.println(ob.b);
System.out.println(ob.c);
System.out.println(ob.toString());
}
}
请问段代码的输出结果是什么?执行的顺序是怎样的?为什么?求高手们给一个详细的解答。

解决方案 »

  1.   

    你这个就是顺序执行的啊
    都从写了构照函数就不调用继承的了结果是执行了A的构造函数
    执行了B的构造函数
    执行了C的构造函数
    1
    2
    3
    C@de6ced
      

  2.   

    执行了A的构造函数
    执行了B的构造函数
    执行了C的构造函数
    1
    2
    3
    C@2e6e14081、执行自己的构造方法之前一定先执行父类构造方法(除了直接从Object类继承外,Object类没有构造方法)
    2、C从B继承了成员b,B从A继承成员a
    3、没有重写toString方法,所以调用的是Object中的toString方法.方法一个由类名+@+hashcode的字符串
      

  3.   

    执行了A的构造函数
    执行了B的构造函数
    执行了C的构造函数
    1
    2
    3
    C@de6cedC ob = new C();执行的时候 将会一级一级向上调用父类的构造方法,所有依次调用A类B类C类的构造方法输出三条语句,C类对象一经创建好后就不会再调用父类构造方法了,所以只输出了三条语句,然后分别调用变量a , b , c
    最后toString方法返回了C@de6ced,就是 c类的名字@哈希码。是Object类的toString方法,没有重写
      

  4.   

    C类对象一经创建好后就不会再调用父类构造方法了
    我感觉这句话才是LZ当时不明白的原因吧!就像ls说的