驗證結果:靜態代碼塊>構造代碼塊>構造函數>靜態方法>普通代碼塊
驗證代碼如下
public class Son extends Father {
private String name;
public Son(String name) {
super(name);
this.name = name;
System.out.println("子類帶參數構造");
}
public Son() {
System.out.println("子類不帶參數構造");
}
public static void say() {
System.out.println("我是子類靜態方法");
}
public void sayHello() {
System.out.println("我是子類成員方法");
}
static {
System.out.println("子類靜態代碼塊1");
}
static {
System.out.println("子類靜態代碼塊2");
}
{
System.out.println("子類構造代碼快");
}
public static void main(String[] args) {
System.out.println("-------------分隔線:執行無參對象創建及方法(第一次)-------------------");
Father father1 = new Son();
father1.sayHello();
System.out.println("-------------分隔線:執行無參對象創建及方法(第二次)-------------------");
Father father2 = new Son();
father2.sayHello();
System.out.println("-------------分隔線:執行帶參對象創建及方法-------------------");
Father father3 = new Son("Carson");
father3.sayHello();
System.out.println("-------------分隔線:執行靜態方法-------------------");
Son.say();
}
}
class Father {
private String name;
public Father(String name) {
this.name = name;
System.out.println("父類帶參數構造");
}
public Father() {
System.out.println("父類不帶參數構造");
}
public static void say() {
System.out.println("我是父類靜態方法");
}
public void sayHello() {
System.out.println("我是父類成員方法");
}
static {
System.out.println("父類靜態代碼塊1");
}
static {
System.out.println("父類靜態代碼塊2");
}
{
System.out.println("父類構造代碼快");
}
}
執行結果如下
父類靜態代碼塊1
父類靜態代碼塊2
子類靜態代碼塊1
子類靜態代碼塊2
-------------分隔線:執行無參對象創建及方法(第一次)-------------------
父類構造代碼快
父類不帶參數構造
子類構造代碼快
子類不帶參數構造
我是子類成員方法
-------------分隔線:執行無參對象創建及方法(第二次)-------------------
父類構造代碼快
父類不帶參數構造
子類構造代碼快
子類不帶參數構造
我是子類成員方法
-------------分隔線:執行帶參對象創建及方法-------------------
父類構造代碼快
父類帶參數構造
子類構造代碼快
子類帶參數構造
我是子類成員方法
-------------分隔線:執行靜態方法-------------------
我是子類靜態方法
有這麼幾點說明
(下面所說的,對象的創建,是new出來的對象)
- 靜態代碼塊
- 不管對象創建幾次(或者說不管創不創建對象),只執行一次,且優先級最高(因爲在對象創建之前就已加載完畢)
- 多個靜態代碼塊按代碼順序來執行
- 構造代碼塊
- 創建幾次對象就執行幾次,優先級在靜態代碼塊之後,在構造方法之前執行
- 構造方法
- 創建幾次就執行幾次,在靜態方法之前執行
- 靜態方法
- 在構造方法之後執行(因爲類得先加載出來,才能執行此類的靜態方法。然而在加載該類時,構造代碼塊和構造方法就執行了)