20172319 《Java程序設計教程》第8周學習總結

20172319 2018.04.24-05.03

《Java程序設計教程》第8周學習總結

目錄


教材學習內容總結

第十章 多態性:

  • 後綁定:
    綁定指的是一個方法的調用與方法所在的類(方法主體)關聯起來;
    在java中,綁定分爲靜態綁定(前期綁定)和動態綁定(後期綁定);
    前期綁定: 在程序執行前方法已經被綁定(也就是說在編譯過程當中就已經知道這個方法究竟是哪一個類中的方法),此時由編譯器或其它鏈接程序實現;
    注: java當中的方法只有final,static,private和構造方法是前期綁定;
    後期綁定: 在運行時根據具體對象的類型進行綁定;
    • 優勢:靈活性強
    • 缺點:效率較低(判斷類型過程)
  • 由繼承實現多態性: 引用變量能夠指向有繼承關係的任何類的任何對象;但在調用方法時,方法的版本(方法的實際方法體)取決於對象的類型。css

  • 利用接口實現多態性:
    接口名能夠聲明對象引用變量html

聲明接口:  
   public interface Speaker
   {        
       public void speak();
       public void announce(String str);
   }
聲明對象引用變量(可指向實現該接口任何類的任何對象)
   Speaker current;

   實現類與接口之間有一種「是」的關係;
   在調用方法時,實際調用的取決於 調用發生接口引用所    指向的對象類型;
   在使用接口引用變量時,只能調用定義在接口裏的方法,    若嘗試調用實現接口類裏的其餘方法會產生編譯時錯誤    (編譯器只能肯定類對象是一種Speaker);
   適當的類型轉換能夠實現調用:java

((實現接口的類)接口引用變量).方法名()

   接口名可作方法參數類型,實現同一接口的類對象可做爲    參數傳遞給方法。git

  • 排序:
    將一組元素調整爲有序排列的過程
  • (1)選擇法排序:
    原理:
    一、從第一個元素開始,分別與後面的元素向比較,找到最小的元素與第一個元素交換位置;
    二、從第二個元素開始,分別與後面的元素相比較,找到剩餘元素中最小的元素,與第二個元素交換;
    三、重複上述步驟,直到全部的元素都排成由小到大爲止。
    例子:
待比較數據: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
到此,所有排序完成。
  • (2)插入法排序:
    原理:
    一、將指針指向某個元素,假設該元素左側的元素所有有序,將該元素抽取出來,而後按照從右往左的順序分別與其左邊的元素比較,遇到比其大的元素便將元素右移,直到找到比該元素小的元素或者找到最左面發現其左側的元素都比它大,中止;
    二、此時會出現一個空位,將該元素放入到空位中,此時該元素左側的元素都比它小,右側的元素都比它大;
    三、指針向後移動一位,重複上述過程。每操做一輪,左側有序元素都增長一個,右側無序元素都減小一個。
    例子:
待比較數據: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²階算法,但前者所執行的交換操做次數更少,優於後者。算法

  • 搜素:
    在一組元素中尋找一個指定的目標元素的過程
  • (1)線性搜素:從一個端點開始,以線性的方式掃描整個搜索池,最終找到或搜索至終點發現不存在目標元素。
  • (2)二分搜索:
    在數組有序的狀況下,效率高於線性搜索;
    原理:
    假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,若是二者相等,則查找成功;不然利用中間位置記錄將表分紅前、後兩個子表,若是中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,不然進一步查找後一子表。重複以上過程,直到找到知足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。編程

  • (3)搜素算法的比較:
    二分搜索須要數據作過排序,搜索算法的選擇取決於具體條件。數組

  • 多態性設計:
    容許用一致性的方法實現不一致的行爲,應更合理地定義類與對象,創建起適當的關聯,以提升軟件的靈活性。數據結構

返回目錄函數


教材學習中的問題和解決過程

  • 問題1: 什麼是向上轉型與向下轉型?
  • 解決:
    向上轉型:
    子類引用的對象轉換爲父類類型稱爲向上轉型,通俗地說就是是將子類對象轉爲父類對象,父類對象也能夠是接口。
    eg:
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來對其訪問。

返回目錄


結對及互評

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20172316趙乾宸
    • 博客中值得學習的或存在問題:
      1.問題1解決方案:查找網上相似的問題,獲得一點啓發 能夠將相似的問題呈現出來
      2.教材內容總結簡潔明瞭
      3.第一段參考資料無連接。
    • 20172329王文彬
    • 博客中值得學習的或存在問題:
      1.部分地區應適當地縮進;
      2.問題一、3裏的文字過於亢長,若是有適當的例子加上我的理解會更好;
      3.css樣式很精美。

返回目錄


其餘(感悟、思考等,可選)

  • 拿到問題,不能匡匡地一頓亂敲,要先認真分析,對症下藥,就像先想好UML圖才能去編寫代碼同樣,兩眼抹黑一頓亂敲,浪費了時間不說,敲出來的還不是本身想要的。
    返回目錄

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 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

返回目錄


參考資料

《Java程序設計與數據結構教程(第二版)》
《Java程序設計與數據結構教程(第二版)》學習指導

返回目錄

相關文章
相關標籤/搜索