1、什么是代码块
首先,什么是代码块?
其实 ,代码块是指使用{}即花括号定义的一段代码。
代码块共分为四种,分别为:普通代码块、静态代码块、实例代码块(非静态代码块)以及同步代码块,在这里,我们只讨论前三种。
2、普通代码块
普通代码块就是定义在方法中的代码块,用处较少:
public class Test {
public static void main(String[] args) {
{
//普通代码块
int a = 1;
System.out.println(a);
}
}
}
普通代码块的执行没有条件限制,一定会执行
但是我们需要注意的是,如果在普通代码块中定义了变量,那这个变量的作用域就是这个代码块,不能在代码块之外再使用:
3、静态代码块
用static修饰的代码块称为静态代码块。
3.1 静态代码块知识点汇总
我们先上相关结论,然后再作解释:
1.静态代码块定义在类的里面,方法的外面
2.静态代码块一般用来初始化静态成员变量(静态代码块中不能初始化普通成员变量)
3.静态代码块在类加载的时候就被执行,且只会执行一次(因为类只会被加载一次)
4.如果出现多个静态代码块,执行顺序和定义顺序有关
3.2 知识点逐个解释
1.静态代码块定义在类的里面,方法的外面
2.静态代码块一般用来初始化静态成员变量(静态代码块中不能初始化普通成员变量)
而不能初始化普通成员变量,因为普通成员是依赖于对象的:
3.静态代码块在类加载的时候就被执行,且只会执行一次
我们可以看到,我们没有实例化任何对象,但静态代码块依旧被执行,可以得出结论:静态代码块在类加载的时候就被执行,且只会执行一次(因为类只会被加载一次)
4.如果出现多个静态的或多个静态代码块,执行顺序和定义顺序有关
由于就地初始化要比静态代码块中的初始化顺序要早,故age中最终存储的值为静态代码块中的初始化值。
当我们将两者顺序交换:
我们发现,打印的值又为就地初始化的值,故我们可以得出结论:如果出现多个静态代码块,执行顺序和定义顺序有关
4、实例代码块(非静态代码块)
4.1 实例代码块知识点汇总
我们也先说结论
1.实例代码块定义在类的里面,方法的外面
2.实例代码块一般用来初始化普通成员变量
3.只有在实例化对象的时候才会被执行,且每实例化一次对象就会被执行一次
4.如果出现多个实例代码块,执行顺序和定义顺序有关
4.2 知识点逐个解释
1.实例代码块定义在类的里面,方法的外面
2.实例代码块一般用来初始化普通成员变量
3.只有在实例化对象的时候才会被执行,且每实例化一次对象就会被执行一次
如下图所示,我们可以看到,当我们不实例化任何对象,实例代码块不会被执行,只有静态代码块被执行:
而当我们实例化对象:
可以发现,只有实例化对象的时候实例代码块才会被执行,且每实例化一次,实例代码块就会被执行一次。
4.如果出现多个实例代码块,执行顺序和定义顺序有关
我们可以发现,无论如何,最后定义的实例代码块完成了最终的赋值
故:如果出现多个实例代码块,执行顺序和定义顺序有关。
5、静态代码块、实例代码块、构造方法的执行顺序
根据所学知识,我们知道,我们通过静态代码块、实例代码块、构造方法都可以完成对成员变量的初始化,但这三种方式的执行的先后顺序如何呢?
我们先给出结论:
1.一定是先执行静态代码块、再执行实例代码块、最后执行构造方法。
2.若出现同级的,则执行顺序和定义顺序有关,但一定是先执行静态代码块、再执行实例代码块、最后执行构造方法。
我们用代码来完成佐证:
同理,若我们在同时在静态代码块、实例代码块、构造方法中对同一个成员变量进行初始化时,最终值应为构造方法中的值。
OK~本次博客到这里就结束了,
感谢大家的阅读~欢迎大家在评论区交流问题~
如果博客出现错误可以提在评论区~
创作不易,请大家多多支持~