撰写时间:2019年04月18日
Java初始化块根据有无static修饰分为两类:
1、无static修饰的:初始化块
2、有static修饰的:静态初始化块
作用:初始化数据
初始化块跟构造器相似,初始化块相当于构造器的补充,用于创建对象是给对象的初始
化,不同的是初始化块比构造器多个优势是——先执行。
我们可能有四五个构造器,如果每个构造器都要写一遍就重复了,这时候我们就把这部
分需要初始化的代码放到初始化块,无论执行哪一个构造器,初始化块都是优先执行的。
多个初始化块就是按照代码的默认顺序从上到下执行 ,然后到构造器
实际上,经过编译后,非静态块已经添加到构造器中,且位于所有构造器代码的前面
初始化块
{
}
静态初始化块用static修饰,又叫类初始化块,
凡是static修饰的都是类的东西,非static它就属于实例的东西
静态初始化块
static{
}
静态初始化块又在普通初始化块之前,它是在类加载的时候加载
静态初始化块执行一次,因为它是在类第一次加载的时候加载的,类加载过一次以后就
不会再加载(静态块在类的初始化阶段完成的,因此在创建某个类的第二对象时,该类
的静态块就不会执行了)
下面简单测试一下:
创建一个Class:Initializationblock
创建构造器、初始化块、静态初始化块
/
/构造器
public Initializationblock(){
System.out.println("无参构造器00000000");
}
public Initializationblock(int a){
System.out.println("一个参数的构造器00000000");
}
//初始化块
{
System.out.println("初始化块11111111");
}
{
System.out.println("初始化块22222222");
}
//静态初始化块
static{
System.out.println("静态初始化块01010101");
}
static{
System.out.println("静态初始化块0202020202");
}
创建另外一个Class:Demo1实例化它
public class Demo1 {
public static void main(String[] args) {
System.out.println("------第一次执行-----");
Initializationblock initializationblock=new Initializationblock();
}
}
执行效果可以看出静态初始块确实是在最前面按循序执行,然后到初始化块再到构造器
接下来再实例化两次,看下是不是不会再进行静态初始化块
public class Demo1 {
public static void main(String[] args) {
System.out.println("------第一次实例化-----");
Initializationblock initializationblock=new Initializationblock();
System.out.println("------第二次实例化-----");
Initializationblock initializationblock2=new Initializationblock();
System.out.println("------第三次实例化-----");
Initializationblock initializationblock3=new Initializationblock();
}
}
通过这个结果可以看出第二第三次创建类的对象时静态初始化块都没有执行。
在继承中,是先将所有父类的静态块进行完了再都子类的,然后是父类的初始化块和构
造器,然后到子类的,多重继承中是先第一个被继承的父类到第二个再到子类
创建三个Class:One/Two/Three,Two继承One,Three继承Two
public class One {
public One(){
System.out.println("1构造器");
}
{
System.out.println("1初始化块");
}
static {
System.out.println("1静态初始化块");
}
}
public class Two extends One{
public Two(){
System.out.println("2构造器");
}
{
System.out.println("2初始化块");
}
static {
System.out.println("2静态初始化块");
}
}
public class Three extends Two{
public Three(){
System.out.println("3构造器");
}
{
System.out.println("3初始化块");
}
static {
System.out.println("3静态初始化块");
}
}