class A {
  String name = isName();  String isName() {
    System.out.println("222222222");
    return null;
  }  A() {
    System.out.println("333333333");
  }
}class B extends A {
  String name = isName();  String isName() {
    super.isName();
    System.out.println("1111111111");
    return "aa";
  }
}class Demo {
  public static void main(String[] args) {
    A b = new B();
  }
}
222222222 1111111111 333333333 222222222 1111111111 运行结果, 为什么会这样呢,请给解释下? 

解决方案 »

  1.   

    参看老贴 http://topic.csdn.net/u/20080601/18/9dd3112b-8722-40ad-9af6-000cbb35768f.html
      

  2.   

    你可以断点单步调试一下就知道顺序了,肯定是这样的。
     A b = new B();  时,应该追溯父类A的构造函数,在调用A构造函数之前,会执行属性的初始化,也就是A类中的String name = isName(); ,由于这里的isName()方法被子类重写了,所以这里调用的是子类的isName()方法,即String isName() { 
        super.isName(); 
        System.out.println("1111111111"); 
        return "aa"; 
      } 因此首先就打印出 222222222 1111111111然后,调用父类A构造函数打印出333333333 
    最后调用子类B的构造函数,在调用构造函数之前同样对属性进行初始化,调用isName(),结果又打印出222222222 1111111111因此,结果就是如你所看到的一样了,呵呵,注意红色部分。 
      

  3.   

    类的执行顺序为:
    1、执行自身的构造函数,print null
    2、执行类中的其他定义 print a.isName() =>22..,11..
    3、执行父类的构造函数,print 33..
    4、执行父类中的其他定义,注意 A中的isName函数已经被B重置了,所以最后是执行B中的isName print 22..,11..