有三个类,Untitled1,Untitled2,Untitled3,依次继承。代码如下。
package c05;class Untitled1 {
  static {
    System.out.println("one's static block");
  }  Untitled1() {
    System.out.println("one's constructor");
  }  int i = aa();
  int aa() {
    System.out.println("one's aa()");
    return 1;
  }
}
--------------------------
package c05;public class Untitled2
    extends Untitled1 {  static {
    System.out.println("two's static block");
  }  Untitled2() {
    System.out.println("two's constructor");
  }  int i = aa();
  int aa() {
    System.out.println("two's aa()");
    return 2;
  }  public static void main(String[] args) {
    new Untitled1();
    System.out.println("*******");
    new Untitled2();
    System.out.println("*******");
    new Untitled3();
    System.out.println("*******");
    System.out.println("");
  }}
-----------------------------
package c05;public class Untitled3
    extends Untitled2 {
  static {
    System.out.println("three's static block");
  }  Untitled3() {
    System.out.println("three's constructor");
  }  int i = aa();
  int aa() {
    System.out.println("three's aa()");
    return 3;
  }   public static void main(String[] args) {
    new Untitled1();
    System.out.println("*******");
    new Untitled2();
    System.out.println("*******");
    new Untitled3();
    System.out.println("*******");
    System.out.println("");
  }
}
-------------------------
Untitled3的运行结果如下:
one's static blocktwo's static blockthree's static blockone's aa()one's constructor*******two's aa()one's constructortwo's aa()two's constructor*******three's aa()one's constructorthree's aa()two's constructorthree's aa()three's constructor*******
--------------------------
问题:在new Untitled2()时,为什么不是
one's aa()one's constructortwo's aa()two's constructor
在new Untitled3() 时,为什么不是
three's aa()one's constructorthree's aa()two's constructorthree's aa()three's constructor

解决方案 »

  1.   

    new Untitled2()时父类中的 int i=aa(); 这个aa方法在子类中改写了,因此要执行子类里边的aa
      

  2.   

    Untitled2 的aa方法override 它父类中的aa 方法 ,所以回出现那样的结果
      

  3.   

    我知道Untitled2,Untitled3已经override基类的aa() .
    但是在Untitle2.main()方法执行时候,首先载入Untitled1.class,Untitled1.class
    后开始执行new Untitled1()时,此刻Untitled1.aa()方法已经被Untitled2.aa() override,但执行的结果为什么是 
    one's aa()one's constructor 而不是 two's aa()one's constructor我知道这种理解错了,但是却不知道怎么转过这个弯,希望大侠指正。
      

  4.   

    one's static blocktwo's static blockthree's static block  前面三个因为是static所以都先初始化了,但是只初始化一次one's aa()  //new Untitled1()创建实例,首先实例化字段one's constructor //然后调用构造器*******two's aa()  //new Untitled2()创建实例,但是需要先创建一个父类的对象,也就是Untitled1
                //这里到下一句输出都是创建了一个Untitled1对象的,但是父类却调用了子类
                //Untitled2的int aa()方法,所以输出是two's aa()不是one's aa()
    one's constructor///这里当然是调用父类的构造器啦!!two's aa()  ///呵呵,这个输出是你想到的,但是要创建完父类对象,之后才创建子类的对象two's constructor*******three's aa()one's constructorthree's aa()two's constructorthree's aa()three's constructor//这里一个new Untitled3()竟然输出这么多,也是因为创建3需要创建2
                       //的对象,同理创建2的对象需要1的对象。只是你奇怪的是为什么他们都是调用了 Untitled3 的aa()方法,而不是各自的aa方法。确实这是奇怪的,所以你编程时应该小心注意这个。《java编程思想》中有提到这个问题,但是也不是很详细,你可以看看。*******
      

  5.   

    这里这能说是java的机制问题,我们不需要太过分了解,你看看《java编程思想》看看里面的这个小节的讨论能不能帮到你。
      

  6.   

    你把两个东西搞混了。创建子类对象时,从祖先开始,调用的方法全部是override的方法。这一点你现在可能很清楚了。创建“一个”对象时,它是不知道有没有子类,子类改写(override)了什么的,new Untitled1()当然不考虑什么子类的问题。
      

  7.   

    感谢 fankobe() 详尽的解释和指引
    感谢  yqj2065(严千钧) 
    接帖,希望日后再多多指点。