三大特性:繼承 封裝 多態(tài)
繼承
Java中的繼承只能單繼承允跑,但是可以通過內(nèi)部類繼承其他類來實(shí)現(xiàn)多繼承帅容。
封裝
封裝主要是因?yàn)镴ava有訪問權(quán)限的控制。public > protected > package = default > private。封裝可以保護(hù)類中的信息奋岁,只提供想要被外界訪問的信息澳厢。
多態(tài)
多態(tài)一般可以分為兩種环础,一個(gè)是重寫overwrite,一個(gè)是重載override剩拢。
- 重寫:從jvm實(shí)現(xiàn)的角度來看线得,重寫又叫運(yùn)行時(shí)多態(tài),編譯時(shí)看不出子類調(diào)用的是哪個(gè)方法徐伐,但是運(yùn)行時(shí)操作數(shù)棧會(huì)先根據(jù)子類的引用去子類的類信息中查找方法贯钩,找不到的話再到父類的類信息中查找方法是由于繼承關(guān)系中的子類有一個(gè)和父類同名同參數(shù)的方法,會(huì)覆蓋掉父類的方法办素。
-
重載:重載是編譯時(shí)多態(tài)角雷,在編譯器就可以確定傳入的參數(shù)組合,決定調(diào)用哪一個(gè)具體方法性穿。是在同一個(gè)類中方法名相同勺三,傳入多個(gè)參數(shù)組合。
注意:同名方法如果參數(shù)相同需曾,即使返回值不同也是不能同時(shí)存在的吗坚,編譯會(huì)出錯(cuò)。
向上轉(zhuǎn)型:子類對(duì)象轉(zhuǎn)為父類呆万,父類可以是接口商源。公式:Father f = new Son();Father是父類或接口,son是子類谋减。向上轉(zhuǎn)型后父類的引用所指向的屬性是父類的屬性牡彻,如果子類重寫了父類的方法,那么父類的引用指向的是子類的方法出爹,這個(gè)叫動(dòng)態(tài)綁定庄吼。
- 注1:向上轉(zhuǎn)型后父類引用不能調(diào)用子類獨(dú)有的方法,就是父類沒有但是子類的方法严就。
- 注2:父類引用非要調(diào)用子類的屬性霸褒,不過不向下轉(zhuǎn)型就就需要給需要的屬性寫getter()方法。
向下轉(zhuǎn)型:父類對(duì)象轉(zhuǎn)為子類盈蛮。公式:Son s = (Son)f废菱。 向下轉(zhuǎn)型需要考慮安全性技矮,如果父類引用的對(duì)象是父類本身,那么在向下轉(zhuǎn)型的過程中是不安全的殊轴,編譯不會(huì)出錯(cuò)衰倦,但是運(yùn)行時(shí)會(huì)出現(xiàn)java.lang.ClassCastException錯(cuò)誤。它可以使用instanceof來避免出錯(cuò)此類錯(cuò)誤即能否向下轉(zhuǎn)型旁理,只有先經(jīng)過向上轉(zhuǎn)型的對(duì)象才能繼續(xù)向下轉(zhuǎn)型樊零。
Human h = new Male();// 向上轉(zhuǎn)型
Human h1 = new Human();
//h.speak();此時(shí)需要向下轉(zhuǎn)型,否則不能調(diào)用speak方法孽文。
Male m = (Male) h;
m.speak();
/**Male m1 = (Male)h1;
m1.speak();
向上轉(zhuǎn)型的作用:減少重復(fù)代碼驻襟,父類為參數(shù),調(diào)有時(shí)用子類作為參數(shù)芋哭,就是利用了向上轉(zhuǎn)型沉衣。這樣使代碼變得簡(jiǎn)潔。體現(xiàn)了JAVA的抽象編程思想减牺。