写这篇blog的初衷是为了弄清楚韩顺平老师SqlHelper类,在SqlHelper类中没有使用构造器而是使用了静态代码块,因此我想到了调用静态方法时会不会调用构造器和静态代码块的问题
1. 调用静态方法时会调用静态代码块
public class CheckStaticBlock {
private static String name;
private static int age;
static {
name = "bubble";
age = 1;
System.out.println("bubble stupid");
}
public static void say() {
System.out.println(name + age);
}
public static void main(String[] args) {
CheckStaticBlock.say();
}
}
运行结果如下
可以看出name和age被赋值了,所以static代码块在调用静态方法前被执行
当静态方法没有调用静态域时,静态代码块也同样会被执行:
public static void say2() {
System.out.println("pocky stupid");
}
运行结果如下
因此,可以看出,静态代码块在调用静态方法时是必定执行的
2. 调用静态方法时不会调用构造器
在刚才的类中加入构造器
public CheckStaticBlock() {
System.out.println("both are stupid");
}
再调用say()方法,运行结果如下
可以看出,在调用静态方法时不会调用构造器,因为没有创建一个实例
PS:如果使用创建实例的方法调用静态方法,还是会调用构造器的
3. 但是,static静态代码块只会执行一次
例如,在main方法中调用3次say()和1次say2(),执行结果如下
可以看到,静态代码块打印的"bubble stupid"只出现了一次,这是因为static代码块在类加载时只执行一次
4. 当调用非静态方法时,静态代码块和构造器都会被调用