`
bianku
  • 浏览: 69836 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

初始化顺序问题

    博客分类:
  • Java
JVM 
阅读更多
首先看一段程序:	

 

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. 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics