物件導向 多型的詳解

2021-07-25 01:58:47 字數 3925 閱讀 5815

1. 多型

多型的格式; 父類名 物件名 = new 子類名();

概述:

事物存在的多種形態

前提條件

* a:要有繼承關係。

* b:要有方法重寫。

* c:要有父類引用指向子類物件。

應用:

父類建立的物件當作引數的時候用多型最好,因為擴充套件性強
應用場景:

可以作為方法形參的額資料型別,這樣可以接受其任意的子類物件
多型中的成員訪問特點

成員變數

編譯看左邊(父類),執行看左邊(父類)。

記憶體圖:()

多型中的成員變數

this:代表當前物件的引用

super:只是代表當前物件中父類空間的標識

成員方法

編譯看左邊(父類引用,父類介面引用),

執行看右邊(子類) 因為成員方法有重寫

記憶體圖()

多型中的成員方法

靜態方法

* 編譯看左邊(父類),執行看左邊(父類)。

* (靜態和類相關,算不上重寫,所以,訪問還是左邊的)

* 只有非靜態的成員方法,編譯看左邊,執行看右邊

相當於類名呼叫

向上轉型和向下轉型

animal a = new cat();  //向上轉型

cat c = (cat)a; //向下轉型

必須有向上轉型,才有能向下轉型

多型的好處和弊端

優點* a:可以將物件當作引數傳遞

* b:提高了**的維護性(繼承保證)

* c:提高了**的擴充套件性(由多型保證)

* c:可以當作形式引數,可以接收任意子類物件

缺點不能使用子類的特有屬性和行為

instanceof關鍵字

判斷前邊的引用是否是後邊的資料型別

public static void method(animal a) else if (a instanceof dog) else

}

//(開發中這種方法用的不多,一般是直接使用父類的屬性和方法,很少用子類的特有屬性和方法。)

2,抽象類

概述:

抽象就是看不懂的

概念詳解:

抽象類無法直接建立物件,只能被子類繼承後,建立子類物件

方法重寫更多的應用在於實現父類沒有實現的應用

成員特點:

特點:* a:抽象類和抽象方法必須用abstract關鍵字修飾

* abstract class 類名 {}

* public abstract void eat();

* b:抽象類不能例項化的,抽象類如何例項化呢?

* 按照多型的方式,由具體的子類例項化。

其實這也是多型的一種,抽象類多型。

* c:抽象類的子類

* 要麼是抽象類

* 要麼重寫抽象類中的所有抽象方法

* d:抽象類不一定有抽象方法,有抽象方法的類一定是抽象類或者是介面

* a:成員變數:既可以是變數,也可以是常量。

* b:構造方法: 用於子類訪問父類資料的初始化。

* c:成員方法:既可以是抽象的,也可以是非抽象的。

抽象方法的作用:

* a:抽象方法 強制要求子類做的事情。

* b:非抽象方法 子類繼承的事情,提高**復用性。

abstract關鍵字

作用用於修飾成員方法、類

被abstract修飾的方法叫做抽象方法

抽象方法沒有方法體

被abstract修飾的類叫做抽象類

1、子類要麼重寫父類抽象方法,要麼就是抽象類

2、抽象類不能例項化的

注意事項

不能修飾成員變數

不能修飾常量

不能與static、final、private關鍵字共存

面試題面試題1

*乙個類如果沒有抽象方法,卻定義為了抽象類,有什麼用?

* 這麼做目的只有乙個,就是不讓其他類建立本類物件,交給子類完成

面試題2

* abstract不能和哪些關鍵字共存

abstract與static關鍵字不能共存

被abstract修飾的方法沒有方法體

被static修飾的可以用類名.呼叫,但是類名.呼叫抽象方法是沒有意義的

abstract與final關鍵字不能共存

被abstract修飾的方法強制子類重寫

被final修飾的不讓子類重寫,所以他倆是矛盾

abstract與private關鍵字不能共存

被abstract修飾的是為了讓子類看到並強制重寫

被private修飾不讓子類訪問,所以他倆是矛盾的

a:抽象類有構造方法,不能例項化,那麼構造方法有什麼用?

用於子類訪問父類資料的初始化

*

3,介面

概述 :

介面就是功能的集合

(一切事物均有功能,即一切事物都有介面)

概述: 比抽象類更抽象,裡面的成員:而且只能有成員變數

介面特點:

* a:介面用關鍵字inte***ce表示

* inte***ce 介面名

* b:類實現介面用implements表示

* class 類名 implements 介面名 {}

* c:介面不能例項化

* 那麼,介面如何例項化呢?

* 按照多型的方式來例項化。

* d:介面的子類

* a:可以是抽象類。但是意義不大。

* b:可以是具體類。要重寫介面中的所有抽象方法。(推薦方案)

成員特點

* 成員變數;只能是常量,並且是靜態的並公共的。

* 預設修飾符:public static final

* 建議:自己手動給出。

* 成員方法:只能是抽象方法。

* 預設修飾符:public abstract

* 建議:自己手動給出。

* 構造方法:介面沒有構造方法。

類與類,類與介面,介面與介面的關係

* a:類與類:

* 繼承關係,只能單繼承,可以多層繼承。

* b:類與介面:

* 實現關係,可以單實現,也可以多實現。

* 並且還可以在繼承乙個類的同時實現多個介面。

* c:介面與介面:

* 繼承關係,可以單繼承,也可以多繼承。

抽象類和介面的區別

成員區別

* 抽象類:

* 成員變數:可以變數,也可以常量

比普通類多一種:抽象方法,而且抽象方法還可以不寫

* 構造方法:有

* 成員方法:可以抽象,也可以非抽象

* 介面:

* 成員變數:只可以常量

* 成員方法:只可以抽象

關係區別

* 類與類

* 繼承,單繼承

* 類與介面

* 實現,單實現,多實現

* 介面與介面

* 繼承,單繼承,多繼承

設計理念區別

* 抽象類 被繼承體現的是:」is a」的關係。抽象類中定義的是該繼承體系的 共性功能。

* 介面 被實現體現的是:」like a」的關係。介面中定義的是該繼承體系的 擴充套件功能。

注意介面不能繼承object類,但是底層拿到了object類中所有方法的對映

物件導向的多型

多型 1.必須要存在繼承關係 2.存在方法的重寫 不是必須,但是不重寫沒有意義 動物 d new 貓 動物 d new 狗 3.父類要指向之類的引用 父 f new 子 多型的注意事項 1.多型成員訪問的特點 fu f new zi 左邊為父類 右邊為子類 1 成員變數 編譯看左邊,執行看左邊 2 ...

物件導向 多型

繼承是多型的基礎,是指物件的多種形態 1.引用的多型 1 父類的引用可以指向本類的物件 2 父類的引用可以指向子類的物件 注意 子類的引用不能指向父類的物件 2.方法的多型 1 建立本類物件時,呼叫的方法是本類的方法 2 建立子類物件時,呼叫的方法是子類重寫的方法或是繼承的方法 注意 如果是子類獨有...

物件導向 多型

多型可以簡單的概括為 乙個介面,多種方法 在程式執行過程中才決定呼叫的函式,簡單的說就是,允許將子類型別的指標賦值給父類型別的指標,賦值後,父類物件就可以根據當前賦給它的子類物件的特徵以不同的方式執行。容易混淆的兩個概念 是指允許存在多個同名的函式,而這些函式的參數列不同 或許引數個數不同,或許引數...