做業05-繼承、多態、抽象類與接口

1. 本週學習總結

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

接口 has-a comparable 公開javascript

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

2. 書面做業

1. 面向對象設計大做業(團隊項目,2-3人)

1.1 項目簡介表格:

項目碼雲地址(點擊後要求可直接跳到該項目首頁)。html

https://gitee.com/201621123065/java201621123065.gitjava

團隊成員表格git

學生 負責任務 博客地址
郭啓鵬 菜單類 http://www.cnblogs.com/201621123065guo/p/7696075.html

1.2 系統經常使用功能框架圖

1.3 系統整體類圖

1.4 購物車、商品、系統關鍵代碼截圖(主要截取本身負責的部分)

上次的系統比較,系統的設計等有何修改。其餘感想。編程

import java.util.Scanner;  /** 菜單類,用於顯示全部級菜單供用戶選擇  */  
public class Menu {  
 
    public Menu() {  
    }  
  
    /**  設置菜單類中的數據信息  */  
    public void setData(String as[], double ad[], int ai[], String as1[], int ai1[]) {  
        goodsName   = as;  
        goodsPrice  = ad;  
        custNo      = ai;  
        custBirth   = as1;  
        custScore   = ai1;  
    }  
  
    /**顯示一級菜單,即登陸界面  */  
    public void showLoginMenu() {  
        System.out.println("\n\n\t\t\t    歡迎使用購物管理系統\n\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
        System.out.println("\t\t\t\t 1. 登 錄 系 統\n\n");  
        System.out.println("\t\t\t\t 2. 更 改 管 理 員 信 息\n\n");  
        System.out.println("\t\t\t\t 3. 退 出\n\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
        System.out.print("請選擇,輸入數字:");  
    }  
  
    /** 顯示二級菜單,即系統的主菜單,這個方法裏面包含了對這個菜單處理的全部流程 */  
    public void showMainMenu() {  
          
        // 顯示二級菜單,即系統的主菜單  
        System.out.println("\n\n\t\t\t\t歡迎使用購物管理系統\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
        System.out.println("\t\t\t\t 1. 客 戶 信 息 管 理\n");  
        System.out.println("\t\t\t\t 2. 購 物 結 算\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
          
        // 用戶選擇服務項目  
        System.out.print("請選擇,輸入數字:");  
        Scanner scanner = new Scanner(System.in);  
        boolean flag = false;  
        do {  
            String s = scanner.next();  
              
            // 用戶選擇"客戶信息管理"  
            if (s.equals("1")) {  
                // 顯示客戶信息管理菜單並處理這個菜單的整個流程,當這個流程處理完  
                showCustMMenu();  
                break;  
            }  
              
            // 用戶選擇"購物結算"  
            if (s.equals("2")) {  
                // 定義購物結算類的對象,並處理整個購物結算的流程  
                Pay pay = new Pay();  
                pay.setData(goodsName, goodsPrice, custNo, custBirth, custScore);  
                pay.calcPrice();  
                break;  
            }  
            }  
              
            System.out.print("輸入錯誤,請從新輸入數字:");  
            flag = false;  
        } while (!flag);  
    }  
  
    /** 
     * 顯示三級菜單-客戶信息管理,並處理全部客戶信息管理的流程 
     *  
     */  
    public void showCustMMenu() {  
        System.out.println("購物管理系統 > 客戶信息管理\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
        System.out.println("\t\t\t\t 1. 顯 示 所 有 客 戶 信 息\n");  
        System.out.println("\t\t\t\t 2. 添 加 客 戶 信 息\n");  
        System.out.println("\t\t\t\t 3. 修 改 客 戶 信 息\n");  
        System.out.println("\t\t\t\t 4. 查 詢 客 戶 信 息\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
        System.out.print("請選擇,輸入數字或按'n'返回上一級菜單:");  
        Scanner scanner = new Scanner(System.in);  
          
        boolean flag = true;  
        do {  // 建立客戶信息管理對象,並設置數據,這裏的數據仍是原始的那些數據  
        	 CustManagement custmanagement = new CustManagement(); 
        	 custmanagement.setData(goodsName, goodsPrice, custNo, custBirth, custScore);
            String s = scanner.next();  // 客戶選擇"顯示全部客戶信息"  
            if (s.equals("1")) {  
                custmanagement.show();  
                break;  
            }  // 客戶選擇"添加客戶信息"  
            if (s.equals("2")) {  
                custmanagement.add();  
                break;  
            }  // 客戶選擇"修改客戶信息"  
            if (s.equals("3")) {  
                custmanagement.modify();  
                break;  
            }   // 客戶選擇"查詢客戶信息"  
            if (s.equals("4")) {  
                custmanagement.search();  
                break;  
            }   // 客戶選擇"返回上一級菜單"  
            if (s.equals("n")) {  
                showMainMenu();  
                break;  
            }  
              
            System.out.println("輸入錯誤, 請從新輸入數字:");  
            flag = false;  
        } while (!flag);  
    }  
  
 /*====================定義該類所擁有的變量====================*/  
    public String   goodsName [];   // 商品的名稱  
    public double   goodsPrice[];   // 商品的價格  
    public int  custNo    [];   // 顧客的會員號  
}

從頭開始,只寫了菜單類,其餘功能之後再繼續完善。數組

2. abstract:閱讀GuessGame抽象類的設計與使用源代碼

2.1 Guess改造前代碼很簡單,而改造後的代碼使用了抽象類、抽象方法,看起來更復雜,這樣的改造到底有什麼好處呢?

增長了代碼的複用性,使得代碼效率提升,提高代碼可讀性;同時也提高了程序的可移植性和靈活性。框架

2.2 GuessGame(改造後).java中有抽象方法與非抽象方法,你以爲抽象類中什麼樣的方法應該聲明爲abstract,什麼方法不須要聲明爲abstract直接實現便可。

在抽象類中定義抽象方法須要用abstract聲明,在接口中默認方法都是抽象的(abstract),可不用聲明函數

2.3 重要:在這個例子中,變化的是什麼,不變的是什麼?嘗試結合abstract等概念進行說明。

  • 變化的是是可以使用的環境,改造前只能在控制檯輸出,改造後還能在對話框圖形界面等地方輸出。
  • 不變的是任是抽象類。

3. Comparable與Comparator

3.1 結合PTA 7-1中你的代碼說明,爲何某個類實現了Comparable接口,就能夠直接使用Arrays.sort對該類型的數組進行排序?

讓類實現Comparable接口,並覆蓋compareTo方法就能夠實現對象的自動排序,Comparable接口有compareTo一個方法,覆蓋這個方法就能排序了。學習

3.2 結合PTA 7-2 中你的代碼說明,有了Comparable接口爲何還須要Comparator接口呢?

Comparator 和 Comparable都是java的一個接口, 而且是用來對自定義的class比較大小,Comparable 定義在 Person類的內部,Comparator 是定義在Person的外部。this

3.3 之前的做業Shape, Rectangle,Cirlce中,Shape類中什麼方法應聲明爲abstract?說出緣由。

求面積和周長的方法應聲明爲abstract,由於 Rectangle,Cirlce都要進行求面積和周長。定義爲抽象就能夠求解。

3.4 有不少Shape類型對象如Rectangle、Circle。但願使用Arrays.sort對他們進行排序,請寫出相應代碼。並簡述應在哪一個類上實現Comparable接口比較好?

package PTA4;

public abstract class Arr implements Comparable<Arr>{
   public final static double PI=3.14;
   public abstract double getPerimeter();
   public abstract double getArea();
   
   public int compareTo(Arr other){
	   if(this.getArea() < other.getArea())
		   return -1;
	   if(this.getArea() > other.getArea())
		   return 1;
	   return 0;
	   
   }
}

在Shape類上實現Comparable最好

3.5 以3.4你編寫的代碼爲例,簡述面向Comparable接口編程、面向父類編程的好處。(注意:必定要結合本身編寫的代碼)

面向接口編程的最大的好處是接口和實現分離了, 用起來方便,結構清晰,適合團隊開發

4. 面向接口案例分析

4.1 a.畫出類關係圖。b.StudentDao接口有什麼用?

StudentDao接口讀取、錄入、顯示學生信息。

4.2 StudenDaoListImpl與StudentDaoArrayImpl有何共同之處?有何區別?

都有StudentDao中的三個方法;不一樣於StudenDaoListImpl使用ArrayList來存儲信息,StudentDaoArrayImpl用數組來存儲。

4.3 結合Test.java中的main函數,簡述面向接口編程的好處?

程序結構更清晰,適合團隊開發,提升工做效率。
例如StudentDaoListlmpl和StudentDaoArrayImpl都繼承了StudentDao接口,能實現StudentDao中的功能。

5. 什麼是面向接口編程?面向接口編程的好處是什麼?

面向接口編程就是經過定義接口,承接接口實現不一樣類之間的通訊和各模塊之間的交互。
好處:

  • 程序結構清晰,使用方便
  • 接口通過合理設計後,有利於程序設計的規範化,並能夠並行開發,提升工做效率
  • 實現了程序的可插拔性,對於不一樣的需求切換不一樣的實現,下降了耦合度,隨着系統複雜性的提升這個優點會愈來愈明顯
  • 容許多重實現,彌補了繼承的缺陷

3.碼雲及PTA

3.1. 碼雲代碼提交記錄

3.2 截圖PTA題集完成狀況圖

3.3 統計本週完成的代碼量

行數 新增行數 文件數 新增文件數
1154 260 67 16
相關文章
相關標籤/搜索