面向?qū)ο蟮娜蠡咎卣魇牵悍庋b、繼承、多態(tài)寂恬。
封裝
封裝為私有變量創(chuàng)建公共方法,使得外部可以調(diào)用莱没。這樣做的好處是實現(xiàn)了訪問控制初肉,讓客戶端程序員無法觸及不應(yīng)該觸及的部分(private),而內(nèi)創(chuàng)建者不用擔(dān)心由于自己的修改使得客戶端程序員產(chǎn)生影響(public 調(diào)用)饰躲。
繼承
在創(chuàng)建一個新類后牙咏,即使另外一個新類與其具有相似的功能,還必須重新創(chuàng)建一個新類嘹裂。如果我們以現(xiàn)有的類為基礎(chǔ)眠寿,將其方法和屬性復(fù)制到新類就好了,這就是繼承焦蘑。子類繼承父類的方法和屬性盯拱。在關(guān)于繼承可能引發(fā)的某種爭論:繼承應(yīng)該只繼承父類的方法(而不添加在基類中沒有的新方法)嗎?在父類的基礎(chǔ)上例嘱,可以添加新的接口元素狡逢,這樣就擴展了接口,雖然此類型還是可以替代基類拼卵,但不很完全奢浑,我們稱之為is-like-a(像一個)關(guān)系;另外腋腮,若子類只是覆蓋(重寫雀彼,overriding)父類的方法,被稱為純粹替代即寡,是一種最為理想的方法徊哑,導(dǎo)出類和基類的關(guān)系成為is-a (是一個)關(guān)系。
多態(tài)分為兩種:
1.編譯時多態(tài):方法的重載
2.運行時多態(tài):AVA運行時系統(tǒng)根據(jù)調(diào)用該方法的實例的類型來決定選擇調(diào)用哪個方法則被稱為運行時多態(tài)聪富。(我們平時說得多的事運行時多態(tài)莺丑,所以多態(tài)主要也是指運行時多態(tài))
什么是多態(tài)
面向?qū)ο蟮娜筇匦?/b>:封裝、繼承、多態(tài)梢莽。從一定角度來看萧豆,封裝和繼承幾乎都是為多態(tài)而準備的。這是我們最后一個概念昏名,也是最重要的知識點涮雷。
多態(tài)的定義:指允許不同類的對象對同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式轻局。(發(fā)送消息就是函數(shù)調(diào)用)
實現(xiàn)多態(tài)的技術(shù)稱為:動態(tài)綁定(dynamic binding)洪鸭,是指在執(zhí)行期間判斷所引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法嗽交。
多態(tài)的作用:消除類型之間的耦合關(guān)系卿嘲。
現(xiàn)實中,關(guān)于多態(tài)的例子不勝枚舉夫壁。比方說按下 F1 鍵這個動作拾枣,如果當(dāng)前在 Flash 界面下彈出的就是 AS 3 的幫助文檔;如果當(dāng)前在 Word 下彈出的就是 Word 幫助盒让;在 Windows 下彈出的就是 Windows 幫助和支持梅肤。同一個事件發(fā)生在不同的對象上會產(chǎn)生不同的結(jié)果。
多態(tài)存在的三個必要條件?一邑茄、要有繼承姨蝴;?二、要有重寫肺缕;?三左医、父類引用指向子類對象。
class A ...{
? ? ? ? public String show(D obj)...{?
? ? ? ? ? ? ? ? return ("A and D");?
? ? ? ? }?
? ? ? ? public String show(A obj)...{?
? ? ? ? ? ? ? ? return ("A and A");?
? ? ? ? }?
}?
class B extends A...{?
? ? ? ? public String show(B obj)...{?
? ? ? ? ? ? ? ? return ("B and B");?
? ? ? ? }?
? ? ? ? public String show(A obj)...{?
? ? ? ? ? ? ? ? return ("B and A");?
? ? ? ? }?
}?
class C extends B...{}?
class D extends B...{}
? ? ? ?A a1 = new A();
? ? ? ? A a2 = new B();?
? ? ? ? B b = new B();?
? ? ? ? C c = new C();?
? ? ? ? D d = new D();?
? ? ? ? System.out.println(a1.show(b));? ①? //a1指向的類時A
? ? ? ? System.out.println(a1.show(c));? ②?
? ? ? ? System.out.println(a1.show(d));? ③?
? ? ? ? System.out.println(a2.show(b));? ④? //a2指向的類時B同木,B類直接超類是A而且重寫了show(A OBJ)浮梢。所以當(dāng)傳入的參數(shù)是B對象的時候,調(diào)用B類從寫的方法彤路。
? ? ? ? System.out.println(a2.show(c));? ⑤?
? ? ? ? System.out.println(a2.show(d));? ⑥?
? ? ? ? System.out.println(b.show(b));? ? ⑦?
? ? ? ? System.out.println(b.show(c));? ? ⑧? //b指向的類是B秕硝,而C,D類的直接超類是B所以調(diào)用的是show(B OBJ)。
? ? ? ? System.out.println(b.show(d));? ? ⑨
① A and A
②? A and A
③? A and D
④? B and A
⑤? B and A
⑥? A and D
⑦? B and B
⑧? B and B
⑨? A and D