1. 本周學習總結
2. 書面作業
Q1.注釋的應用
使用類的注釋與方法的注釋為前面編寫的類與方法進行注釋,并在Eclipse中查看。(截圖)
?
Q2.面向對象設計(大作業1,非常重要)
2.1 將在網上商城購物或者在班級博客進行學習這一過程,描述成一個故事。(不得少于50字,參考QQ群中PPT的范例)
2.2 通過這個故事我們能發現誰在用這個系統,系統中包含的類及其屬性方法,類與類之間的關系。嘗試找到這些類與屬性,并使用思維導圖描述類、屬性、方法及類與類之間的關系。
2.3 嘗試使用Java代碼實現故事中描述的這一過程(不必很完善),將來要在這個基礎上逐漸完善、擴展成一個完整的面向對象的系統。(可選:加分)
?(2.1)網上商城購物:買家首先輸入所要的商品,在Shopping類在中,找到商品這個屬性中(用Commodity類定義的商品屬性,包含商品的名稱,價格,商品的大小及商品的所在地址),賣家觀看此商品的介紹,若為所需物品,則加入購物車,用到Shopping類中的shopcar屬性(Shopcar類定義,包含所加入的商品的單價,購買的個數及存放商品的地址),在購物車中查看訂單情況,若發現不需要,可以刪去訂單,計算總共的話費時,在Shopping類的total方法中計算,各類商品的單價*個數總和,返回該值顯示給買家看,買家付相等金額后完成購物過程
?(2.2)
Q3.ManagerTest.zip代碼分析
分析ManagerTest.zip中的代碼,回答幾個問題:
3.1 在本例中哪里體現了使用繼承實現代碼復用?回答時要具體到哪個方法、哪個屬性。
3.2 Employee類及其子類Manager都有getSalary方法,那怎么區分這兩個方法呢?
3.3 文件第26行e.getSalary(),到底是調用Manager類的getSalary方法還是Employee類的getSalary方法。
3.4 Manager類的構造函數使用super調用父類的構造函數實現了代碼復用,你覺得這樣的有什么好處?為什么不把父類構造函數中的相關代碼復制粘貼到Manager的構造函數中,這樣看起來不是更直觀嗎?
?(3.1)class Manager extends Employee()類,Manager繼承Employee;Manager屬性比Employee多了bonus,private double bonus;定義構造函數時public Manager(String n, double s, int year, int month, int day),由于Manager的全部屬性除bonus以外其他都一樣,故可以繼承父類的構造函數來賦值,用super(),但要放在構造函數第一行才行;在調用函數時,Manager類中方法,public double getSalary(),覆蓋Employee的方法getSalary(),Manager類中getSalary()中還有加入bonus
?(3.2)主要區別是有無bonus,有bonus則是Manager類中的方法getSalary(),無則是Employee類的方法getSalary()
?(3.3)調用Employee類的getSalary方法,定義boss時,boss.setBonus(5000)已經將bonus帶入getSalary()中計算,再將boss賦給staff[0],得到的獎金已是用Manager類的getSalary方法計算過的,調用時的是Employee類的getSalary方法
?(3.4)可以省略與父類中相同的屬性的構造函數的編寫,節約成本,簡潔代碼;復制過去雖然直觀但是會使執行時間過長,運行過慢
Q4.Object類
4.1 編寫一個Fruit類及屬性String name,如沒有extends自任何類。使用System.out.println(new Fruit());是調用Fruit的什么方法呢?該方法的代碼是從哪來的?嘗試分析這些代碼實現了什么功能?
4.2 如果為Fruit類添加了toString()方法,那么使用System.out.println(new Fruit());調用了新增的toString方法。那么其父類中的toString方法的代碼就沒有了嗎?如果同時想要復用其父類的toString方法,要怎么操作?(使用代碼演示)
4.3 Fruit類還繼承了Object類的eqauls方法。嘗試分析其功能?自己編寫一個equals方法覆蓋父類的相應方法,功能為當兩個Fruit對象name相同時(忽略大小寫),那么返回true。(使用代碼證明你自己覆蓋的eqauls方法是正確的)
4.4 在4.3的基礎上使用ArrayList fruitList存儲多個fruit,要求如果fruitList中已有的fruit就不再添加,沒有的就添加進去。請編寫相關測試代碼。并分析ArrayList的contatins方法是如何實現其功能的?
?(4.1)System.out.println(new Fruit());語句調用了Fruit的構造函數;在未寫構造函數時,系統會默認調用構造函數;輸出類名加地址形式
?(4.2)新增的toString方法只是將String類中toString覆蓋掉,并非沒有,可以查找String類中toString方法的源代碼,在類中輸出
?(4.3)eqauls方法是比較兩個對象的內容是否相同(有分大小寫),若相同,則返回true,否則返回false
public boolean equals(String name1,String name2)
{if(name1.equalsIgnoreCase(name2)) return true;//使用String類中的.equalsIgnoreCase()函數,忽略大小寫else return false;
}
?(4.4)代碼:
public class Main
{public static void main(String[] args) {ArrayList<Fruit> fruitList=new ArrayList<Fruit>();//建立ArrayList<Fruit> fruitListfruitList.add(new Fruit());//加入new Fruit()Fruit a=new Fruit();if(!fruitList.contains(a)) fruitList.add(a);//若fruitList沒有a,則加入a,否則不操作}
}
ArrayList的contatins使用indexOf(),返回字符串在父串中首次出現的位置,若位置是大于等于0,返回true,否則返回false,ArrayList的contatins源代碼
Q5.代碼閱讀:PersonTest.java(abstract、多態)
5.1 畫出類的繼承關系
5.2 讀懂main函數,將自己推測的出代碼運行結果與真正運行結果進行比較。嘗試分析原因
5.3 子類中里面使用了super構造函數,作用是什么?如果將子類中的super構造函數去掉,行不行?
5.4 PersonTest.java中的代碼哪里體現了多態?你覺得多態有什么好處?多態和繼承有什么關系嗎?
?(5.1)類的繼承關系
?(5.2)建立Person()數組person[],長度為4,peoples[0]=new Employee,peoples[1] = new Student,peoples[2] = new Programmer,peoples[3] = new Manager,接著根據年齡大小,由小到大排序輸出,與運行結果比較相同
?(5.3)使用super方法,可以調用在子類中方法與參數相同的父類的屬性和方法;不行,若是去掉,則無法繼承父類中的屬性或方法,用不了,導致那些繼承的屬性用的是默認值
?(5.4)體現多態的代碼:
peoples[0] = new Employee("zhang", "136", "1360", "1360@mail.com", 21, "female", 1000.0);
peoples[1] = new Student("wang", "110", "15959", "15959@163.com", 18, "male", "1");
peoples[2] = new Programmer("Gates", "usa", "911", "911@com", 59, "male", 100000.0, 50000.0);
peoples[3] = new Manager("Clark", "GE", "111", "111@mail.com", 10, "mail", 90000.1, 12000.3);
創建父類的對象可以構造多個不同的對象(不同的類),節約成本(例如求圓和長方形的面積和周長的和,可以創建一個父類class Shape(){},存放形狀屬性,繼承方法求面積和 和 周長和,這樣可以在圓和長方形中直接用super()引用這個方法,節約成本);只有子類繼承父類才能在建立對象時,有多個不同的對象(多態)
3. 碼云代碼提交記錄
4. PTA實驗實驗總結
?(1)繼承父類,在子類中使用父類的屬性和方法,用extends,后接父類,在子類中,若子類要使用與父類同名卻不同效果的方法時,可以自己編寫方法,在調用時,會調用子類的方法,覆蓋掉父類的童,同名方法
?(2)抽象類的定義,用到abstract關鍵字,且抽象類是必須被繼承的,在求周長和 和 面積和就可以在抽象類中定義,求周長和 和 面積和的方法代碼一樣,可以在抽象類Shape中編寫
?(3)調用父類的構造函數時(例如Manager和Employee,Manager比Employee多一個bonus,可以用super()來調用Employee的構造函數,前面的屬性一樣,只需再添加bonus的定義即可),要在子類的構造函數的第一行