一,單例設計模式
1.爲什麼要有單例設計?主要就是想要保證對象的唯一性。
1)爲了避免其他程序過多建立該類的對象
2)還要爲了方便其他程序訪問該類對象,在本類中自定義一個該類對象,然後提供靜態訪問方法
2.實現方式
1)首先,就是將構造函數私有化,讓其他程序沒法通過構造函數實例化對象
2)在類中創建一個該類的對象
3)提供一個靜態方法,返回該對象
例如:
class Single {
private Single() {
}
private static Single s = new Single();
public static Single getInstance() {
return s;
}
}
這就是一個簡單的單例模式的實現方式。
3.兩種表現形式(這個需要重點注意)
1)餓漢式(先初始化對象,然後調用)
class Single {
private Single() {
}
private static Single s = new Single();
public static Single getInstance() {
return s;
}
}
2)懶漢式(對象是在被調用時,才初始化,也叫對象的延時加載)
class Single {
private Single() {
}
private static Single s = null;
public static Single getInstance() {
if (s == null)//減少讀鎖次數
{
synchronized (Single.class)
{
if (s == null)
s = new Single();
}
}
return s;
}
}
“懶漢式”在使用時需要特別注意,當多個程序同時訪問時,有可能出現創建多個對象的情況,因此需要加鎖來解決。因此,定義單例時,建議使用“餓漢式”。
二,多態的應用
首先,來看個例子
class Fu {
int num = 5;
void method1() {
System.out.println("fu method_1");
}
void method2() {
System.out.println("fu method_2");
}
static void method4() {
System.out.println("fu method_4");
}
}
class Zi extends Fu {
int num = 8;
void method1() {
System.out.println("zi method_1");
}
void method3() {
System.out.println("zi method_3");
}
static void method4() {
System.out.println("zi method_4");
}
Fu f = new Zi();
System.out.println(f.num);
f.method1();
f.method2();
f.method4();
輸出結果爲:5
zi method_1
fu method_2
fu method_4
看到個結果,就需要爲大家總結下,多態的幾個特點:1.多態中非靜態成員函數的特點:
1)編譯期間,參閱引用型變量所屬的類中是否有調用的方法
2)運行期間,參閱對象所屬的類中是否有此方法,
簡單來說,成員函數在多態調用時,編譯看左邊,運行看右邊
2.多態中,成員變量的特點:
1)無論編譯和運行,都是參考左邊(引用型變量所屬的類)
3.多態中,靜態成員函數的特點:
1)無論編譯和運行,都是參考左邊(靜態方法跟類綁定,與具體堆相無關)