java代码块
概念
java中有四种代码块类型:分别为普通代码块,静态代码块,构造代码块,同步代码块
普通代码块:方法中的条件语句,循环语句等用{}包括起来的代码
静态代码块:类中用static修饰的{}包括起来的代码
构造代码块:类中没有任何修饰的{}包括起来的代码块
同步代码块:方法中用同步锁synchronized修饰的普通代码块
区别
普通代码块是在方法中,当此方法被调用的时候才会执行,且按照从上往下顺序执行,在执行过程中会有条件语句,循环语句以及异常处理等情况;
静态代码块是在类中的,当类加载的时候就会执行,且只执行一次,如果有多个静态代码块,则按照先后顺序执行,一般用于对静态变量的初始化,静态代码块中只能对静态方法和静态变量操作。
构造代码块是在类中的,当调用构造函数的时候执行,其实在编译的时候就会将构造代码块添加到每个构造函数之前,每次执行构造函数都会执行构造代码块,所以说构造代码块是随着构造函数执行的。
同步代码块是在方法中的,当方法被调用的时候执行,其实简单的说就是方法中被synchronized修改的普通代码块,用于多线程使用,多线程中可能某一个方法的某段代码需要同步执行,那么可以使用同步代码块,注意的是同步代码块使用不当会造成死锁。
执行顺序
同一个类的执行顺序
静态代码块—>构造代码块—>构造函数
普通代码块和同步代码块的顺序取决于代码块的位置。
继承中的执行顺序
场景是创建子类对象:
父类的静态代码块—>子类的静态代码块—>父类的构造代码块—>父类的无参构造函数—>子类的构造代码块—>子类的构造函数
普通代码块和同步代码块的顺序取决于代码块的位置。
示例
//父类
public class CodeBlock {
private String param1 = "成员变量param1";
private String param2 ;
private static String param3 ;
//构造代码块
{
param2 = "构造代码块改成员变量param2";
System.out.println(param2);
}
//静态代码块
static {
param3 = "静态成员变量param3";
System.out.println(param3);
}
public CodeBlock(){
System.out.println("无参构造函数CodeBlock()");
}
public CodeBlock(String param1,String param2){
this();
this.param1 = param1;
this.param2 = param2;
System.out.println("有参构造函数CodeBlock(param1,param2)");
}
public String getParam1() {
return param1;
}
public String getParam2() {
return param2;
}
}
//子类
public class CodeBlockChild extends CodeBlock {
private String name ;
private static String age;
static {
age = "27";
System.out.println(String.format("子类年龄%s",age));
}
{
name = "呵呵";
System.out.println(String.format("子类姓名%s",name));
}
public CodeBlockChild(){
System.out.println("子类无参构造函数");
}
public CodeBlockChild(String name){
this.name = name;
System.out.println("子类有参构造函数");
}
}
//测试类
public class CodeBlockTest {
public static void main(String[] args) {
CodeBlockChild haha = new CodeBlockChild("哈哈");
System.out.println(haha);
}
}
结果:
静态成员变量param3
子类静态成员变量子类年龄27
构造代码块改成员变量param2
无参构造函数CodeBlock()
子类构造代码块子类姓名呵呵
子类有参构造函数
适用场景
1.使用静态代码块可以给一些成员变量设置初始值,且只执行一次。
2.静态代码块是类加载时会执行,比如在springboot项目中类注入时就会执行静态代码块,所以有些时候项目启动需要执行的代码可以放在一个依赖注入的类的静态代码块中执行。
3.使用构造代码块也可以给一些成员变量设置初始值,比如可以为对象的一些属性设置默认值等,每次创建对象都会执行构造代码块,创建的对象就不会是空对象。