第四章 关于static代码块的深入探讨

1.什么是静态代码块

执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。

2.静态代码块示例

package com.hqa.design.test;
public class Demo {
public static final String NAME = "JACK";
	static{
		System.out.println("Demo static code is run..");
	}
}

我们都知道静态代码块仅在类初始化的时候执行一次,那么到底哪些时机会触发呢?

3.两种容易误解的情况

在com.hqa.design包下新建Test测试类
1.导入Demo类并打印

package com.hqa.design;
import com.hqa.design.test.Demo;//导入demo包
public class Test {
	public static void main(String[] args) {
		System.out.println(Demo.class);//打印class
	}
}

结果:static不会执行

2.打印demo的静态final属性

package com.hqa.design.test;
import com.hqa.design.test.Demo;//导入demo包
public class Test {
	public static void main(String[] args) {
		System.out.println(Demo.NAME);//打印class
	}
}

结果:static不会执行

惊!!!这都不会执行?这里和类加载机制有关,类被加载了不一定就会执行静态代码块,只有一个类被主动使用的时候,静态代码才会被执行!

4.何为主动使用
当一个类被主动使用时,Java虚拟就会对其初始化,如下六种情况为主动使用:

  1. 当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)
  2. 当调用某个类的静态方法时
  3. 当使用某个类或接口的静态字段时
  4. 当调用Java API中的某些反射方法时
  5. 当初始化某个子类时
  6. 当虚拟机启动某个被标明为启动类的类(即包含main方法的那个类),Java编译器会收集所有的类变量初始化语句和类型的静态初始化器,将这些放到一个特殊的方法中:clinit

注:看到反射可以触发static代码块,可以立刻联想到 jdbc驱动是通过Class.forName(”com.xxx.Driver“)加载的,此处正是利用了此特性。

5.坑点总结
1.调用类的final属性时不会触发static代码块,这个一定要注意

发布了9 篇原创文章 · 获赞 6 · 访问量 2777

猜你喜欢

转载自blog.csdn.net/qq_29145405/article/details/103958683