先上代碼:
public class Parent {
{
System.out.println("Parent的普通代碼塊");
}
static {
System.out.println("Parent的靜態代碼塊");
}
public Parent() {
System.out.println("Parent的構造代碼塊");
}
public static void staticMethod1() {
System.out.println("Parent的靜態代方法1");
}
public static void staticMethod2() {
System.out.println("Parent的靜態代方法2");
}
}
測試類:
public static void main(String[] args) {
Parent.staticMethod1();
Parent.staticMethod2();
Parent parent = new Parent();
}
結果:
Parent的靜態代碼塊
Parent的靜態代方法1
Parent的靜態代方法2
Parent的普通代碼塊
Parent的構造代碼塊
來個子類:
public class Child extends Parent {
{
System.out.println("Child的普通代碼塊");
}
static {
System.out.println("Child的靜態代碼塊");
}
public Child() {
System.out.println("Child的構造代碼塊");
}
public static void staticMethod1() {
System.out.println("Child的靜態代方法1");
}
public static void staticMethod2() {
System.out.println("Child的靜態代方法2");
}
}
測試一下:
public static void main(String[] args) {
Child.staticMethod1();
Child.staticMethod2();
Child child = new Child();
}
結果:
Parent的靜態代碼塊
Child的靜態代碼塊
Child的靜態代方法1
Child的靜態代方法2
Parent的普通代碼塊
Parent的構造代碼塊
Child的普通代碼塊
Child的構造代碼塊
加載順序:
父類的靜態代碼塊–> 子類的靜態代碼塊 -->父類的普通代碼塊 -->父類的默認構造器 -->子類的普通代碼塊 -->子類的構造器
子類靜態方法加載在子類靜態代碼塊之後,父類的普通代碼塊之前