多态
抽象類
- 抽象方法 : 沒有方法體的方法。
- 抽象類:被abstract所修飾的類。
抽象類的文法格式:
【權限修飾符】 abstract class 類名{
}
【權限修飾符】 abstract class 類名 extends 父類{
抽象方法的文法格式:
【其他修飾符】 abstract 傳回值類型 方法名(【形參清單】);
子類對父類抽象方法的完成實作,我們将這種方法重寫的操作,也叫做實作方法。
注意事項
- 抽象類不能建立對象,如果建立,編譯無法通過而報錯。隻能建立其非抽象子類的對象。
了解:假設建立了抽象類的對象,調用抽象的方法,而抽象方法沒有具體的方法體,沒有意義。
- 抽象類中,也有構造方法,是供子類建立對象時,初始化父類成員變量使用的。
了解:子類的構造方法中,有預設的super()或手動的super(實參清單),需要通路父類構造方法。
- 抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
了解:未包含抽象方法的抽象類,目的就是不想讓調用者建立該類對象,通常用于某些特殊的類結構設計。
- 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象類。
了解:假設不重寫所有抽象方法,則子類中可能包含抽象方法。那麼建立對象後,調用抽象的方法,沒有意義。
多态: 是指同一個類别的事物的同一行為,在不同的子類别中具有多個不同表現形式。
從文法角度來說,多态就是在運作期間才能确定調用哪個類的方法,即執行子類重寫的方法。
前提【重點】
- 繼承父類或者實作接口【二選一】
- 方法的重寫【意義展現:不重寫,無意義】
- 1)靜态方法 2)final方法 3)private方法 4)屬性; //這些不能重寫的就不可能有多态(即靜态綁定)。隻有能重寫的方法才有多态(即動态綁定)。
- 父類引用指向子類對象【格式展現】
多态展現的格式:
父類類型 變量名 = 子類對象;
變量名.方法名();//這個方法是父類中聲明,子類中重寫的方法
父類類型:指子類對象繼承的父類類型,或者實作的父接口類型。
多态展現出來的現象:
- 編譯時,看“父類”,隻能調用父類聲明的方法,不能調用子類擴充的方法;
- 運作時,看“子類”,一定是執行子類重寫的方法體;
多态的應用
1、多态參數
形參是父類的類型,傳入的實參是子類的對象
2、多态數組
元素的類型是父類的類型,存進去的元素對象是子類的對象
向上轉型
- 向上轉型:多态本身是子類類型向父類類型向上轉換的過程,這個過程是預設的。
父類類型 變量名 = new 子類類型();
向下轉型
- 向下轉型:父類類型向子類類型向下轉換的過程,這個過程是強制的。
子類類型 變量名 = (子類類型) 父類變量名;
向下轉型有風險,可能會發生ClassCastException異常,如果想要避免這個異常,最好在向下轉型之前,用instanceof進行判斷。
變量名/對象 instanceof 資料類型
如果變量/對象屬于該資料類型,傳回true。
如果變量/對象不屬于該資料類型,傳回false。
虛方法
- 靜态綁定:編譯期間就确定通路哪個類的
- 成員變量
- 靜态方法
- 私有方法
- final方法
- 動态綁定:運作期間才确定通路哪個類的
- 可能被子類重寫的非靜态方法(也稱為虛方法)
native關鍵字
用法:隻能修飾方法
表示這個方法的方法體代碼不是用Java語言實作的,但是可以當做Java的方法一樣去正常調用它,或者子類重寫它。
修飾符一起使用問題
修飾符 | 外部類 | 代碼塊 | 構造器 | 方法 | 局部變量 | |
---|---|---|---|---|---|---|
public | √ | × | ||||
protected | ||||||
private | ||||||
static | ||||||
final | ||||||
abstract | ||||||
native |
不能和abstract一起使用的修飾符?
(1)abstract和final不能一起修飾方法和類
(2)abstract和static不能一起修飾方法
(3)abstract和native不能一起修飾方法
(4)abstract和private不能一起修飾方法
static和final一起使用:
(1)修飾方法:可以,因為都不能被重寫
(2)修飾成員變量:可以,表示靜态常量
(3)修飾局部變量:不可以,static不能修飾局部變量
(4)修飾代碼塊:不可以,final不能修飾代碼塊
(5)修飾内部類:可以一起修飾成員内部類,不能一起修飾局部内部類
Object根父類
類
java.lang.Object
是類層次結構的根類,即所有類的父類。每個類都使用
Object
作為超類。
- Object類型的變量與除Object以外的任意引用資料類型的對象都多态引用
- 所有對象(包括數組)都實作這個類的方法。
- 如果一個類沒有特别指定父類,那麼預設則繼承自Object類。
關于Object類的API另見Java類/接口的API