王彪20162321 2016-2017-2 《程序設計與數據結構》第7周學習總結


學號20162321 2016-2017-2 《程序設計與數據結構》第七周學習總結

教材學習內容總結

  • 關鍵概念

    1. 多態引用在不同的時候可以指向不同類型的對象
    2. 多態引用在運行時才將方法調用與它的定義綁定在一起
    3. 引用變量可以指向聲明繼承於它的任意類的任何對象
    4. 對象的類型,而不是引用的類型,決定調用的是方法的哪個版本
    5. 接口是一組抽象方法,所以不能被實例化
    6. 繼承可適用於接口,所以一個接口可派生於另一個接口
    7. 接口引用可以指向實現這個接口的任意類的任何對象
    8. 方法的參數可以是多態的,這樣使方法具備了對其參數進行控制的靈活性
    9. 在偵聽器和所偵聽組件之間建立關系是通過多態完成的
  • 重點總結

    1. 當一個類給出了接口中定義的每個抽象方法的實現是,就稱類實現了接口
    2. 如果接口中的某個方法沒在類中實現,則編譯錯誤
    3. 接口只保證類實現了某些方法,但它不限制類可以有其他的行為
    4. 多個類可以實現同一個接口,並在類中提供它們各自對方法的定義
    5. 接口中還可以包含常量,這些常量用final修飾符來定義
    6. 子接口繼承父接口中的所有抽象方法和常量。實現子接口的任何一個類必須實現所有的方法
    7. 接口中所有成員都是公有的

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

  • 問題1:如何理解書中

對象的類型,而不是引用的類型,決定調用的是方法的那個版本

  • 解決思路:當一個父類對象的引用變量,它引用子類對象時,決定調用誰的成員方法的條件是:被引用對象的類型而不是引用變量的類型。但是這個被調用的方法必須是在父類中定義過,也就是子類覆蓋過的方法。

  • 問題2:關於動態綁定
    1.關於綁定

綁定指的是一個方法的調用與方法所在的類(方法主體)關聯起來。對java來說,綁定分為靜態綁定和動態綁定;或者叫做前期綁定和后期綁定.

2.靜態(前期)和動態(后期)綁定

靜態:在程序執行前方法已經被綁定,java當中的方法只有final,static,private和構造方法是前期綁定。(個人認為將方法聲明為final既是為了方法被覆蓋也是為了關閉動態綁定,static,private由於不能被繼承所以在編譯時就可以確定值)
動態:在運行時根據具體對象的類型進行綁定。

3.動態綁定的細節(來自網絡)
  1. 編譯器檢查對象的聲明類型和方法名。假設我們調用x.f(args)方法,並且x已經被聲明為C類的對象,那么編譯器會列舉出C類中所有的名稱為f的方法和從C類的超類繼承過來的f方法
  2. 接下來編譯器檢查方法調用中提供的參數類型。如果在所有名稱為f 的方法中有一個參數類型和調用提供的參數類型最為匹配,那么就調用這個方法,這個過程叫做“重載解析”
  3. 當程序運行並且使用動態綁定調用方法時,虛擬機必須調用同x所指向的對象的實際類型相匹配的方法版本。假設實際類型為D(C的子類),如果D類定義了f(String)那么該方法被調用,否則就在D的超類中搜尋方法f(String),依次類推
4.我的例子
    public class Testme {
    public static void main(String[] args){
        Father people = new Son();
        people.high();
    }}
    class Father{
    public void high(){
        System.out.println("170");}}
    class Son extends Father{
        public void high(){
            System.out.println("120");}}

聲明了Father類型變量people但它指向是一個Son的對象,其調用Son的方法,因為在運行時發生了動態綁定,在綁定過程中需要確定調用哪個版本的high方法實現。

  • 問題3:關於接口的繼承問題
  • 描述:書中介紹繼承的概念出適用於類外,還適用於接口,那么接口繼承是否和類繼承一般不支持多繼承。

(來自網絡)java接口可以多繼承。Interface Extends Interface0, Interface1, interface3
不允許類多重繼承的主要原因是,如果A同時繼承B和C,而B和C同時有一個D方法,A如何決定該繼承那一個呢?
但接口不存在這樣的問題,接口全都是抽象方法繼承誰都無所謂,所以接口可以繼承多個接口。

代碼調試中的問題和解決過程

  • 問題1:static關鍵字
  • 描述:在做實驗時有如下代碼
    public class Mydoc {
    Document d;
    public static void main(String[] args) {
        d = new Document(new IntFactory());
        d.DisplayData();
        d = new Document(new FloatFactory());
        d.DisplayData();
    }
}

此時程序提示Non-static filed 'd' cannot be referenced from a static context

  • 解決過程:因為靜態方法不會對具體的對象進行操作,所以它們不能引用只在類的實例中才存在的實例變量。所有的靜態方法,包括main方法,都只能訪問靜態變量或局部變量。
    所以static Document d

代碼托管

  • 代碼截圖

上周考試錯題總結

  • 1.如果有以下的程序代碼:
    Int x=100;
    Int y=100;
    Integer wx=x;
    Integer wy=y;
    System.out.println(x==y);
    System.out.println(wx==wy);
在JDK5以上的環境編譯與執行,則顯示的結果是[true,true]
  • 1.分析:不了解Integer類

Integer 類在對象中包裝了一個基本類型 int 的值。Integer 類型的對象包含一個 int 類型的字段。
此外,該類提供了多個方法,能在 int 類型和 String 類型之間互相轉換,還提供了處理 int 類型時非常有用的其他一些常量和方法。

  • 2.如果有以下的程序代碼:
     int[] arr1 = {1, 2, 3};
     int[] arr2 = new int[arr1.length];
     arr2 = arr1;
     for(int value : arr2) {
     System.out.printf("%d", value);
     }
以下描述何者正確? [執行時顯示:123]
  • 分析;fot-each語句,等價於下列語句
    int value
    while(arr2.hasNext()){
    myBook = bookList.next();
    System.out.println(value);}

結對及互評

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

  • 轉瞬間書本已經過半了,知識還很散,需要一次總結。
  • 這周的實驗介紹了Junit進行單元測試,但對於編寫好的測試代碼還有很大很大的不足。
  • 課外的知識汲取很有必要,沒事可以多看看別人的博客,交流經驗
  • 多看課外書,這周的讀書讓我感受很多,收獲很多

第二次試驗Java面向對象程序設計

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第五周 200/1500 2/6 20/20
第六周 200/1700 1/7 18/38
第七周 500/2100 2/9 20/58
第八周 000/0000 0/0 00/00

嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟件工程軟件的估計為什么這么難軟件工程 估計方法

  • 計划學習時間:XX小時

  • 實際學習時間:XX小時

  • 改進情況:

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表
)

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM