Java心得---單例類、final修飾符、抽象類別__Java

來源:互聯網
上載者:User

1.  設計模式:是一種問題的解決思想。解決某一類問題最行之有效方法。Java有23中設計模式(前人總結出來的)。

單例設計模式:解決一個類在記憶體中只存在一個對象。

如果一個類始終只能建立一個執行個體,則這個類稱為單例(Singleton)類。

2. 想要保證對象的唯一(建立單例類的三個步驟):

1).禁止其他程式自由建立對象:將構造方法私人化,使用private修飾。

2).為了讓其他程式可以訪問到該類對象,只能在本類定義一個對象:在類中建立一個本類對象。

3).為了方便其他程式對該對象的訪問,可以對外提供存取方法:提供一個public方法可以擷取該對象。

3.   一般情況下,把類的構造方法定義成public存取權限,即允許任何類自由建立該對象,但在某些時候允許其他類自由建立該類的對象沒有任何意義,反而可能造成系統效能下降(因為每建立一個對象都要佔用一定的系統資源)。

提供的public方法必須使用static修飾(因為調用該方法之前不存在對象而且是執行個體對象,只能有一個對象,不能在new了,因此調用該方法的不可能是對象,只能是類);該類必須緩衝已經建立的對象,否則隨後它無法知道是否曾經建立過對象,也就無法保證只建立一個對象,為此該類需要使用一個屬性來儲存曾經建立的對象,且因為屬性需要被上面的靜態方法訪問,故必須使用static修飾。

4 兩種寫法:

1).餓漢式:不管你用不用,一開始就建立單例對象,即先初始化對象。

    開發一般使用此寫法,安全性高

         private static Single s=newSingle();

private Single(){}

         public static SinglegetInstance(){

return s;

}

        2).懶漢式:使用時才建立對象,是消極式載入。

            private static Single1s=null;

            private Single1(){}

public static Single1 getInstance(){

                if(s==null){

 s=new Single1();}

return s;

}

5.     final關鍵字可用於修飾類、變數和方法,用於表示它修飾的類、變數和方法不可改變。

     final修飾變數時,表示該變數一旦獲得了初始值之後就不可被改變,final既可修飾成員變數(包括類變數和執行個體變數),也可以修飾局部變數、形參。

6. 1).final修飾成員變數:

       類變數:當類初始化時,系統會為類變數分配記憶體,並賦預設值。

       執行個體變數:當建立對象時,系統會為該對象的執行個體屬性分配記憶體,並賦預設值。

   2).final修飾的類屬性、執行個體屬效能指定初始值的地方如下:

          類屬性:靜態初始化塊或聲明該屬性時指定初始值。

          執行個體屬性:非靜態初始化塊、聲明該屬性時或構造方法中指定初始值。

注意:執行個體屬性不能在靜態初始化塊中指定初始值,因為靜態初始化塊是靜態成員,不可訪問執行個體屬性—非靜態成員;類屬性不能在普通初始化塊中指定初始值,因為類屬性在類初始化階段已經被初始化了,普通初始化塊不能對其重新賦值。

對於final修飾的成員變數,一旦有了初始值就不能再被重新賦值,因此不可以在普通方法中對其重新賦值,成員變數只能在在定義其時指定預設值(顯示賦值),或在靜態初始化塊、初始化塊和構造方法中為成員變數指定初始值(即要麼在定義成員變數時指定初始值,要麼在初始化塊、構造方法中為該屬性重新賦值)。

Final修飾的成員變數必須賦初值,否則報錯;原因:

  如果既沒有在定義成員變數時指定預設值,也沒有在初始化塊、構造方法中為成員變數指定初始值,那麼這些成員變數的值將一直是:0、’\u000’、false、null,失去了存在的意義。

 與普通變數不同的是,final成員變數(包括執行個體屬性和類屬性)必須由程式員進行顯示初始化,即系統不會對final成員變數進行隱式初始化。

7.使用final修飾局部變數:

    由於系統不會對局部變數進行初始化,局部變數必須由程式員手動賦值,因此final修飾的局部變數既可以在定義時指定預設值,也可以不指定預設值。如果在定義時沒有指定預設值,則可在後面代碼中對該final變數賦初始值,但只能一次,不能重複賦值。可以在定義時指定預設值,則後面代碼中不能再對該變數賦值。

     final修飾形參的情形:由於形參在調用該方法時,由系統根據傳入的參數來完成初始化,因此使用final修飾的形參不能被賦值

8. final修飾基本類型和參考型別變數的區別 :

      當用final修飾基本類型變數時,不能對基本類型變數重新賦值,即基本類型變數的值不能被改變

      參考型別變數儲存的是一個引用,final只保證這個引用(地址)不會改變,即一直引用同一個對象,但這個對象可以發生改變。

     final修飾的參考型別變數不能被重新賦值,但參考型別變數所引用的對象內容卻可以被改變。

     如果final修飾的變數為基礎資料型別 (Elementary Data Type),且在編譯時間就能確定改變數的值,則可以把該變數變成常量處理。常量名由多個有意義的單詞大寫組成,單詞與單詞之間以底線分割,final修飾的變數是引用資料類型,final變數無法在編譯時間獲得初值,而必須運行時才能得到值。

9. final方法

     1).final修飾的方法不可被重寫,如果出於某些原因,不希望子類重寫父類的某個方法,則可以使用final修飾該方法。

     2).final修飾的方法僅僅是不能被重寫,並不是不能被重載

     3).final修飾的類不可有子類。例如,java.lang.Math類就是一個final類,它不可以有子類。(子類繼承父類時將可以訪問到父類的內部資料,並可通過重寫父類方法來改變父類方法的實現細節,從而導致一些不安全的因素;因此,當需要保證某個類無法被繼承時,可以用final修飾)

      Java提供的Object類裡就有一個final方法:getClass()。因為java不希望任何類重寫這個方法。

10.抽象方法聲明格式:
[修飾符] abstract  傳回值類型方法名([形式參數表]);

抽象方法的特點

ü    抽象方法的傳回值類型前有關鍵字abstract;

ü    抽象方法沒有方法體;抽象方法只有方法抽象簽名,沒有方法的實現部分。

ü    抽象方法的定義是一行單獨語句,以分號結束;

ü    在抽象方法聲明中使用static修飾符是錯誤的。

11. 抽象類別(一個沒有包含足夠的資訊以描繪一個具體的對象時的類)

     類中如果定義了抽象方法,這個類必須定義為抽象類別。

     [public]  abstract  class 類名{

            //類體(屬性、非抽象方法、抽象方法、構造方法)

            //類體(初始化塊、內部類、枚舉類)  

     }

µ   抽象類別不能建立自己的對象,使用new建立抽象類別對象將產生錯誤。抽象類別不能被執行個體化,也不能建立執行個體。

µ   子類繼承抽象類別時,應該覆蓋抽象類別中的所有抽象方法,否則子類也必須定義為抽象類別。

µ   抽象類別可以含有屬性、方法(普通方法、抽象方法都可以)、構造方法、初始化塊、內部類、枚舉類等六種成分。

µ   含有抽象方法的類(包括直接定義了一個抽象類別方法;繼承了一個抽象父類但沒有完全實現父類包含的抽象方法;以及實現一個介面,但沒有完全實現介面包含的抽象方法三種情況)只能被定義成抽象類別。

µ   注意

含有抽象方法的類(包括直接定義了一個抽象方法;繼承了一個抽象父類,但沒有完全實現父類包含的抽象方法)只能被定義成抽象類別。但抽象類別中卻並一定包含抽象方法。

抽象方法和空方法體的方法不是同一個概念
public abstract void test();
public void test(){}

     子類在實現從父類繼承來的抽象方法時,其傳回值類型、方法名、參數列表必須和父類相同,但不同的是子類有方法體,且不同的子類可以有不同的方法體。

 

12. 注意:

ü        final和abstract永遠不能同時使用。(當abstract修飾類時只能被子類繼承;修飾方法時只能重寫,而final修飾的類不能被繼承,修飾的方法不能被重寫)

ü        abstract不能用於修飾屬性,不能用於修飾局部變數,即沒有抽象變數、沒有抽象屬性等說法;abstract也不能用於修飾構造方法,沒有抽象構造方法。抽象類別裡定義的構造方法只能是普通構造方法。

ü        static和abstract不能同時修飾某個方法,即沒有所謂的類抽象方法。(static修飾方法,表明這個方法屬於當前類,即該方法可以通過類來調用;如果被定義成抽象方法,則將導致通過改類來調用該方法時出錯,調用一個沒有方法體的方法肯定錯誤)

ü        abstract關鍵字修飾的方法必須被其子類重寫才有意義,否則這個方法將永遠不會有方法體,因此abstract方法不能定義為private訪問權

13. 抽象類別的作用

ü    代碼重用--子類可以重用抽象父類中的屬性和非抽象方法;

ü    規劃--抽象類別中通過定義抽象方法規划了其所有子類必須要實現的功能,或者說指定了其子類對象與外界的互動介面,因為抽象方法的方法頭部分已經規定了該方法將來被子類對象調用的格式。

14. 模板模式:抽象類別作為多個子類的通用模板,子類在抽象類別的基礎上擴充、改造,但子類總體上會保留抽象類別的行為方式。

     使用模版的簡單規則如下:

 1).抽象父類可以只定義需要使用的某些方法,其餘留給子類來實現。

2).父類可以包含已經實現的具體方法,通常這些方法只是定義了一個通用演算法,其實現不需要完全由自身實現,而可以藉助子類來實現。

ü    抽象類別不能執行個體化,但抽象類別可作為變數的類型和方法形參類型,可將抽象類別子類的對象賦給該變數或做方法的實參。例如,
Shape s=new Rectangle();
public static String ShowShapinfo(Shape item){
      if(item instanceof Rectangle){
                    Rectangler=(Rectangle)item; //其他代碼
      }
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.