二、一個類在什么時候被加載?時機 (延遲加載,能不加載就不加載) (1)new 一個對象的時候,加載 (2)沒有創(chuàng)建對象,訪問類中靜態(tài)成員(方法和屬性),加載 (3)聲明一個類的引用,不加載 (4)創(chuàng)建子類,先加載父類,再加載子類 (5)父類中的公開靜態(tài)方法,子類繼承,使用子類的類名調(diào)用此方法,加載父類 class Super{ public static m(){} } class Sub extends Super{} 在主函數(shù)中運行以下代碼: Sub.m(); //加載了父類之后,虛擬機已經(jīng)知道m(xù)()方法的調(diào)用了,就不會再加載子類,延遲加載 (6)沒有創(chuàng)建對象,訪問類中靜態(tài)常量(能計算出結果的常量,在編譯的時候會用計算出來的結果替換表達式),不加載 沒有創(chuàng)建對象,訪問類中靜態(tài)常量(不確定的值),加載 (7)CoreJava day16
三、設計模式(編程套路) GOF(Group Of Four)四人幫模式 23種
1、單例模式 Singleton:
class A{ private static A a = new A(); //私有靜態(tài)的實例變量指向自己,在類加載時創(chuàng)建唯一對象 public static A newInstance(){ //提供公開靜態(tài)的訪問點,回返唯一實例 return a; } private A(){} //私有的構造方法,防止濫用 }
注意:final,不能用來修飾構造方法。 在父類中如果有常量屬性,在子類中使用常量屬性時是不會進行父類的類加載。 靜態(tài)常量如果其值可以確定,就不會加載該類,如果不能確定則會加載該常量所在的類。 class Super{ private final void m(){} //用final可以證明出private的方法不繼承給子類 } class Sub extends Super{ public void m(){} //不是方法的覆蓋 }