天天看點

java心得---多态、靜态初始化塊

1. 多态機制是面向對象技術的精華之一,它是建立在繼承基礎之上的。所謂多态(polymorphism),可以了解為某一類事物的多種存在形态。

多态性是指一個同名方法可能有多種版本在程式中同時存在,使用者使用同一個方法名調用方法,系統會根據具體情況調用方法的不同不版本,進而實作不同的功能,及實作“一個接口,多個方法”。

    多态性允許以統一的風格處理已存在的變量及相關的類,使得向系統增加新功能變得容易,繼承性和多态性是降低軟體複雜性的有效技術;多态性技術主要表現在方法重載和方法覆寫兩個方面。繼承下來的權限不發生變化。

2. 父類引用指向了子類對象。子類的對象可以代替父類的對象使用。

在類的繼承中,子類在父類的基礎上進行擴充和改造,父類擁有的成員子類中都有,因而可以認為子類比父類的功能強,或者說子類的對象應該比父類的對象功能強,因而子類的對象應可以替代父類的對象被使用。

3. 1).多态的展現:

         父類的引用指向自己的子類對象;

         父類的引用可以接收自己的子類對象。

2). 多态的前提:要有繼承關系,存在覆寫。

3). 多态的好處:提高程式的擴充性。

          弊端:隻能使用父類引用通路父類中的成員。

     如果想通路子類的特有方法,強制将父類的引用轉為子類類型。

4.   1).多态中成員方法的特點:編譯看左邊,運作看右邊。(在編譯時,看引用類型的類是否有此方法;在運作時,看對象所在的類是否有調用的方法。)(動态綁定)   

2).多态中成員變量的特點:編譯和運作都看左邊。

5. instanceof運算符(instance是例子的意思,即執行個體)

    運算符instanceof用于檢測一個對象的真正類型。

µ    格式:<變量名> instanceof <類型>

µ    功能:如果instanceof操作符左側的變量目前時刻所引用對象的真正類型是其右側給出的類型、或是其子類,則整個表達式結果為true,否則結果為false。

    調用方法時如果實參是子類Student的對象,則造型是正确的,若實參是父類Person的對象,則造型失敗!

       if(p instanceof Student){

                   Studentst=(Student)p;  

     st.display();

       }

6.   和基本資料類型之間的強制類型轉換(向下轉型)一樣,存在繼承關系的父類對象和子類對象之間的互相轉換(即引用類型的轉換),遵守以下原則:

  1).子類對象可以被視為其父類的一個對象。

  2).父類對象不能被當作是某一個子類的對象。

  3).如果一個方法的形參定義的是父類的對象,那麼調用這個方法時,可以使用子類對象作為實際參數。

4).如果父類對象與引用指向的實際是一個子類對象,那麼這個父類對象的引用可以用強制轉換成子類對象的引用。格式為:(子類名)父類名。

例如:Person p = newStudent();  //向上轉型,類的提升。

     Student s = (Student)p; //向下轉型,前提是p必須指向student(即上條語句),指向person時則報錯。

7.  初始化塊是java類裡可以出現的第四個成員(前面三個依次是:屬性、成員方法、構造方法),一個類裡可以有多個初始化塊,相同類型的初始化塊之間,還有初始化塊和聲明執行個體屬性時所指定的初始值都是該執行個體的初始化代碼,其執行順序與其在源程式中的排列順序相同。格式為:

class 類名{

     [修飾符]{  //修飾符隻能是static或什麼都沒有(什麼都沒有的稱為構造初始化塊或直接叫初始化塊)。

        //初始化塊的可執行代碼

     }

8.  當建立Java對象(即new對象)時,系統總是先調用該類裡定義的初始化塊;

µ    如果一個類裡定義了兩個普通初始化塊,則前面定義的初始化塊先執行,後面定義的初始化塊後執行。

µ    初始化塊雖然也是Java類裡的一種成員,但它沒有名字,也就沒有辨別,是以無法通過類、對象來調用初始化塊;

µ    初始化塊隻能在建立對象時自動執行而且在執行構造方法之前執行。不new對象不調用初始化塊,隻要new就自動調用,new一個調一回,new多個調多回。

  調用順序:初始化塊->構造方法->普通方法。

 9. 初始化塊和構造方法的不同:初始化塊是一段固定的執行代碼,它不能接受任何參數。是以初始化塊對同一個類内的屬性所進行的初始化處理完全相同。

      用法:如果多個構造方法裡有相同的初始化代碼,這些代碼無需接受參數,那就可以把他們放在初始化塊中定義。能更好的提高初始化塊的複用,提高整個應用的可維護性。

      建立一個Java對象時,不僅會執行該類的初始化塊和構造方法,系統會先執行其父類的初始化塊和構造方法。與構造方法類似,建立一個java對象時,不僅會執行該類的初始化塊和構造方法,系統還會一直追溯到java.lang.Object類,先執行Object類的初始化塊和構造方法,然後依次向下執行父類的初始化塊構造方法。。。。最後才執行該類的初始化塊和構造方法,傳回該類的對象。

10.  靜态初始化塊(類加載時執行,且隻執行一次)

      如果定義初始化塊時使用了static修飾符,則這個初始化塊就變成了靜态初始化塊,也被稱為類初始化塊。

µ    靜态初始化塊是類相關的,系統将在類初始化階段執行靜态初始化塊,而不是在建立對象時才執行,是以靜态初始塊總是比普通初始化塊先執行。

µ    靜态初始塊屬于類的靜态成員,用于對類屬性執行初始化處理,不能對執行個體屬性進行初始化處理。同樣遵循靜态成員不能通路非靜态成員的規則。

µ    系統在類初始化階段執行靜态初始化時,不僅會執行本類的靜态初始化塊,還會一直上溯到Object類(如果它包含靜态初始化塊)。經過這個過程,才完成了對類的初始化過程。(先調父類靜态初始化塊,然後調子類的靜态初始化塊,然後再調父類的普通初始化塊和構造方法,然後再子類的。。。) 

注意:靜态初始塊和聲明靜态屬性時所指定的初始值都是該類的初始化代碼,它們的執行順序與源程式中排列順序相同