201621123008 《Java程序設計》第四周學習總結


1. 本周學習總結

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

關鍵字:繼承,多態。

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

2. 書面作業

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

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

打開購物APP先進行登錄,登錄界面提示我們輸入帳號和密碼,沒有帳號的用戶創建帳號,創建成功時,系統提示創建成功,然后用戶輸入新創建的帳號進行登錄,此時需要進行帳號和密碼的匹配,若匹配成功,即,登錄成功,就有屬於我們自己的購物車了,就可以隨意添加商品到我們的購車了。
然后根據需要進行搜索,我想買一本有關Java的書 通過搜索Java關鍵詞,出現了很多商品供我選擇,點進去其中一個可以看到該商品的一些基本屬性,價格啊之類的。假設我就想買這本書,我把它添加到購物車,進入購物車,我們可以看到商品條目信息,我們可以修改該商品的數量,當然價格也要相應的變化,或者清空購物車等操作。
提供搜索引擎目前有點無奈。。索性我們就建立一個倉庫類,只有倉庫有的商品可供用戶選擇。

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

類圖


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

隊員:肖文婷,周文華

代碼鏈接: 購物車1.0

全部的類:








運行結果:


下次目標:根據商品分類,建立索引吧。

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

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

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

分析:EmployeeManager的父類,子類會繼承父類被標記為public的成員變量及方法。

  • 類:Employee,Manager,ManagerTest
  • 繼承關系:managerextendsEmployee
  • 共有方法:
public String getName()
   {
      return name;
   }
 public Date getHireDay()
   {
      return hireDay;
   }
 public void raiseSalary(double byPercent)
   {
      double raise = salary * byPercent / 100;
      salary += raise;
   }
  • 子類特有的方法:
 public void setBonus(double b)
   {
      bonus = b;
   }
 public double getSalary()
   {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }
  • 注意:構造函數不能被繼承,只是編譯器在子類的構造函數中的第一行默認加了super()方法,從而調用了父類的構造函數。

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

源程序部分代碼:

staff[0] = boss;
      staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
      staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);

分析:staff[0]Manager引用類型,調用Manager類的方法。
staff[1]staff[2]Employee引用類型,調用Employee類的方法。

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

分析:使用super調用父類的構造函數,提高了代碼的復用性,使代碼更為簡潔。之所以使用繼承,一方面是擬定了共同的協議,另一方面也為了提高代碼的復用性。

3. Object類中的toString與equals

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

分析:如果該類覆蓋了父類的toString方法,其父類中的toString方法方法還是存在的,只是以該類為模板的對象輸出時以該類中toString方法中的格式輸出。

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

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

代碼:

package Test;

public class Fruit {
	String name;

	public Fruit(String name) {
		super();
		this.name = name;
	}

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

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	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 static void main(String[] args) {
		Fruit a=new Fruit("apple");
		Fruit b=new Fruit("Apple");
		
		System.out.println("a name="+a.name);
		System.out.println("b name="+b.name);
		System.out.println("a.name==b.name  "+a.equals(b));
		
		
	}

}

運行結果:

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

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


import java.util.ArrayList;
import java.util.Scanner;

public class Fruit {
	String name;

	public Fruit(String name) {
		super();
		this.name = name;
	}

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

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	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 static void main(String[] args) {
		ArrayList<Fruit> fruitList = new ArrayList<Fruit>();
		Scanner sc = new Scanner(System.in);

		System.out.println("Begin add");
		while (true) {
			String name = sc.next();
			if (!name.equals("exit")) {
				if (fruitList.size() == 0) {
					fruitList.add(new Fruit(name));
				} else {
					boolean b = fruitList.contains(new Fruit(name));
					if(!b)
						fruitList.add(new Fruit(name));
				}
			} else
				break;
		}
		for (Fruit fruit : fruitList) {
			System.out.println(fruit);
		}

	}

}

運行結果:

contains源代碼截取:

public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

    /**
     * Returns the index of the first occurrence of the specified element
     * in this list, or -1 if this list does not contain the element.
     * More formally, returns the lowest index <tt>i</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
     * or -1 if there is no such index.
     */
    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

分析:contains在底層也調用了equals方法。

4. 實驗總結:

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

多態體現為兩種方式:重寫和重載

重寫是父子類之間多態的體現,它的好處就是可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

重載是本類之間多態的體現,它的好處是可以滿足用戶在針對同一對象可以調用同一方法的不同功能體現,以最大限度適應用戶的不同需求

4.2 PTA編程題(覆蓋)。並回答:編寫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)。

  • 5-1程序填空

  • 6-1面向對象基礎-覆蓋與toString

總結:使用super.toString()調用父類的toString方法。

  • 6-2面向對象基礎-Object

總結:多態的基本使用。

  • 6-3面向對象基礎-覆蓋與equals

總結:自己寫的方法肯定是不如自動生成的全面,不過要先自己嘗試寫,之后在對照自動生成的代碼。

3. 碼雲及PTA

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

3.1. 碼雲代碼提交記錄

3.2 截圖PTA題集完成情況圖



3.3 統計本周完成的代碼量


周次 總代碼量 新增文件代碼量 總文件數 新增文件數
1 665 20 20 20
2 1705 23 23 23
3 1834 30 30 30
4 1073 1073 17 17


免責聲明!

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



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