java----对象初始化及变量的缺省值

<---百草枯--->

qq:916923477<--->maooam;

对象初始化及变量的缺省值

初始化顺序的先静态对象,而后是非静态对象

 

1、第一次创建类的的对象或是调用类的静态方法/静态字段,会加载class文件
 
2、加载class文件后有关静态初始化的所有动作会执行
 
3、当用new创建对象时,首先在堆上为类对象分配足够存储空间
 
4、将这个存储空间清零,所有基本类型设置为缺省值,引用为NULL
 
5、执行所有出现于字段定义处的初始化动作
 
6、执行构造方法,当有继承时会涉及更多的动作。

 

示例代码:

 

public class StaticInitialization {   
  public static void main(String[] args) {    
    System.out.println("Creating new Cupboard() in main");    
    new Cupboard();    
    System.out.println("Creating new Cupboard() in main");    
    new Cupboard();    
    t2.f2(1);    
    t3.f3(1);     
  }  
  static Table t2 = new Table();  
  static Cupboard t3 = new Cupboard(); }
  class Bowl {  
    Bowl(int marker) {    
      System.out.println("Bowl(" + marker + ")");  
    }  
    void f(int marker) {    
      System.out.println("f(" + marker + ")");  
    }
  }
  class Table {  
    static Bowl b1 = new Bowl(1);  
    Table() {    
      System.out.println("Table()");    
      b2.f(1);  
    }  
    void f2(int marker) {    
      System.out.println("f2(" + marker + ")");  
    }  
    static Bowl b2 = new Bowl(2);
  }
  class Cupboard {  
    Bowl b3 = new Bowl(3);  
    static Bowl b4 = new Bowl(4);  
    Cupboard() {    
      System.out.println("Cupboard()");    
      b4.f(2);  
    }  
    void f3(int marker) {    
      System.out.println("f3(" + marker + ")");     
    }  
    static Bowl b5 = new Bowl(5);
}

 

运行结果:

     
      "Bowl(1)",
      "Bowl(2)",      
  "Table()",      
  "f(1)",      
  "Bowl(4)",      
  "Bowl(5)",      
  "Bowl(3)",      
  "Cupboard()",      
  "f(2)",      
  "Creating new Cupboard() in main",      
  "Bowl(3)",      
  "Cupboard()",      
  "f(2)",      
  "Creating new Cupboard() in main",      
  "Bowl(3)",      
  "Cupboard()",      
  "f(2)",      
  "f2(1)",      
  "f3(1)"

 

结果分析:

     在程序一开始加载的时候,就会先执行:

1、 static Table t2 = new Table();
2、 static Cupboard t3 = new Cupboard();

 

在执行1的时候又会跳转到class Table{}里面去,class Table{}里面又有static Bowl b1 = new Bowl(1);所以跳转到class Bowl{}执行它的构造方法,所以先输出Bowl(1);回到class Table{}继续往下面执行,继续执行Table后面的static Bowl b2 = new Bowl(2);所以又输出Bowl(2);然后就执行Table的构造方法;然后又执行b2.f(1);

总结:

 

先执行静态,再执行构造函数,然后就执行普通。

 

 

posted on 2013-08-17 00:21  Jason-liang  阅读(904)  评论(0)    收藏  举报

导航