寫在前面
前面講的是物件導向中的繼承思想,下面讓我們來看看多型這部分的內容!
Java 物件導向概念概述
多型
概述:某一個事物在不同狀態下的多種狀態。
實現多型的三大前提:
- 要有繼承關係。
- 要有方法的重寫。
- 要有父類的引用指向子類物件。
訪問成員的特點:
- 成員變數:編譯時看左,執行時看左。
- 成員方法:編譯時看左,執行時看右。
- 靜態成員方法:編譯時看左,執行時看左。
多型的好處:
- 提高了程式的維護性(繼承)。
- 提高了程式的擴充套件性(多型)。
多型的弊端:
- 在多型的形式下,無法使用子類中特有的成員方法。
- 解決方案:向下轉型(例如,曹操曹植的故事)。
- 向下轉型可能會遇到的問題:
ClassCastException
類轉換異常,比如將Apple
變成Banana
。
抽象類
概述:用來描述現實生活中抽象的概念集合。
語法:使用 abstract
關鍵字進行修飾。
特點:
abstract
可以修飾類和成員方法。- 一個抽象類中,既可以存在抽象方法,也可以存在具體的實現方法。
- 當一個類中有抽象方法時,這個類必須是抽象類。
- 抽象類可以繼承抽象類,可以選擇性地重寫方法。
- 具體的類繼承抽象類時,必須重寫所有的抽象方法。
- 抽象類不能例項化。
- 抽象類和類一樣,子類只能繼承一個父類,但可以多層繼承。
介面
概述:主要用來描述事物額外的擴充套件功能。
關鍵字:interface
特點:
- 介面中只有常量,所有的變數預設使用
public static final
修飾。 - 介面中只允許出現抽象方法,所有的方法預設使用
public abstract
修飾。 - 具體類實現介面使用
implements
關鍵字。當具體類實現介面時,必須實現介面中所有的抽象方法。 - 一個類可以同時實現多個不同介面。
- 介面與介面之間的關係是繼承關係,一個介面可以同時繼承多個介面。
- 介面無法例項化。
形式引數和返回值型別的對比
形式引數:
- 類:當看到一個類作為方法引數型別時,呼叫時需要傳遞該類及其子類物件。
- 抽象類:當看到一個抽象類作為方法引數型別時,呼叫時需要傳遞繼承該抽象類的具體子類物件。
- 介面:當看到一個介面作為方法引數型別時,呼叫時需要傳遞實現該介面的具體子類物件。
返回值型別:
- 類:當看到一個類作為方法的返回值型別時,方法內部應返回該類或該類的子類物件。
- 抽象類:當看到一個抽象類作為方法的返回值型別時,方法內部應返回繼承該抽象類的具體子類物件。
- 介面:當看到一個介面作為方法的返回值型別時,方法內部應返回實現了該介面的具體子類物件。
包
包的劃分:
- 根據功能進行劃分。
- 根據角色進行劃分.
導包:
- 使用
import
。 import
語句在package
和所有class
之間寫。
許可權修飾符
許可權修飾符:
許可權修飾符 | 同一類中 | 同一包子類,其他類 | 不同包子類 | 不同包其他類 |
---|---|---|---|---|
public |
√ | √ | √ | √ |
protected |
√ | √ | √ | |
預設 | √ | √ | ||
private |
√ |
總結:
public
:都可以訪問。protected
:只能在子類中訪問。- 預設:只能在包內訪問。
private
:只能在類中訪問。
內部類
成員內部類:
- 概述:將類定義在另一個類的成員位置上。
- 形式:
- 形式 1:沒有使用
static
或private
關鍵字修飾。外部類名.內部類名 物件名 = new 外部類名().new 內部類名();
- 形式 2:使用
static
關鍵字修飾。外部類名.內部類名 物件名 = new 外部類名.內部類名();
- 形式 3:使用
private
關鍵字修飾。- 只能在類中使用,外界無法訪問。
- 形式 1:沒有使用
區域性內部類:
- 概述:將類定義在方法內部。
- 特點:
- 只能在方法內部使用。
- 方法定義的區域性變數在區域性內部類中預設是
final
,不能修改。
匿名內部類:
- 語法定義格式:
new 抽象類/介面/類() { // 重寫方法 };