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
以下是父类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
以下是子类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); } }
上述代码a的值的变化顺序依次为 11 14 16 23 25 13 15 12 22 24 21 (这里开始是第二个对象的了) 13 15 12 22 24 21