由繼承實現多態性: 引用變量能夠指向有繼承關係的任何類的任何對象;但在調用方法時,方法的版本(方法的實際方法體)取決於對象的類型。css
利用接口實現多態性:
接口名能夠聲明對象引用變量html
聲明接口: public interface Speaker { public void speak(); public void announce(String str); }
聲明對象引用變量(可指向實現該接口任何類的任何對象) Speaker current;
實現類與接口之間有一種「是」的關係;
在調用方法時,實際調用的取決於 調用發生接口引用所 指向的對象類型;
在使用接口引用變量時,只能調用定義在接口裏的方法, 若嘗試調用實現接口類裏的其餘方法會產生編譯時錯誤 (編譯器只能肯定類對象是一種Speaker);
適當的類型轉換能夠實現調用:java
((實現接口的類)接口引用變量).方法名()
接口名可作方法參數類型,實現同一接口的類對象可做爲 參數傳遞給方法。git
待比較數據:7, 6, 9, 8, 5,1 第一輪:此時指針指向第一個元素7,找出全部數據中最小的元素,即1,交換7和1的位置,排序後的數據爲:1,6,9,8,5,7 第二輪:第一個元素已經爲最小的元素,此時指針指向第二個元素6,找到6,9,8,5,7中最小的元素,即5,交換5和6的位置,排序後的結果爲:1,5,9,8,6,7 第三輪:前兩個元素爲排好序的元素,此時指針指向第三個元素9,找到9,8,6,7中最小的元素,即6,交換6和9的位置,排序後的結果爲:1,5,6,8,9,7 第四輪:前三個元素爲排好序的元素,此時指針指向第四個元素8,找到8,9,7中最小的元素,即7,交換8和7的位置,排序後的結果爲:1,5,6,7,9,8 第五輪:前四個元素爲排好序的元素,此時指針指向第五個元素9,找到9,8中最小的元素,即8,交換9和8的位置,排序後的結果爲:1,5,6,7,8,9 到此,所有排序完成。
待比較數據:7, 6, 9, 8, 5,1 第一輪:指針指向第二個元素6,假設6左面的元素爲有序的,將6抽離出來,造成7,_,9,8,5,1,從7開始,6和7比較,發現7>6。將7右移,造成_,7,9,8,5,1,6插入到7前面的空位,結果:6,7,9,8,5,1 第二輪:指針指向第三個元素9,此時其左面的元素6,7爲有序的,將9抽離出來,造成6,7,_,8,5,1,從7開始,依次與9比較,發現9左側的元素都比9小,因而無需移動,把9放到空位中,結果仍爲:6,7,9,8,5,1 第三輪:指針指向第四個元素8,此時其左面的元素6,7,9爲有序的,將8抽離出來,造成6,7,9,_,5,1,從9開始,依次與8比較,發現8<9,將9向後移,造成6,7,_,9,5,1,8插入到空位中,結果爲:6,7,8,9,5,1 第四輪:指針指向第五個元素5,此時其左面的元素6,7,8,9爲有序的,將5抽離出來,造成6,7,8,9,_,1,從9開始依次與5比較,發現5比其左側全部元素都小,5左側元素所有向右移動,造成_,6,7,8,9,1,將5放入空位,結果5,6,7,8,9,1。 第五輪:同上,1被移到最左面,最後結果:1,5,6,7,8,9。
(3)排序算法的比較:
兩者實質上效率同樣,均爲n²階算法,但前者所執行的交換操做次數更少,優於後者。算法
(2)二分搜索:
在數組有序的狀況下,效率高於線性搜索;
原理:
假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,若是二者相等,則查找成功;不然利用中間位置記錄將表分紅前、後兩個子表,若是中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,不然進一步查找後一子表。重複以上過程,直到找到知足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。編程
(3)搜素算法的比較:
二分搜索須要數據作過排序,搜索算法的選擇取決於具體條件。數組
多態性設計:
容許用一致性的方法實現不一致的行爲,應更合理地定義類與對象,創建起適當的關聯,以提升軟件的靈活性。數據結構
返回目錄函數
public class Animal { public void eat(){ System.out.println("animal eatting..."); } } public class Cat extends Animal{ public void eat(){ System.out.println("我吃魚"); } } public class Dog extends Animal{ public void eat(){ System.out.println("我吃骨頭"); } public void run(){ System.out.println("我會跑"); } } public class Main { public static void main(String[] args) { Animal animal = new Cat(); //向上轉型 animal.eat(); animal = new Dog(); animal.eat(); } } //結果: //我吃魚 //我吃骨頭
Animal animal = new Cat();將子類對象Cat轉化爲父類對象Animal。這個時候animal這個引用調用的方法是子類方法。
注意事項: 向上轉型時,子類單獨定義的方法會丟失。好比上面Dog類中定義的run方法,當animal引用指向Dog類實例時是訪問不到run方法的,animal.run()會報錯。
優勢: 使代碼更加簡潔。學習
eg:有着一羣不一樣種類動物,我要定義它們吃的方法
沒有使用向上轉型:
public void eat(Cat c){ c.eat(); } public void eat(Dog d){ d.eat(); } //...... eat(new Cat()); eat(new Cat()); eat(new Dog()); //......
假若有上萬種,我得給每一隻都寫一個吃的方法 這不得累死!
而向上轉型有着這樣的好處
public void eat(Animal a){ a.eat(); } eat(new Cat()); eat(new Cat()); eat(new Dog()); //.....
即便後面再有其它種類的動物加進來,只需讓它去實現本身的類,繼承Animal就能夠了,這樣無疑使得編碼的效率高了許多。
向下轉型:
簡單啊,與前面相反嘛,把父類對象轉爲子類對象
先來看個例子:
//animal和cat dog Animal a = new Cat(); Cat c = ((Cat) a); c.eat(); //輸出 我吃魚 Dog d = ((Dog) a); d.eat(); // 報錯 Animal a1 = new Animal(); Cat c1 = ((Cat) a1); c1.eat(); // 報錯
爲何會報錯??? a自己就是Cat對象,因此它固然能夠向下轉型爲Cat,不能轉爲Dog;
而a1爲Animal對象,你不知道是貓仍是狗,固然沒法完成轉型
注意事項: 向下轉型的前提是父類對象指向的是子類對象,即:Animal a = new Cat()
或 Animal a = new Dog()
只能轉型爲本類對象(即貓爲貓,狗爲狗,貓!=狗)
問題1:項目PP10.4,
解決:一開始拿到手,(⊙o⊙)… 看下原代碼,
聲明的是min,咦喲!這麼簡單的咯,匡匡的就把min全改成max,這麼快,這東西有點簡單咯!然而:
emmm,很顯然,並無做對。降序啊,min變爲max,頗有道理的啊!然而,通過一番
不過是將變量名換了,對程序的操做並無絲毫影響。
認真看了以後,發現了問題所在,
果真編程仍是要從代碼入手,而不是慣性思惟地改個變量名就好了
錯題1:
理解:Object類很特殊,Java不支持多重繼承,全部的子類都直接或間接從Object類繼承,且它們可有任意多個子類。
錯題2:
理解:保留字super提供了訪問父類的方法和實例數據的機制(不管其是否隱藏),也可用來訪問父類的構造函數。
錯題3:
理解:當類用final修飾,則其不能擴展。
錯題4:
理解:子類能夠從新定義父類的實例數據及方法,即便被隱藏,也可經過super來對其訪問。
問題1解決方案:查找網上相似的問題,獲得一點啓發
能夠將相似的問題呈現出來代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 202/202 | 1/2 | 15/15 | 積極主動敲代碼 |
第二週 | 490/692 | 1/3 | 18/33 | 善於思考 |
第三週 | 581/1273 | 1/4 | 15/48 | 善於完善 |
第四周 | 1857/3130 | 1/6 | 33/81 | 累 |
第五週 | 655/3787 | 1/7 | 22/103 | |
第六週 | 531/4318 | 1/8 | 18/121 | |
第七週 | 810/5128 | 1/9 | 23/ 144 | |
第八週 | 698/5826 | 1/13 | 21/ 165 |