示例一:
public class Demo02 {
public static void main(String[] args) {
new B02();
System.out.println(B02.a);
}
}
class A02 {
static int a = 0;
static {
a = 1;
}
}
class B02 extends A02 {
static {
a = 2;
}
}
运行结果为:2
new B02()方法会优先初始化父类A02,执行A02静态变量的赋值,此时a=0,再执行A02的静态代码a=1,再执行子类的静态代码块,此时a=2
示例二,将new B02()去掉
public class Demo02 {
public static void main(String[] args) {
// new B02();
System.out.println(B02.a);
}
}
class A02 {
static int a = 0;
static {
a = 1;
}
}
class B02 extends A02 {
static {
a = 2;
}
}
运行结果为:1
直接访问父类的静态变量,不会触发子类的初始化。
因此只需要执行A02静态变量的赋值,此时a=0,再执行A02的静态代码a=1,不再执行子类的静态代码块
示例三
public class Test2 {
public static void main(String[] args) {
Test_2[] a = new Test_2[10];
}
}
class Test_2 {
static {
System.out.println("Test_2的静态代码块运行");
}
}
无打印信息
数组的创建不会导致数组中元素的类进行初始化。
示例四
public class Test2 {
public static void main(String[] args) {
System.out.println(Test_2.a);
}
}
class Test_2 {
public static final int a = Integer.valueOf(1);
static {
System.out.println("Test_2的静态代码块运行");
}
}
输出结果:
Test_2的静态代码块运行
1
final修饰的变量如果赋值的内容需要执行指令才能得出结果,会执行clinit方法进行初始化。