1. 程式人生 > >3.JAVA中的多型

3.JAVA中的多型

方法的重寫規則

  • 引數列表必須完全與被重寫方法的相同;
  • 返回型別必須完全與被重寫方法的返回型別相同;
  • 訪問許可權不能比父類中被重寫的方法的訪問許可權更低。例如:如果父類的一個方法被宣告為public,那麼在子類中重寫該方法就不能宣告為protected。
  • 父類的成員方法只能被它的子類重寫。
  • 宣告為final的方法不能被重寫。
  • 宣告為static的方法不能被重寫,但是能夠被再次宣告
  • 子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了宣告為private和final的方法。
  • 子類和父類不在同一個包中,那麼子類只能夠重寫父類的宣告為public和protected的非final方法。
  • 重寫的方法能夠丟擲任何非強制異常,無論被重寫的方法是否丟擲異常。但是,重寫的方法不能丟擲新的強制性異常,或者比被重寫方法宣告的更廣泛的強制性異常,反之則可以。
  • 構造方法不能被重寫。
  • 如果不能繼承一個方法,則不能重寫這個方法。

多型

多型的優點

  • 1. 消除型別之間的耦合關係
  • 2. 可替換性
  • 3. 可擴充性
  • 4. 介面性
  • 5. 靈活性
  • 6. 簡化性

多型存在的三個必要條件

  • 繼承
  • 重寫
  • 父類引用指向子類物件

使用多型呼叫方法的時候先去父類中查詢是否有這個方法。沒有的話就報錯,因為父類都沒有,也就無法繼承,何談重寫?

如果有,再去呼叫子類的同名方法。

多型的好處:可以使程式有良好的擴充套件,並可以對所有類的物件進行通用處理

要想呼叫父類中被重寫的方法,則必須使用關鍵字super。

多型的實現方式

方式一:重寫:

方式二:介面(implements 變相實現多繼承

  • 1. 生活中的介面最具代表性的就是插座,例如一個三接頭的插頭都能接在三孔插座中,因為這個是每個國家都有各自規定的介面規則,有可能到國外就不行,那是因為國外自己定義的介面型別。

  • 2. java中的介面類似於生活中的介面,就是一些方法特徵的集合,但沒有方法的實現。具體可以看 java介面 這一章節的內容。

方式三:抽象類和抽象方法

abstract

如果你想設計這樣一個類,該類包含一個特別的成員方法,該方法的具體實現由它的子類確定

,那麼你可以在父類中宣告該方法為抽象方法。

Abstract關鍵字同樣可以用來宣告抽象方法,抽象方法只包含一個方法名,而沒有方法體。

抽象方法沒有定義,方法名後面直接跟一個分號,而不是花括號。

在Java中抽象類表示的是一種繼承關係,一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。

宣告抽象方法會造成以下兩個結果:

  • 如果一個類包含抽象方法,那麼該類必須是抽象類。
  • 任何子類必須重寫父類的抽象方法,或者宣告自身為抽象類。

抽象類總結規定

  • 1. 抽象類不能被例項化(初學者很容易犯的錯),如果被例項化,就會報錯,編譯無法通過。只有抽象類的非抽象子類可以建立物件。

  • 2. 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

  • 3. 抽象類中的抽象方法只是宣告,不包含方法體,就是不給出方法的具體實現也就是方法的具體功能。

  • 4. 構造方法,類方法(用static修飾的方法)不能宣告為抽象方法。

  • 5. 抽象類的子類必須給出抽象類中的抽象方法的具體實現,除非該子類也是抽象類。