Java中类的数据成员的初始化顺序

 

  对于单一类:
  属性初始化 ---> 按顺序执行静态初始化块(只能操作静态属性)
  ---> 按顺序执行初始化块 ---> 构造方法

 

  对于存在继承关系的类:
  父类属性初始化 ---> 按顺序执行父类静态初始化块 ---> 按顺序执行子类初始化块
  ---> 按顺序执行父类普通初始化块 ---> 父类构造方法
  ---> 按顺序执行子类普通初始化块 ---> 子类构造方法

 

  要点1:对于静态初始化块,无论声明多少次对象,只会执行一次
  要点2:在主函数之前,会优先桉顺序执行所在类(代码中的Test类)的静态初始化块,之后才执行主函数的内容

 

参考代码: 

以下是包含main函数的Test类

 

package com.hao;

class Test{
    
    //数据成员
    static int a = 1;
    
    //普通初始化块1
    {
        System.out.println("Test类普通初始化块1");
        
    }
    
    //静态初始化块1
    static{
        System.out.println("Test类静态初始化块1");
    }
    
    //普通初始化块2
    {
        System.out.println("Test类普通初始化块2");
    }
    
    //构造方法
    Test(){    
        System.out.println("Test类构造方法");
    }
    
    //普通初始化块3
    {
        System.out.println("Test类普通初始化块3");
    }
    
    //静态初始化块2
    static{
        System.out.println("Test类静态初始化块2");
    }
    
    
    
    
    
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        
        //在主函数之前,会优先桉顺序执行所在类的静态初始化块,之后才执行主函数的内容
        System.out.println("Hello,World");
        Animal a = new Dog();
        Animal b = new Dog();
//        Test a = new Test();
//        Test b = new Test();
        
    }


}//Test
View Code

 

 

 

以下是父类Animal的代码内容:

 

package com.hao;

public class Animal {
    
    static int a = 11;
    
    /* 
     *    可观察得到a的变化情况为 11 14 16 13 15 12
     */
    
    //父类构造方法
    Animal(){
        System.out.println("父类构造方法");
        System.out.printf("%d ---> ", a);
        a = 12;
        System.out.println(a);
    }
    
    //父类普通初始化块1
    {
        System.out.println("父类普通初始化块1:");
        System.out.printf("%d ---> ", a);
        a = 13;
        System.out.println(a);
    }
    
    //父类静态初始化块1
    static{
        System.out.println("父类静态初始化块1");
        System.out.printf("%d ---> ", a);
        a = 14;
        System.out.println(a);
    }
    
    
    //父类普通初始化快2
    {
        System.out.println("父类普通初始化块2");
        System.out.printf("%d ---> ", a);
        a = 15;
        System.out.println(a);
    }
    
    //父类静态初始化块2
    static{
        System.out.println("父类静态初始化块2");
        System.out.printf("%d ---> ", a);
        a = 16;
        System.out.println(a);
    }

}//Animal
View Code

 

 

 

以下是子类Dog的代码内容:

 

package com.hao;

public class Dog extends Animal {
    
    //子类中的a变化顺序为 12->23->25->22->24->21 
    
    //子类构造方法
    Dog(){
        System.out.println("子类构造方法");
        System.out.printf("%d ---> ", a);
        a = 21;
        System.out.println(a);
    }
    
    //子类普通初始化块1
    {
        System.out.println("子类普通初始化块1");
        System.out.printf("%d ---> ", a);
        a = 22;
        System.out.println(a);
    }
    
    //子类静态初始化块1
    static{
        System.out.println("子类静态初始化块1");
        System.out.printf("%d ---> ", a);
        a = 23;
        System.out.println(a);
    }
    
    //子类普通初始化块2
    {
        System.out.println("子类普通初始化块2");
        System.out.printf("%d ---> ", a);
        a = 24;
        System.out.println(a);
    }
    
    //子类静态初始化块2
    static{
        System.out.println("子类静态初始化块2");    
        System.out.printf("%d ---> ", a);
        a = 25;
        System.out.println(a);
    }
    
}
View Code

 

 

 

上述代码a的值的变化顺序依次为  11 14 16 23 25 13 15 12 22 24 21 (这里开始是第二个对象的了) 13 15 12 22 24 21

 

posted @ 2016-05-17 15:09  tan90丶  阅读(414)  评论(0编辑  收藏  举报