abstract class A{
         public A(){
                   this.print() ;
         }
         public abstract void print() ;
}
class B extends A{
         private int i = 10 ;
         public B(int i){
                   this.i = i ;
         }
         public void print(){
                   System.out.println(this.i) ;
         }
};
public class Demo{
         public static void main(String artgs[]){
                   new B(100) ;
         }
};结果是  0;    很是不懂!
希望哪位详细解释下,谢谢!

解决方案 »

  1.   

    debug跟踪一下,最清晰.public B(int i)方法前,先调用父类的构造public A(),然后执行this.print();执行System.out.println(this.i) ;此时i还没有赋值,也就是private int i = 10 ;这句还没有执行,此时的i值为初始化的值0.
      

  2.   

    当你new B(100);的时候,代码执行顺序为:public B(int i){
             public A(){
                    this.print(){
                           System.out.println(this.i) ;
                    }
             }
             this.i = i ;
    }这样你应该明白为什么是0了么?
      

  3.   

    要弄清初始化的过程
      1.当new B(100) 时,jvm会在内存中申请一块恰好够放下B的内存。
      2.这块内存清零。也就这块内存用二进制的0填存之。这时所有成员都被初始化为0了。
      3.调用子类的构造方法,本例中调用的是B的构造方法。
      4.子类构造中,第一件事就是调用父类的构造方法。本例中调用了类A的构造方法,执行了print()方法,打印出i的值,结果当然是0.
      5.父类的构造方法结束后,子类的成员按它们出现的次序初始化。本例中i=10被执行。
      6.继续执行子类构造方法中的其它语句。本例中执行i=100.  
      

  4.   

    上面的次序是thinking in java 中作者说的.