java中面向對象的一些小知識點(二)

一,單例設計模式

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)無論編譯和運行,都是參考左邊(靜態方法跟類綁定,與具體堆相無關)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章