一、初始化块
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、非继承关系的初始化顺序
.
.
2、继承关系的初始化顺序
.
.
五、练习笔记
创建一个类,命名为 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验证下吧。