一、初始化块
1、在Java语言中,初始化块和属性、方法、构造器处于平等的地位。在一个类里面可以有多个初始快,在相同类型的初始块之间是有顺序的,其中前面定义的初始化块先执行,后面定义的初始化块后执行。
2、 语法格式:

修饰符{
 // 执行代码
}

3、Java 有两种初始化块
1) 静态初始化块(修饰符为static) :当类装载到系统时执行一次(只执行一次)。在静态初始化块,如果想初始化变量,只能初始化static 修饰的数据成员。
2)非静态初始化块 (省略修饰符) : 每个对象生成时都会被执行一次,可以初始化实例变量。

下面分类阐述下 两类初始快

二、(普通)初始块
在Java中可以通过初始块进行数据赋值
例如:

public class StaticInitBlock {

// 定义一个成员变量
String name;
//通过初始块为成员变量赋值
{
   name = "rose";  
}

}

在类的声明中,可以包含很多初始块,当类创建的实例时,就会依次执行这些代码,而且优先于构造函数执行。

三、静态初始块
1、静态初始快只在类加载时执行,且只能执行一次(类似Objective-c中的+ (void)initialize 方法)
换句话说: 当第一次为该类创建对象时,该类的静态变量已经被赋值,当再次创建该类对象时,不走静态初始块代码。该类所有对象共享静态成员变量的值。
2、静态初始快只能给静态变量赋值,不能初始化普通的成员变量
普通初始化既能给静态变量赋值(一般不这么做),也能给普通成员变量赋值
3、看下面一个例子:创建一个类文件,命名为StaticInitBlock

public class StaticInitBlock {

    //声明变量num1
    int num1;
    //声明变量num2
    int num2;
    //声明静态变量nun3
    static int num3;
    //声明静态成员变量num4;
    //static int num4;
        //构造方法
    public StaticInitBlock(){
        num1 = 90;

        System.out.println("通过构造方法给num1赋值");
    }

    //(普通)初始块
    {
        num2 = 56;
        //num4 = 50; //普通初始快也可以对静态成员变量赋值,但是一般不这么做
        System.out.println("通过(普通)初始块给num2赋值");
    }

    //静态初始块
    static{

        num3 = 15;
        System.out.println("通过静态初始块给num3赋值");

    }
    public static void main(String[] args) {
        StaticInitBlock block1  = new StaticInitBlock();
        System.out.println("num1="+block1.num1);
        System.out.println("num2="+block1.num2);
        System.out.println("num3="+StaticInitBlock.num3);
        //System.out.println("num4="+StaticInitBlock.num4);
        StaticInitBlock block2  = new StaticInitBlock();    
    }

}

输出结果:

通过静态初始块给num3赋值
通过(普通)初始块给num2赋值
通过构造方法给num1赋值
num1=90
num2=56
num3=15
通过(普通)初始块给num2赋值
通过构造方法给num1赋值

通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 block2 时并未执行静态初始化块。

四、初始化顺序图

1、非继承关系的初始化顺序

java static块能传参吗 java中static块_初始化

.
.

2、继承关系的初始化顺序

java static块能传参吗 java中static块_static_02

.
.

五、练习笔记
创建一个类,命名为 StaticBlockPartise

public class StaticBloclPartise {


    //声明成员变量
    String name;
    //声明成员变量
    String sex;
    //声明静态成员变量
    static int age;


    //构造方法
    public StaticBloclPartise(){

        name = "rose";
        System.out.println("通过构造方法初始化name");
    }

    // 普通初始块
    {

        sex = "男";
        System.out.println("通过普通初始块初始化sex");
    }

    // 静态初始快
    static{

        age = 28;
        System.out.println("通过静态初始块初始化age");
    }

    //定义一个show方法
    public void show(){
        System.out.println("姓名:"+name+",性别:"+sex+",年龄:"+StaticBloclPartise.age);
    }

    public static void main(String[] args) {

        //实例化对象
        StaticBloclPartise block = new StaticBloclPartise();
        //调用show方法
        block.show();

    }

}

输出结果

`
通过静态初始块初始化age
通过普通初始块初始化sex
通过构造方法初始化name
姓名:rose,性别:男,年龄:28

赶紧打开eclipse验证下吧。