首先看一下简单的代码
class A {
public static String a = "a";
}
class B extends A {
static{
System.out.println("b");
}
}
class Text{
public static void main(String[] args){
System.out.println(B.a);
}
}
这段代码你们觉得运行出什么呢
应该有一部分人或者大部分认为输出b和a
但是ba错啦 可以试试将这段代码在IDEA运行我相信结果应该只有a
觉得 输出b和a应该认为加载B类的时候会执行静态块,但是这个为什么不执行呢
这就是我接下来想说的类加载及初始化的静态块的问题了
首先我们先明白一下俩个概念
//类加载 //初始化
都知道代码执行是在内存中,而代码是在硬盘文件中,执行的时候需要在硬盘读取出来加载到内存里这个叫做类加载 这个过程是由类加载器classLoader去完成的,这个类加载器加载过来后,这个类下有静态代码块,而我们认为这个代码块需要调用这个过程,而这个调用过程叫做初始化,就是它会自动调用当前类下的静态代码块,然后初始化让它执行一遍
但是这里有一个误区,什么误区呢,很多人觉得内加载后会马上就初始化
其实内加载后不一定要初始化,初始化也要触发条件
首先我们在主动访问静态成员或者调用静态方法的时候才会触发初始化就是静态块会先执行
第二个
我们在创建对象的时候,通过创建对象类加载开辟空间然后就会先初始化调静态块
第三个
就是我们通过反射访问当下这个类,然后这个可能也会触发这个初始化
没触发这三个条件不会去调用静态块只会加载类