1. 程式人生 > >抽象類,介面,多型,向上(下)轉型,內部類

抽象類,介面,多型,向上(下)轉型,內部類

抽象類:
   因為繼承的關係,子類的功能可以越來越具體,相對來說,父類
  更加一般化,通用化。因為父類封裝了子類的共同行為,所以,
 在定義時,我們可以定義方法的邏輯。有的時候,在父類中無法完成
 子類的功能需求,此時,不如不寫,即不寫方法體,程式碼簡單化。
 但是此方法必須使用abstract修飾,那麼此型別也必須使用abstract
 修飾,即抽象類
 
1、抽象方法與抽象類
  1)用abstract修飾的方法,不需要寫方法體,但是得用分號來結尾 
  2)有抽象方法的類,必須使用abstract宣告(修飾)
2、抽象類不能例項化
  1)  抽象類不能建立物件,沒有意義
  2)  抽象類可以提供構造器
  3)  抽象類中可以沒有抽象方法
  4)  abstract和final不能同時修飾一個型別
3、繼承抽象類
  1)若一個類繼承了抽象類,那麼這個類必須重寫(實現)抽象類的所有抽象方法 
  2)若一個類沒有實現抽象類的所有抽象方法, 那麼這個類必須使用abstract修飾
4、抽象類的意義:
   1)給不同的子類定義一個父類
   2)抽象類可以封裝子類的共同特徵與共同行為
   3)雖然子類方法可能有不能的實現邏輯,但是
         方法的定義一致。


介面:
        有時我們需要從多個不相關的類中設計出一個子型別,而java繼承
        是單繼承的特點,無法滿足我們的需求,所以,我們可以使用介面來達到
        多繼承的目的。 
        
        介面實際上就是一種規範制度。   (規範與規則的理解)
介面的特點:
   (1)介面使用interface關鍵字,而不是class,
            但是我們可以理解成介面是特殊的抽象類
   (2)接口裡只能有抽象方法和常量     
   (3)介面不能例項化,沒有任何意義
   (4)介面不能提供構造方法
 
介面中的常量:
       預設使用修飾詞為public static final                      
介面中的方法
        預設使用public abstract
   
介面的實現
   (1)子類需要實現介面中的所有抽象方法,
   (2)使用implements關鍵字進行實現
   (3)如果子類沒有實現所有抽象方法,那麼子類需要使用abstract修飾
   (4)子類可以實現多個介面,介面間使用逗號分開
  
  
介面間的繼承
   (1)介面與介面之間可以使用繼承。
             子介面繼承了父介面的抽象方法
   (2)支援多繼承                
   
======================================
多型:面向物件的特徵之一  (重寫屬於多型)

     向上造型:
             父型別的變數引用子型別的物件
    (1) 父型別的變數指向不同的子型別物件,
                呼叫的功能有不同的實現       
       Animal  a =  new  Dog();
                   a.noise();//叫   
               a =   new  Cat();
                a.noise();//叫   
         
    (2)不同的父型別變數指向同一個物件有不同的功能
       ZhengYangDoor  a  = new  ZhengYangDoor();
            a.theftproof();//防盜
            a.openDoor();//開門
       InterA   ia = a;
               ia.theftproof();   
               
    向下造型:
        將父型別(介面)的變數賦值給子型別或者是其他父型別(介面)的變數
        Animal a = new Dog(); 
        Dog dog   =(Dog)a;
        dog.吃骨頭();
        
        Cat cat = (Cat)a;//編譯通過,語法正確,執行期間,造型錯誤
        cat.撲捉老鼠();
        
       執行期間有可能會發生類造型異常:java.lang.ClassCastException 
        
    
             為了避免出現錯誤:我們需要使用關鍵字instanceof來判斷
             物件是不是要轉換成的型別
         if(a instanceOf Cat){
             Cat cat = (Cat)a;
         }
                 
                         
-------------------------------    
 (1)      員工都有完成工作的行為
                    當員工是老闆時,完成...工作
                    是人事       完成...工作
                    是講師
 (2)張三這個人處在不同的環境下 有不同的功能    


內部類:
    是定義在一個類的內部的新型別。即內部類,另外一個類稱之為
    外部類。
   
  根據位置不同:
   可以有  成員內部類
                方法內部類(區域性內部類)
  帶static修飾詞的類   靜態內部類
 沒有名稱的類:   匿名內部類  
 
 最不常用的:方法內部類,靜態內部類
     方法內部類:定義在方法中,相當於區域性變數,僅限於在方法中使用
                  定義時不能使用修飾詞,可以直接訪問外部類的非靜態成員變數
     靜態內部類:也是以類的成員來定義的,只不過多了一個修飾詞static
                        可以直接訪問外部類的靜態成員
 
相對而言,成員內部類和匿名內部類比較常用。
      成員內部類:以類的成員來定義,可以使用任何修飾詞來修飾。

成員內部類訪問外部類的成員
 方法內隱藏一個指向外部類物件的引用。
 外部類名.this.

             
成員內部類的使用:
    建立物件:
       要先建立一個外部類的物件outer
    然後使用外部類物件去使用new呼叫內部類的構造器例項化
     Inner  inner = outer.new Inner(有參傳參);    
外部類訪問成員內部類的成員
       在外部類新增一個內部類的成員變數進行訪問  
       
       
匿名內部類:
    沒有名字的型別,寫在外部類的方法中,只用一次,不需要定義類的結構,
    通常都是為了實現介面,抽象類或某一現有的類的子類     
    子類沒有名稱,所以稱之匿名  
    
當我們想使用某個類,抽象類或介面的子類物件時,因為我們只想用一次,我們就可以不定義子類
的結構,因此可以使用匿名內部類的寫法,沒有子類名稱,寫法可以向上造型,=後面是new 
 我們想使用的類的名稱(可以有參){};大括號裡重寫介面或抽象類裡的所有抽象方法,或
重寫某一個實現方法。