类结构——代码块之静态代码块
静态代码块的特点:
执行时机: 静态代码块仅在类被加载到内存时执行一次,并且是在构造任何对象之前执行。这意味着无论创建了多少个该类的对象,静态代码块都只会被执行一次。
优先级: 如果一个类中定义了多个静态代码块,那么这些静态代码块将按照它们在源代码中出现的顺序依次执行。此外,所有静态代码块都会先于构造函数执行。
package PACKAGE_NAME._01Day.tledu.com;
/*
* 静态代码块
* */
public class _01StaticContain {
static {
System.out.println("第1静态代码块执行!!!!!");
}
static int a = testStatic();
private static int testStatic(){
System.out.println("这个方法被静态变量引用");
return 2021;
}
static {
System.out.println("第2静态代码块执行!!!!!");
}
//静态代码块只能被执行一次。
public static void main(String[] args) {
//实例被创建。
_01StaticContain staticContain = new _01StaticContain();
//访问类的静态成员(静态变量或静态方法)。
System.out.println(a);
// 反射来加载类。
Class clazz = _01StaticContain.class;
}
}
运行结果:
异常处理: 静态代码块内可以抛出异常,但如果静态代码块内部发生未捕获的异常,则会导致整个程序停止加载该类,进而可能导致应用程序无法启动或运行失败。
在第一个静态代码块中人为制造一个异常 int a = 1/0;
执行main方法运行结果:
访问限制: 在静态代码块中可以直接访问本类中的静态成员(包括变量和方法),但是不能直接访问非静态成员。这是因为当静态代码块执行时,还没有具体的实例对象存在。
不可重复执行: 与普通的方法不同,即使再次引用同一个类也不会重新执行静态代码块。一旦类已经被加载并且其静态代码块已执行过,则后续对这个类的操作不会触发静态代码块的再执行。
继承关系下的行为: 当子类继承自父类时,在加载子类的过程中会首先加载父类(如果父类还未被加载的话)。因此,父类中的静态代码块会在子类的静态代码块之前执行。
创建一个类继承之前的”_01Day.tledu.com”类
package PACKAGE_NAME._01Day.tledu.com;
import java.lang.reflect.Field;
public class Test extends _01StaticContain {
public static void main(String[] args) {
System.out.println("子类方法调用");
}
}
执行子类main方法运行结果: