首先,我們簡單瞭解一下代碼塊和構造方法
靜態代碼塊:
存在類內方法外,使用static修飾,作用是類的預加載,當類第一次被加載的時候執行一次,優先於構造代碼塊 優先於構造方法
構造代碼塊:
存在類內方法外,作用是對象的預加載,每當new調用構造方法的時候 會優先執行構造代碼塊,每new一次就優先執行一次構造代碼塊
普通代碼塊:
存在成員方法中,作用是控制變量的生命週期,執行完後立即消失.
構造方法:
創建對象的方式,每當調用構造方法時,構造方法執行一次
關於加載順序,我們將通過實現代碼來查看
一、定義一個父類
public class Die {
int age;
static {
System.out.println("父類的靜態代碼塊");
}
{
// 父類的構造代碼塊
System.out.println("父類的構造代碼塊");
}
// 父類無參
public Die() {
this(20);
System.out.println("父類的無參構造方法");
// 普通代碼塊
{
System.out.println("父類的代碼塊");
}
}
// 父類含參
public Die(int age) {
super();
this.age = age;
System.out.println("父類的含參構造方法");
}
}
二、定義一個子類
public class Zi extends Die{
String name;
static{
System.out.println("子類的靜態代碼塊");
}
{
//構造代碼塊
System.out.println("子類的構造代碼塊");
}
//子類無參
public Zi() {
this("");//在執行子類的含參構造方法 但是沒有對象產生
System.out.println("子類無參構造方法");
//普通代碼塊
{
System.out.println("子類的代碼塊");
}
}
//子類含參
public Zi(String name) {
super();
this.name = name;
System.out.println("子類的含參構造");
}
}
三、測試類
public class ExtendsDemo {
public static void main(String[] args){
Zi z = new Zi();
System.out.println("==========");
Die d = new Zi();
}
}
結果:
Zi z = new Zi() 的運行結果:
父類的靜態代碼塊
子類的靜態代碼塊
父類的構造代碼塊
父類的含參構造方法
父類的無參構造方法
父類的代碼塊
子類的構造代碼塊
子類的含參構造
子類無參構造方法
子類的代碼塊
Die d = new Zi() 的運行結果:
父類的構造代碼塊
父類的含參構造方法
父類的無參構造方法
父類的代碼塊
子類的構造代碼塊
子類的含參構造
子類無參構造方法
子類的代碼塊
靜態代碼塊只加載一次,所以第二次沒有加載靜態代碼塊