天天看點

Java基礎文法07-面向對象-多态-抽象類-多态應用-修飾符

多态

抽象類

  • 抽象方法 : 沒有方法體的方法。
  • 抽象類:被abstract所修飾的類。

抽象類的文法格式:

【權限修飾符】 abstract class 類名{

}

【權限修飾符】 abstract class 類名 extends 父類{

抽象方法的文法格式:

【其他修飾符】 abstract 傳回值類型  方法名(【形參清單】);

子類對父類抽象方法的完成實作,我們将這種方法重寫的操作,也叫做實作方法。

注意事項

  1. 抽象類不能建立對象,如果建立,編譯無法通過而報錯。隻能建立其非抽象子類的對象。
    了解:假設建立了抽象類的對象,調用抽象的方法,而抽象方法沒有具體的方法體,沒有意義。
  2. 抽象類中,也有構造方法,是供子類建立對象時,初始化父類成員變量使用的。
    了解:子類的構造方法中,有預設的super()或手動的super(實參清單),需要通路父類構造方法。
  3. 抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
    了解:未包含抽象方法的抽象類,目的就是不想讓調用者建立該類對象,通常用于某些特殊的類結構設計。
  4. 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象類。
    了解:假設不重寫所有抽象方法,則子類中可能包含抽象方法。那麼建立對象後,調用抽象的方法,沒有意義。

多态: 是指同一個類别的事物的同一行為,在不同的子類别中具有多個不同表現形式。

從文法角度來說,多态就是在運作期間才能确定調用哪個類的方法,即執行子類重寫的方法。

前提【重點】

  1. 繼承父類或者實作接口【二選一】
  2. 方法的重寫【意義展現:不重寫,無意義】
    • 1)靜态方法 2)final方法 3)private方法 4)屬性;   //這些不能重寫的就不可能有多态(即靜态綁定)。隻有能重寫的方法才有多态(即動态綁定)。
  3. 父類引用指向子類對象【格式展現】

多态展現的格式:

父類類型 變量名 = 子類對象;
變量名.方法名();//這個方法是父類中聲明,子類中重寫的方法      
父類類型:指子類對象繼承的父類類型,或者實作的父接口類型。

多态展現出來的現象:

  • 編譯時,看“父類”,隻能調用父類聲明的方法,不能調用子類擴充的方法;
  • 運作時,看“子類”,一定是執行子類重寫的方法體;

多态的應用

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