温故而知新,代码块这东西时间一长一些东西容易忘记,比如静态代码块、非静态代码款、静态成员变量初始化、动态成员变量初始化、构造方法调用、类加载等等的顺序机制是怎么样的?
话不多说了,一个例子足以说明一切:
package com.collectiontest;
import org.junit.Test;
public class BasicTest {
@Test
public void testBlock()
{
System.out.println("m1:");
Mimi m1=new Mimi();
System.out.println("m2:");
Mimi m2=new Mimi();
}
}
class Mimi {
public static int si=0;
int di=si;
static{
si++;
System.out.println("static block1: si="+si);
}
{
//si*=2;
System.out.println("block2: si="+si+", di="+di);
}
static{
si++;
System.out.println("static block2: si="+si);
}
public Mimi() {
di=10;
System.out.println("constructor: si="+si+", di="+di);
}
}
执行结果:
m1:
static block1: si=1
static block2: si=2
block2: si=2, di=2
constructor: si=2, di=10
m2:
block2: si=2, di=2
constructor: si=2, di=10
这说明:静态成员变量初始化和静态代码块都是在第一次加载这个类的时候被调用的(不是main方法运行的时候哦)。
执行顺序是:
静态成员变量初始化
静态代码块调用
动态成员变量初始化
非静态代码块调用
构造方法调用