201621123063《java程序設計》第4周學習總結


1. 本周學習總結

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


繼承 多態 復用代碼 父類 子類 is-a關系 extends關鍵字 super關鍵字 override(覆蓋) is-a關系

1.2 嘗試使用思維導圖將這些關鍵詞組織起來。注:思維導圖一般不需要出現過多的字。

1.3 可選:使用常規方法總結其他上課內容。


多態性:同一消息的發出可以根據對象的不同而產生不同的行為方式
多態的好處:
①對已存在的代碼具有可替代性
②對代碼具有擴充性
③簡化代碼編寫和修改過程
④靈活性提高了使用效率

2. 書面作業

1. 面向對象設計(大作業1-該作業將作為以后其他作業的基礎,請務必完成)

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


首先打開 淘寶,輸入賬號密碼登錄淘寶。在首頁的搜索框中輸入所需要的物品名稱。比如說java輔導書。點擊搜索后,頁面將跳轉到如下圖畫面,再根據需要選擇其中的物品,發現好的物品但不確定是否要買,可以先將物品放入購物車中,在購物車中可以選擇物品的數量。等確認要買后即可下單,點擊結算后,將會跳出填寫個人信息的頁面,上面將填寫收件人的收貨地址,收貨人姓名以及收件人的聯系方式

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

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


商品類


public class Goods {
	private String name;
	private double price;
	private String deliveryAddress;
	int numbers;
	public Goods(String name,double price,String deliveryAddress,int numbers)
	{
		setName(name);
		setPrice(price);
		setDeliveryAddress(deliveryAddress);
		setNumbers(numbers);
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name 

 

 = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public String getDeliveryAddress() {
		return deliveryAddress;
	}
	public void setDeliveryAddress(String deliveryAddress) {
		this.deliveryAddress = deliveryAddress;
	}
	public int getNumbers() {
		return numbers;
	}
	public void setNumbers(int numbers) {
		this.numbers = numbers;
	}
	@Override
	public String toString() {
		return "Goods [name=" + name + ", price=" + price + ", Producer=" + Producer + ", numbers=" + numbers + "]";
	}
	
}

購物車類

public class ShoppingCart {
	private Goods[] good;
	public void AddProduct(){//添加商品  
        ......
    }  
	
	public void DeleteProduct() {//刪除商品
		......
	}
	
	public void AdjustQuantity() {//調整數量
		......
	}
	
	public void ClearCart(){//清空購物車  
		......
    }  
	
	public double TotalMoney(){//商品總價格
		......
    }

	public Goods[] getGood() {
		return good;
	}

	public void setGood(Goods[] good) {
		this.good = good;
	}  
	
	
}

收貨人信息類

public class Customer {
	private String name;
	private int PhoneNumber;
	private String Address;
	public Customer(String name,int PhoneNumber,String Address) {
		this.name 

=name;
		this.PhoneNumber=PhoneNumber;
		this.Address=Address;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name 

 = name;
	}
	public int getPhoneNumber() {
		return PhoneNumber;
	}
	public void setPhoneNumber(int phoneNumber) {
		PhoneNumber = phoneNumber;
	}
	public String getAddress() {
		return Address;
	}
	public void setAddress(String address) {
		Address = address;
	}
	@Override
	public String toString() {
		return "Customer [name=" + name + ", PhoneNumber=" + PhoneNumber + ", Address=" + Address + "]";
	}
	
}

2. ManagerTest.zip代碼分析(繼承、多態)

分析ManagerTest.zip中的代碼,回答幾個問題:

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


繼承關系:子類Manager繼承父類Employee中的方法和屬性

共有方法:
①Employee(String n, double s, int year, int month, int day)
②getName()
③ getSalary()
④getHireDay()
⑤raiseSalary(double byPercent)

子類特有方法:
① Manager(String n, double s, int year, int month, int day)
②getSalary()
③ setBonus(double b)

子類特有屬性: bonus;

2.2 文件第26行e.getSalary(),到底是調用Manager類的還是Employee類的getSalary方法?

調用Employee類的getSalary方法
原因:實例化對象e是屬於Employee類的,在上圖代碼中staff[0]雖然調用的是Manager類型但是Manager類中的getSalary()方法是調用其父類(Employee類)。
且staff[1]和staff[2]調用的都是Employee類型

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


代碼復用減少代碼量,降低日后修改維護的成本,只要修改父類代碼即可以讓子類的代碼都發生改變。

3. Object類中的toString與equals

3.1 編寫Fruit類,屬性String name。如果覆蓋其toString()方法,其父類中的toString方法的代碼就沒有了嗎?編寫Fruit的toString()方法,在該方法中要將調用父類的toString方法得到的字符串與自己特有的屬性name拼接起來,怎么編寫?(使用代碼展示)


覆蓋后父類中的toString()方法代碼還在。
拼接代碼如下:

public String toString() {
		return super.toString()+"Fruit [name=" + name + "]";
	}

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

eclipse自動生成equals方法並改寫忽略大小寫如下:

	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Fruit other = (Fruit) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equalsIgnoreCase(other.name))
			return false;
		return true;
	}

測試代碼:

public class TestFruit {
	public void main(String[] args)
	{
		Fruit f1 = new Fruit();
		Fruit f2 = new Fruit();
		f1.setName("apple");
		f2.setName("APPLE");
		System.out.println(f1.equals(f2));
	}
}

測試結果如圖:

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

測試代碼:

public class TestFruit {
	public static void main(String[] args)
	{
		Fruit[] fruit = new Fruit[5];
		fruit[0] = new Fruit("apple");
		fruit[1] = new Fruit("banana");
		fruit[2] = new Fruit("orange");
		fruit[3] = new Fruit("Apple");
		fruit[4] = new Fruit("watermelon");
		ArrayList<Fruit> fruitList = new ArrayList<>();
		for(int i=0;i<fruit.length;i++)
		{
			if(fruitList.contains(fruit[i])!=true)
				fruitList.add(fruit[i]);

		}
		System.out.println(fruitList);
	}
}

測試結果:

ArrayList的contains()方法會調用對應元素類型的equals()方法進行判斷該元素是否已經在ArrayList中。
提示:直接使用ArrayList的contains方法實現判斷對象是否存在。

4. 實驗總結:

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


7-4 形狀-繼承
Circle類和Rectangle類作為子類繼承Shape類,在各自類中重寫求周長和面積的方法,注意PI和7-3不同,使用Shape類中定義的PI

好處:使用多態屏蔽了不同子類的差異,把子類都看作父類,寫出可復用的通用的代碼,當需求發生變化時可以輕松做出改變

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


7-5 覆蓋
toString()方法按照題目要求編寫,equals()方法可用eclipse自動生成
編寫eqauls方法時需要注意:

1、自反性:對於任何非空引用x,x.equals(x)應該返回true。
2、對稱性:對於任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也應該返回true。
3、傳遞性:對於任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應該返回true。
4、一致性:如果x和y引用的對象沒有發生變化,那么反復調用x.equals(y)應該返回同樣的結果。
5、非空性:對於任意非空引用x,x.equals(null)應該返回false。

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

程序填空題用this(參數)調用已有的有參構造函數
函數題:
6-1
重寫子類Employee類中的toString()方法,調用父類和company類的toString()方法。
6-2
object類是所有java類的終極父類,此題建立object[]數組即可解決
6-3
可以利用eclipse自動生成再進行修改,要注意company為null時不能用equals()方法比較

3. 碼雲及PTA

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

3.1. 碼雲代碼提交記錄

3.2 截圖PTA題集完成情況圖

本周完成(形狀-繼承,覆蓋)
需要有兩張圖(1. 排名。2.PTA提交列表)

3.3 統計本周完成的代碼量

周次 行數 新增行數 文件數 新增文件數
1 226 226 45 45
2 377 377 7 7
3 712 281 42 9
4 166 166 2 2


免責聲明!

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



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