块 {}:在java中自成作用域,可以分为
| 静态代码块 | 构造代码块 | 普通语句块 | 同步代码块 | |
| 声明位置 | 类中,方法外 | 类中,方法外 | 方法中 | fynchronized(){} |
| 作用 | 整个类进行某些初始化操作(静态属性赋值...) | 构造代码块是为对象初始化操作(为静态或非静态成员属性赋值...) | 声明一些临时变量等.. | 控制并发 |
| 执行时机 | 类第一次加载时,只执行一次,如果多个静态块,从上倒下一次执行 | 创建对象时,执行构造器代码之前执行,如有多个,从上倒下一次执行 | 跟随方法执行 | 跟对方法执行 |
{}定义在方法中|语句块中 : 局部代码块|普通语句块 (执行时机 : 跟随方法)
{}定义在类中方法外 : 构造块 |成员代码块 (执行时机 : 跟随new)
static{}定义在类中方法外 : 静态块 (执行时机 : 类第一次加载)
同步代码块 : 后面用到再写
注意 :
1、构造块中的代码先于构造器代码之前执行,因为在编译期间构造块代码会被编译到要执行的构造器
内部,构造器代码之前
2、如果存在多个构造块,从上到下依次执行
3、静态块中的内容在类第一次加载完成之后就执行,并且只执行一次,先与main方法执行
4、如果存在多个静态块,从上到下依次执行
执行顺序 : 静态块 --> main ---> 构造块 --> 构造器
下方有块的经典题,红字代码
public class Class001_Block {
static int i = 10;
int j;
//静态块
static{
System.out.println("我是静态块1");
}
static{
System.out.println("我是静态块2");
}
static{
System.out.println("我是静态块3");
}
public Class001_Block(){
System.out.println("构造器...");
}
public Class001_Block(int j){
System.out.println("构造器...");
}
//构造块
{
j = 10;
System.out.println("构造块1");
}
{
System.out.println("构造块2");
}
{
System.out.println("构造块3");
}
public static void main(String[] args) {
i = 1;
//局部代码块|普通语句块
{
System.out.println("局部代码块");
int i = 5;
System.out.println(i); //5
}
System.out.println(i); //1
Class001_Block cb = new Class001_Block();
Class001_Block cb2 = new Class001_Block();
}
}
//找到打印顺序+结果(、号前填写顺序)
public class Class002_BlockTest {
public static int a = 0;
{
a = 10;
System.out.println(" 、非静态代码块执行a=" + a); //
}
static {
a = 6;
System.out.println(" 、静态代码块执行a=" + a); //
}
public Class002_BlockTest() {
this(a); //
System.out.println(" 、"+a); //
System.out.println(" 、无参构造方法执行a=" + a); //
}
public Class002_BlockTest(int n) {
System.out.println(" 、"+n); //
System.out.println(" 、"+a);//
}
public static void main(String[] args) {
System.out.println(" 、main"); //
Class002_BlockTest tsc = new Class002_BlockTest();
}
}



