Week04-面向對象設計與繼承

1. 本週學習總結

1.1 寫出你認爲本週學習中比較重要的知識點關鍵詞

重載,繼承與多態,類型斷定與轉換,抽象,覆蓋java

1.2 嘗試使用思惟導圖將這些關鍵詞組織起來。注:思惟導圖通常不須要出現過多的字。

2. 書面做業

1. 面向對象設計(大做業1-該做業將做爲之後其餘做業的基礎,請務必完成)

1.1 講故事:用50字以上講一個你在網上商城購物或者在班級博客進行學習的故事。使用Markdown的加粗標記把關鍵名詞標註出來,使用語句塊標記把裏面關鍵的動詞標註出來。講故事範例:見參考資料UML類圖中如何繪製類圖

網上購物,我想要牛奶,先要搜索庫存,查看是否有我要的商品編程

選擇個人商品,輸入購買數量表示肯定購買數組

我看到機器顯示須要付的價格剩餘庫存結束購物markdown

1.2 找出系統中包含的類及其屬性、方法,類與類之間的關係,並繪製相應類圖。注意:不必定非要體現繼承關係。只要能將系統描述完整便可。一開始設計的時候不要考慮太多,不要出現太多的類,僅出現必要的類,完成最小功能便可。對商城購物系統建議只作購物車模塊。

商品類包含名字,價格,庫存三個屬性eclipse

用戶類暫時沒寫,暫定帳戶,密碼屬性函數

用戶類學習

private String name;測試

private String password;ui

商品類
String name;this

`double price;`

`int num;`

方法
public String toString(){`

`return "商品名爲:" + name + ",價格爲:" + price + ",庫存數量爲:" + num;`

`}`

public void buyGoods(){

`Scanner sc=new Scanner(System.in );`

}

1.3 使用Java代碼實現這個系統(沒必要很完善)。粘貼運行截圖與關鍵代碼。未來要在這個基礎上逐漸完善、擴展成一個完整的面向對象的系統。合做完成:2-3人一個小組。



2. ManagerTest.zip代碼分析(繼承、多態)分析ManagerTest.zip中的代碼,回答幾個問題:

2.1 簡述文件中表現出的繼承關係。哪些是共有方法,哪些是子類特有的屬性和方法?

class Manager extends Employee說明Manger是Employee的子類

public double getSalary()

Employee(String n, double s, int year, int month, int day)

getName()

getHireDay()

getName()

getSalary()
是共有方法

private double bonus
爲子類特有的屬性

getSalary()

Manager(String n, double s, int year, int month, int day)

public void setBonus(double b)爲子類特有方法

2.2 文件第26行e.getSalary(),究竟是調用Manager類的仍是Employee類的getSalary方法?

這裏用到了動態綁定,即在執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法

此題staff[0]屬於manager類,調用manager中方法,staff[1]和staff[2]是employee類,調用employee中的方法。

2.3 Manager類的構造函數使用super調用父類的構造函數實現了代碼複用,這樣有什麼好處?爲何不把父類構造函數中的相關代碼複製粘貼到Manager的構造函數中,這樣看起來不是更直觀嗎

減小了代碼量,只須要修改父類就能修改子類,感受上和c中的宏定義有類似的優勢。

3. Object類中的toString與equals

3.1 編寫Fruit類,屬性String name。若是覆蓋其toString()方法,其父類中的toString方法的代碼就沒有了嗎?編寫Fruit的toString()方法,在該方法中要將調用父類的toString方法獲得的字符串與本身特有的屬性name拼接起來,怎麼編寫?(使用代碼展現)

class Fruit{

private String name;
public Fruit(String name){
    this.name = name;
}
public String toString() {
    return name+"-"+super.toString();
}

}

public class Mainf {

public static void main(String[] args) {
    Fruit fruit = new Fruit("mine");
    System.out.println(fruit.toString());
}

}

3.2 爲Fruit類編寫equals方法覆蓋父類相應方法,功能爲當兩個Fruit對象name相同時(忽略大小寫),返回true。(使用代碼證實你本身覆蓋的equals方法是正確的)

使用自動生成equals方法

else if (!name.equals(other.name))

改成else if (!name.equalsIgnoreCase(other.name))便可忽略大小寫

3.3 完成3.2後,使用ArrayList fruitList存儲多個fruit,添加時要求若是要添加的fruit對象在fruitList中已存在就不添加,不存在就添加。編寫相關測試代碼。並分析ArrayList的contains代碼與equals方法有何關係?

提示:直接使用ArrayList的contains方法實現判斷對象是否存在。

import java.util.ArrayList;

public class Listadd {

public static void main(String[] args) {
    ArrayList<Fruit> fruitList = new ArrayList<Fruit>();
    Fruit[] fruit = new Fruit[5];
    fruit[0] = new Fruit("lili");
    fruit[1] = new Fruit("LiLi");
    fruit[2] = new Fruit("nini");
    fruit[3] = new Fruit("NiNi");
    fruit[4] = new Fruit("xixi");
    
    for(int i=0;i<fruit.length;i++){
        if(fruitList.contains(fruit[i])==false)
            fruitList.add(fruit[i]);
    }
    for(int i=0;i<fruitList.size();i++)
        System.out.println(fruitList.get(i));
    }
}

4. 實驗總結:

4.1 PTA編程題(形狀-繼承)。並回答:在本題中使用多態爲編程帶來了什麼好處。

子類Circle和Rectangle繼承自Shape父類,abstract double getArea();以及abstract double getPerimeter();爲子類提供接口與實現

好處:

應用程序沒必要爲每個派生類編寫功能調用,只須要對抽象基類進行處理便可。大大提升程序的可複用性。

派生類的功能能夠被基類的方法或引用變量所調用,這叫向後兼容,能夠提升可擴充性和可維護性。

4.2 PTA編程題(覆蓋)。並回答:編寫eqauls方法是須要注意些什麼?

自動生成後修改tostring和equals便可

equals()方法的要求:

一、自反性:對於任何非空引用x,x.equals(x)應該返回true。
二、對稱性:對於任何引用x和y,若是x.equals(y)返回true,那麼y.equals(x)也應該返回true。
三、傳遞性:對於任何引用x、y和z,若是x.equals(y)返回true,y.equals(z)返回true,那麼x.equals(z)也應該返回true。
四、一致性:若是x和y引用的對象沒有發生變化,那麼反覆調用x.equals(y)應該返回一樣的結果。
五、非空性:對於任意非空引用x,x.equals(null)應該返回false。

4.3 程序填空、函數題(1-3)。

6-1
pta內部錯誤,不懂額

6-2
創建object[]數組解決

6-3
eclipse自動生成後要注意company爲null時不能用equals()方法比較

3. 碼雲及PTA

題目集:[jmu-Java-03-面向對象1-基礎-封裝繼承]

3.1. 碼雲代碼提交記錄

3.2 截圖PTA題集完成狀況圖


3.3 統計本週完成的代碼量 |周次|行數|新增行數|文件數|新增文件數| |-:|-:|-:|-:|-:| |1|73|73|2|2| |2|281|281|9|9| |3|908|908|16|16| |4|1122|214|21|5|

相關文章
相關標籤/搜索