抽象類,介面,多型,向上(下)轉型,內部類
抽象類:
因為繼承的關係,子類的功能可以越來越具體,相對來說,父類
更加一般化,通用化。因為父類封裝了子類的共同行為,所以,
在定義時,我們可以定義方法的邏輯。有的時候,在父類中無法完成
子類的功能需求,此時,不如不寫,即不寫方法體,程式碼簡單化。
但是此方法必須使用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
我們想使用的類的名稱(可以有參){};大括號裡重寫介面或抽象類裡的所有抽象方法,或
重寫某一個實現方法。