1. 普通代码块:方法中的代码块, 不能单独执行, 必须调用方法才能执行
2. 构造代码块:在类中, 没有任何前缀和后缀, 使用"{}"包起来的代码块
3. 静态代码块:在类型,使用static修饰,并使用"{}"包起来的代码块
4. 同步代码块:使用synchronized修饰,并使用"{}"包起来的代码块
public class UserTest {
private int id;
private String name;
public static AtomicInteger count = new AtomicInteger(0);//统计实例化数量
{
count.getAndIncrement();
System.out.println("构造代码块 count =" + count);
}
static {
String str = "静态代码块执行...";
System.out.println(str);
}
public UserTest() {
this(count.get() + 1, "name"+(count.get() + 1));
System.out.println("UserTest()....");
}
public UserTest(int id) {
this.id = id;
System.out.println(String.format("UserTest(%s)....", id));
}
public UserTest(int id, Stringname) {
this.id = id;
this.name = name;
System.out.println(String.format("UserTest(%s,%s)....", id, name));
}
public static void main(String[] args) {
new UserTest(1);
new UserTest(2);
new UserTest(3, "name3");
new UserTest();
}
}
运行结果:
静态代码块执行...
构造代码块 count = 1
UserTest(1)....
构造代码块 count = 2
UserTest(2)....
构造代码块 count = 3
UserTest(3, name3)....
构造代码块 count = 4
UserTest(4, name4)....
UserTest()....
运行过程分析:
1. 在实例化一个对象之前, 先执行静态代码块, 而且只执行一次, 可以用来实例化全局变量, 用来做单例模式等等
2. 每次实例化一个对象之前, 都要先执行构造代码块, 所以可以把构造函数中通用的代码提取出来, 可以用来统计实例化次数等等
3. 如果构造函数调用了this()方法, 那么该构造函数不执行构造代码块, 被调用的构造方法中会执行构造代码块