相信許多小夥伴初次學習多型都是一臉懵逼,不知道在講什麼。在這裡我將把自己對多型的理解分享給大家。
本人口述能力有限,在這裡用**來解釋多型
class
person
}
這是乙個父類person,有乙個屬性name和乙個方法eat 。再寫乙個子類student,如下
class
student
extends
person
//特有方法study
public
void
study()
}
那麼在宣告物件的時候,一般情況下會這樣寫:
person p =
newperson()
;//或者
student s =
newstudent()
;
***********************************==
如果說我們這樣建立乙個新的物件的話:
person p =
newstudent()
;
這樣就叫做多型。
怎麼樣,這個解釋是不是非常的簡單粗暴~
總結下來就是用父類建立乙個子類物件。
講完概念,就要將一些細節。有乙個特別需要注意的點,就是這個物件的訪問許可權如何。話不多說,上**
//首先寫乙個main方法,進行兩個類方法的測試
public
static
void
main
(string[
] args)
如上,p1和p2的輸出為:
這說明兩個物件確實各自輸出了本類的eat方法。那麼再看下面的情況
我用student物件呼叫它的study方法缺發生錯誤,大家一定想知道為什麼。下面來解釋原因:
大家都知道new 乙個新物件的語法,類名 + 變數名 = new + 類名
那麼在多型的情況下,系統在編譯的時候看的是左邊的i類名,也就是父類。這樣以來大家就明白為什麼會出現上圖的錯誤了,原來父類也就是person類中並沒有study方法,因此系統會報錯。
接下來再進行乙個測試
public
class
student
extends
person
//特有方法study
public
void
study()
}
我把學生類中重寫的eat方法給注掉,再次在main方法中輸出p2.eat後結果為:
所以得出乙個結論:編譯的時候系統會載入左邊類的方法,但是建立物件執行的時候,優先看的是左邊的子類中是否有重寫的方法,如果有就呼叫重寫後的方法,如果沒有則返回父類中呼叫原本的方法。
當然,看完後可能大家還是不太理解。為了方便大家自己動手,以下為我新增的子類teacher,大家可以複製貼上方便自行驗證。
class
teacher
extends
person
//特有方法teach
public
void
teach()
}
ps:每天堅持擼**,總有一天會禿 C 多型的一些理解
1.c 中的多型,簡單來說是用基類的指標指向子類的物件,然後用這個基類指標就可以呼叫子類物件的方法 這些方法在基類中有,且被宣告為虛函式 如果乙個方法沒有被宣告為虛函式,則呼叫哪個方法取決於指標的型別。2.這是自己寫的乙個例子 class a public virtual void say clas...
對Linux inode的一些理解
檔名 inode device block 一 inode是什麼?理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做 扇區 sector 每個扇區儲存512位元組 相當於0.5kb 作業系統讀取硬碟的時候,不會乙個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次...
對棧的一些理解
之前總結過一篇有關函式棧幀的部落格 函式棧幀以及呼叫約定相關的一些總結 但是感覺自己還是有一點知識點沒有弄懂,今天中午跟郭哥吃過飯一起 有關殼的問題的時候,順便把這個問題請教了一下郭哥,終於弄明白了,在此要特地感謝他,這裡把一些心得體會寫出來 先看一幅圖 選自ida權威指南 注意圖中是基於esp的棧...