理論
- 靜態代碼塊:
- 是在當類被載入(內存)時,靜態代碼最先被調用的
- 有且只執行一次
- 靜態塊常用來執行類屬性的初始化。執行類的載入之前就會調用
- 非靜態代碼塊:
1. 是在當類的對象被創建載入(內存)時,最先被調用
2. 每創建一個對象,即每載入一個對象,非靜態代碼塊都執行一次 - 靜態方法:
1. 被調用,才執行。
2. 靜態方法屬於類,即加載完類就可以調用
3. 加載完對象,也可以用對象調用的到。但是一般不這麼寫 - 非靜態方法:
1. 被調用,才執行。
2. 非靜態方法屬於對象,即實例化加載完對象才能調用對象。
3. 不加載對象不能調用 - 構造方法
1. 構造方法構造器用於初始化對象的狀態(數據)
2. 構造方法在加載完對象後開始執行
3. 構造方法執行順序在加載完對象的非靜態代碼塊
代碼:
public class A {
public static void staticA() {
System.out.println("父類-----靜態方法");
}
static {
System.out.println("父類-----靜態代碼塊");
}
public A() {
System.out.println("父類-----構造函數");
}
{
System.out.println("父類-----非靜態代碼塊");
}
public void ordinaryA(){
System.out.println("父類-----普通方法");
}
public static void main(String[] args) {
B.staticB();
//B.ordinaryB(); //錯誤寫法,不可執行
System.out.println("第一次開始加載B");
B bno1 = new B();
System.out.println("開始加載bno1對象的方法");
bno1.staticB();
bno1.ordinaryB();
System.out.println("開始加載A對象");
A a = new A();
System.out.println("開始調用A方法");
a.staticA();
a.ordinaryA();
System.out.println("第二次開始加載B");
B b = new B();
System.out.println("開始調用B方法");
b.staticB();
b.ordinaryB();
}
}
class B extends A {
public static void staticB(){
System.out.println("子類-----靜態方法");
}
static {
System.out.println("子類-----靜態代碼塊");
}
public B() {
System.out.println("子類----構造函數");
}
{
System.out.println("子類-----非靜態代碼塊");
}
public void ordinaryB(){
System.out.println("子類-----普通方法");
}
}
執行結果:
父類-----靜態代碼塊
第一次開始加載B
子類-----靜態代碼塊
父類-----非靜態代碼塊
父類-----構造函數
子類-----非靜態代碼塊
子類----構造函數
開始加載bno1對象的方法
子類-----靜態方法
子類-----普通方法
開始加載A對象
父類-----非靜態代碼塊
父類-----構造函數
開始調用A方法
父類-----靜態方法
父類-----普通方法
第二次開始加載B
父類-----非靜態代碼塊
父類-----構造函數
子類-----非靜態代碼塊
子類----構造函數
開始調用B方法
子類-----靜態方法
子類-----普通方法
在線運行工具:https://tool.lu/