public class A{
static int a=10;
static{
System.out.println("静态代码块");
}
{System.out.println("非静态代码块");}
public A(){
System.out.println("构造器");
}
}
定义一个类继承Apublic class B extends A{
staitc int b=11;
static{
System.out.println("class b 静态代码块");
}
{System.out.println("class b 非静态代码块");}
public B(){
System.out.println("class b 构造器");
}
}
A a1=new A();
A a2=new A();
打印:静态代码块 非静态代码块 构造器
非静态代码块 构造器
非静态代码块只加载一次。
若B.a=12;
System.out.println(A.a);//也为12
触发类加载器:
- 调用静态成员时,会加载静态成员所在的类及其父类,如调用B.b会加载A和B
- 子类调用父类静态成员时,只会加载父类。如调用B.a 只会加载A
- 加载子类会先加载父类。加载final static 不会加载类 如public static final c=12;调用C.c不会加载类C
加载顺序
- 父类静态代码块,子类静态代码块
- 父类非静态代码块,父类构造器
- 子类非静态代码块 子类构造器