抽象和繼承的多型

2021-10-13 10:45:09 字數 3595 閱讀 3147

abstract關鍵字用來修飾關鍵方法和修飾抽象類。為什麼會產生抽象類呢,那是因為在**的開發過程種,子類的種類越來越多,也越來越具體,慢慢的基本不需要使用父類的具體實現(也就是不需要new 父類後,來使用父類,而是只是把所有子類用的東西抽象出來,放到父類種,具體使用子類的實現,來實現具體的功能,就像現在沒有人會new oject()沒人會直接使用object類一樣)。

雖然不能new 父類,但是需要保留父類的構造方法,因為在子類例項化的時候需要先去呼叫父類的構造方。

package com.mystudy;

/** * @author yongchaoliu

* @create 2020-12-30 10:47

*/public

class

testabstract

}abstract

class

personss

public

personss

(string name,integer age)

public

void

eat(

)@override

public string tostring()

';}}

class

humana

extends

personss

public

humana

(string name, integer age)

public integer updateage()

}

用abstract修飾的方法就是抽象方法

1.抽象方法所在的類一定是抽象類,反之,抽象類中不一定含有抽象方法

為什麼抽象方法所在的類一定是抽象類呢?:首相我們前面說過了,抽象類是不用來例項化直接使用的,如果抽象方法所在的類不是抽象類,那就是需要例項化的(比如普通子類中含有抽象方法,那麼例項化子類的時候,當呼叫抽象方法的時候,沒有方法體,就會有問題,所以要麼抽象方法必須在抽象類中,並且普通子列重寫抽象方法,要麼子類也是抽象類)

abstract

class

person**

****

****

****

*子類重寫抽象方法***

****

****

****

*class

human

extends

person}*

****

***子類也是抽象類***

可以看出使用父類的引用指向子物件時(person_a man=new man_a())只能呼叫父類中的方法,可以看到呼叫子類中的獨有方法是編譯不過去的,那麼問題來了,在我們是用多型的時候,我們傳乙個子類到形參是乙個父類的方法是,無法呼叫子類獨有的方法,那麼多型就毫無意義了不是嗎,我們可以強轉一下接了呼叫相應的方法了

但是這存在乙個問題,如果我傳入乙個women呢 這個時候強轉就會報錯。

所以就需要用到instanceof 關鍵字,該關鍵字表示是不是類的乙個例項,或者說是不是該類或者是不是該類的子類。是就可以可以強轉了。(需要注意的是women instanceof women 是false的)

在我們不同的型別的相互轉換的時候,

**1.**低精度的可以自動轉換成高精度,

**2.**高精度不能自動轉換為低精度,需要用到強轉

1.子類可以自動轉換為父類(父類的引用指向子類的例項)

2.父類不可以自動轉換為子類

3.父類的引用指向子類物件後,可以強轉回子類

4.子類之間不能互相轉換。

為什麼回存在這樣的現象呢?說一下我的理解 ,我們從實際的使用場景中就能理解了。

1.子類可以自動轉換為父類(父類的引用指向子類的例項):實際場景中我們需要使用到多型,這就需要在父類是形參的視情況下,允許我們傳入子類例項

2.父類不可以自動轉換為子類:父類轉換為子類以後,當我們呼叫子類中特有的方法是肯定會報錯,因為父類中沒有子類特有的方法。

3.父類的引用指向子類物件後,可以強轉回子類:子類轉為父類以後,相當於我只呼叫子類的部分功能,不會產生任何異常,當想轉會子類時再轉回來就是了,自己**己而已。

4.子類之間不能互相轉換:本來就不是父子關係,轉個毛線(父債子還,有父債大街隨便抓個人還嗎,哈哈哈哈)

繼承 抽象 多型

繼承 在php中,使用extends實現繼承,子類 派生類 繼承父類 基類 繼承是為了擺脫重複 繼承 析構方法 子類繼承父類時,子類沒有構造方法,例項化子類物件時,會執行父類的構造方法。子類如果有自己的構造方法,例項化子類物件時,只會自動執行子類自己的構造方法。在子類的構造方法中,使用 parent...

封裝,抽象,繼承,多型。

封裝 隱藏內部實現細節,防止資料被隨意修改,提公升安全性 由於避免暴露了很多實現細節,只提供對於指定欄位的操作或只提供幾個方法,這樣後續修改維護比較容易。下面是乙個杜撰的示例 public class card 下面不提供id的修改,每張卡id只能是一定的,不能被修改了 對於學習者來說,降低其理解難...

抽象 封裝 繼承 多型

計算機是表示和處理資訊的機器。為了解決現實世界的問題,需要把現實世界的問題域對映到計算機系統裡。程式語言被用來輔助人們向計算機系統講述現實世界問題域的工具。問題域中具有大量資訊,我們需要用某種信條指導,對這些資訊進行梳理。在物件導向的程式設計正規化下,有四個處理資訊的教條 抽象,封裝,繼承,多型。1...