- 查看單例模式時,發(fā)現(xiàn)類的加載過程有點忘了(全部都被我當(dāng)飯吃了,
(*_*))。因此在這里記錄下。
package com.d4c.order;
public class A {
public static final int staticFiledA = 1;
public final int filedA = 2;
A() {
System.out.println("------------------------------");
System.out.println("A constructor");
System.out.println("staticFiledA:" + staticFiledA);
System.out.println("filedA:" + filedA);
System.out.println("------------------------------");
}
static {
System.out.println("------------------------------");
System.out.println("A static code block");
System.out.println("staticFiledA:" + staticFiledA);
System.out.println("------------------------------");
}
{
System.out.println("------------------------------");
System.out.println("A code block");
System.out.println("staticFiledA:" + staticFiledA);
System.out.println("filedA:" + filedA);
System.out.println("------------------------------");
}
public static final void staticMethodA() {
System.out.println("------------------------------");
System.out.println("A static method");
System.out.println("staticFiledA:" + staticFiledA);
System.out.println("------------------------------");
}
}
//-------------------------------------------
package com.d4c.order;
public class B extends A{
public static final int staticFiled = 3;
public final int filed = 4;
B() {
System.out.println("------------------------------");
System.out.println("B constructor");
System.out.println("staticFiled:" + staticFiled);
System.out.println("filed:" + filed);
System.out.println("------------------------------");
}
static {
System.out.println("------------------------------");
System.out.println("B static code block");
System.out.println("staticFiled:" + staticFiled);
System.out.println("------------------------------");
}
{
System.out.println("------------------------------");
System.out.println("B code block");
System.out.println("staticFiled:" + staticFiled);
System.out.println("filed:" + filed);
System.out.println("------------------------------");
}
public static final void staticMethod() {
System.out.println("------------------------------");
System.out.println("B static method");
System.out.println("staticFiled:" + staticFiled);
System.out.println("------------------------------");
}
public static void main(String[] args) {
B b = new B();
}
}
輸出結(jié)果:
------------------------------
A static code block
staticFiledA:1
------------------------------
------------------------------
B static code block
staticFiled:3
------------------------------
------------------------------
A code block
staticFiledA:1
filedA:2
------------------------------
------------------------------
A constructor
staticFiledA:1
filedA:2
------------------------------
------------------------------
B code block
staticFiled:3
filed:4
------------------------------
------------------------------
B constructor
staticFiled:3
filed:4
------------------------------
結(jié)論:
靜態(tài)變量:
- 可以將靜態(tài)變量理解為類變量(與對象無關(guān)),而實例變量則屬于一個特定的對象。
- 靜態(tài)變量有兩種情況:
- 靜態(tài)變量是基本數(shù)據(jù)類型,這種情況下在類的外部不必創(chuàng)建該類的實例就可以直接使用
- 靜態(tài)變量是一個引用。這種情況比較特殊,主要問題是由于靜態(tài)變量是一個對象的引用,那么必須初始化這個對象之后才能將引用指向它。因此如果要把一個引用定義成static的,就必須在定義的時候就對其對象進(jìn)行初始化。
靜態(tài)方法:
- 在內(nèi)存中只有一份。
- 靜態(tài)方法可以直接使用,而實例方法必須在類實例化之后通過對象來調(diào)用。
- 在外部調(diào)用靜態(tài)方法時,可以使用“類名.方法名”或者“對象名.方法名”的形式。
- 實例方法只能使用這種方式對象名.方法名。
- 靜態(tài)方法只允許訪問靜態(tài)成員。而實例方法中可以訪問靜態(tài)成員和實例成員。
- 靜態(tài)方法中不能使用this(因為this是與實例相關(guān)的)。
靜態(tài)代碼塊:
- 靜態(tài)代碼塊會在類被加載時自動執(zhí)行。
- 靜態(tài)代碼塊只能定義在類里面,不能定義在方法里面。
- 靜態(tài)代碼塊里的變量都是局部變量,只在塊內(nèi)有效。
- 一個類中可以定義多個靜態(tài)代碼塊,按順序執(zhí)行。
- 靜態(tài)代碼塊只能訪問類的靜態(tài)成員,而不允許訪問實例成員。
順序
父類的靜態(tài)字段——>父類靜態(tài)代碼塊——>子類靜態(tài)字段——>子類靜態(tài)代碼塊——>父類成員變量(非靜態(tài)字段)——>父類非靜態(tài)代碼塊——>父類構(gòu)造器——>子類成員變量——>子類非靜態(tài)代碼塊——>子類構(gòu)造器
引用參考