1. 程式人生 > >怎樣理解封裝,繼承,多型!三者的區別?

怎樣理解封裝,繼承,多型!三者的區別?

1。類是對物件的一個抽象,同時類也為物件進行了封裝。所謂封裝是說類的設計者只是為使用者提供類    物件可以訪問的部分,而對於類中其他隱藏起來的成員變數 方法,使用者不能訪問。 
    實現方式:A:在類的定義中設定對物件中成員變數和方法進行訪問的許可權; 
                    B:提供一個統一的供其他類引用的方法; 
                    C:其它物件不能直接修改文字物件所擁有的屬性和方法。 
2。訪問許可權: 
      A:private的成員變數和方法只能被這個類本身的方法訪問; 
      B:預設的成員變數和方法只被同一個包內的其它所有類都可訪問,包外不可; 
      C: protected的成員可以被這個類的本身、它的子類(同不同包均可)訪問; 
      D: public 完全公開。一個程式裡最多隻能有一個類被修飾為public,若程式中沒有任何public 類,且檔名是程式中的一個類名,則該類被視做public 
注:不能用protected和private飾!!!! 

3。類的繼承: 
    3.1 類繼承的實現: 
        A:java中Object類是java中所有類的祖宗!(P209) 
        兒子A extends 老爸------只能有一個老爸! 
    3.2 this和super: 
        this: this.資料成員    this.例項方法    this(引數)--引用本類中其他構造方法。 
        super:表示當前物件父類物件的引用 
              super.資料成員  super.例項方法  super(引數)--引用父類的構造方法。--通常在實現子 類的構造方法時,要先呼叫父類的構造方法!並且用來呼叫父類構造方法的super()必須放在子類構造方法的句首 
    3.3 初始化順序: 
        A 物件的初始化順序: 先靜態成員,再非靜態成員,再構造方法, 
        B 繼承中構造方法的呼叫順序: 先父類,再子類。 
  
3.4 物件之間的型別轉換: 
        物件轉換的聖經:只能說貓是哺乳動物,不能說哺乳動物是貓!!!當說貓是哺乳動物時,貓將失掉貓獨有的屬性和行為!!!(作為貓時新增的成員變數和方法) 

              哺乳動物 aa=new 貓()---貓是哺乳動物(要通過IS-A測試) 
4.千呼萬喚始出來------多型! 
        所謂多型就是同一方法獲得不同的行為特性! 
        分為: 
        A 編譯時多型性---過載 (引數個數不同或引數型別不同)  
        B 動態多型性----覆蓋( 改寫後的方法不能比覆蓋的方法有更嚴格的訪問許可權--只能更加開放&                                改寫後的方法不能比被覆蓋的法產生更多的例外) 

****************************************************************** 
    放點小音樂吧! 
****      *******      第一曲 final: 
                              1。final type 變數名=初值---常量 
                              2。final 方法---該方法任何時候都不可以覆蓋,但可以被過載。 
                              3。final 類 ----該類不能被繼承並覆蓋其內容。(像System類,String類) 
                      第二曲 native: 本地引用說明符^@^ 
                                  java允許在程式中直接引用本地機上非java語言編寫的程式。 
                            native type programName([引數列表]); 
          
                          programName是要引用的程式名,以方法的形式出現。由於是引用,具體執行的操作都包含在源程式中,所有programName後無具體方法體! 
****************************************************************** 
一。深入繼承: 
    1》設計繼承樹: 
        (1)找出具有共同屬性和行為的物件(狼和狗與羊^^---動物共同的屬性) 
        (2)設計代表共同狀態與行為的類(都屬於動物!---父類) 
        (3)決定子類是否需要讓某項行為有特定不同運作的方式(都會吃,但羊只吃草---方法的覆蓋) 
        (4)通過尋找使用共同行為的子類找出更多抽象化的機會(狼和狗屬於犬科!!!--再繼承) 
        (5)檢查設計是否合理(IS-A) 
        (6)大功告成! 
    2》繼承的意義: 
        (1)避免了重複的程式碼(子類會時時響應父類的改變) 
        (2)定義出共同的協議(服務於多型^^) 
        ?當定主義出一組類的父型時,你可以用子型的任何類來填補任何需要或期待父型的位置? 

二。深入多型: 
  (1) class Vet{ 
      public void giveShot(Animal a){    
                                      
            a.makeNoise(); 
                                                        
        } 
        } 
    class PetOwner{ 
      public void start(){ 
        Vet v=new Vet(); 
        Dog d=new Dog(); 
        Hippo h=new Hippo(); 
        v.giveShot(d); 
        V.giveSHot(h); 
        } 
        } 
        在此例中如果用Animal型別來宣告它的引數(返回型別、陣列的型別),則程式程式碼就可以處理所有Animal的子類。這意味 著其它人只要注意到要擴充過Animal就可以利用你的Vet!(P168) 
        如果此例不用多型,那麼每一種動物都要寫出不同的方法--這是何等悲哀!! 
            
    (2)介面: 
        多型意味著“很多形式”,可以把兒子當作爸爸或爺爺!! 
        可以通過繼承來定義相關類間的共同協議(方法就是協議的標誌!),這樣就等同於在對其他程式程式碼宣告:“我所有的子類都能腸系用這些方法來執行這幾項工作!”  
        
        為了避免出現“致命方塊”所以java不允許出現多繼承,介面正是我們的救星!java介面是100% 的純抽象類。而且使用介面可以繼承一個以上的來源,同時其他類也可以實現同一個介面中。所以可以為不同的需求組合出不同的繼承層次! 

三。如何判斷應該是設計類、子類、抽象類或介面呢? 

    (1)如果新類無法對其他的類通過IS-A測試時,就設計不繼承其他類的類。 

    (2)只有在需要某類的特殊化版本時,以覆蓋或增加新的方法來繼承現有的類。 

    (3)當你需要定義一群子類的模板,又不想讓其他人初始化此模版時,設計出抽象的類給他們用。 
    
    (4)如果想要只定義出類可以扮演的角色,使用介面。