对于单一类:
属性初始化 ---> 按顺序执行静态初始化块(只能操作静态属性)
---> 按顺序执行初始化块 ---> 构造方法
对于存在继承关系的类:
父类属性初始化 ---> 按顺序执行父类静态初始化块 ---> 按顺序执行子类初始化块
---> 按顺序执行父类普通初始化块 ---> 父类构造方法
---> 按顺序执行子类普通初始化块 ---> 子类构造方法
要点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