应用三:static + 代码块 vs 代码块
概念:
静态代码块:被static修饰的,定义在类内部,用{}括起的代码段。
构造代码块:没有被static修饰的,定义在类内部,用{}括起的代码段。
普通代码块:定义在方法内部,用{}括起的代码段。
特征:
静态代码块:
-
只能出现在类内,不允许出现在方法内。
-
可以出现多次,按顺序在类加载时执行。
-
无论该类实例化多少对象,只执行一次。
构造代码块:
-
可以在类内出现多次,按顺序在每个对象实例化时执行。
-
执行优先级:晚于静态代码块,高于构造方法。
-
每次执行对象实例化时,均会执行一次。
普通代码块:
- 可以在方法内出现多次,按顺序在方法调用时执行。
应用:
静态代码块:基于性能优化的考量,多适用于需要在项目启动时执行一次的场景,譬如项目资源整体加载等。
构造代码块:多适用于类中每个对象产生时都需要执行的功能封装。与构造方法的区别在于,构造方法是在new执行时有选择性的调用带参或者无参构造,而构造代码块则是,在每个对象实例化时都一定会执行。
普通代码块:适用于在方法内进行代码功能拆分。
示例:
定义国产车类CarDemo,包含静态成员firm,非静态方法run;定义测试类CarTest,针对CarDemo进行测试
备注:此处由于展示篇幅有限,暂不考虑属性的访问权限
- 当CarDemo类在静态代码块和构造代码块中分别对静态成员赋值,并添加构造方法
测试类CarTest中实例化CarDemo,并调用run方法
运行结果:
总结:
1、执行优先级:静态代码块>构造代码块>构造方法
2、执行次数:静态代码块只执行1次;构造代码块、构造方法随对象实例化个数而定
- CarDemo类中添加成员属性color,并在静态代码块和构造代码块中分别对color进行赋值时
错误提示:不能在静态块中操作非静态成员
总结:
1、不能在静态代码块中直接对非静态成员赋值。
2、可以在构造代码块中直接操作静态和非静态成员。
- 当将属性定义移入静态代码块时
错误提示分别为:不允许在静态代码块中声明静态成员;无法在构造代码块中访问到相关成员。
总结:
1、不能在静态代码块声明静态成员,可以声明非静态成员。
2、静态代码块中声明的成员,在外部无法进行访问。
- 当在run方法中分别添加2个代码块时
运行结果为:
- 当在两个代码块上部添加同名局部变量声明时:
错误提示:不允许定义重名变量
总结:
1、普通代码块在方法内顺序执行,各自作用范围独立。
2、方法内定义的局部变量,作用范围为:自定义位置起,至方法结束。在此期间,不允许方法中普通代码块内存在局部变量的声明。