8.3Java入門--->第十一節
阿新 • • 發佈:2020-08-03
1、方法重寫
出現在繼承當中,子類對父類的方法進行改造
也可以說是覆蓋,重置(子類的方法將覆蓋弗雷德方法)
1.重寫的方法必須和覆蓋的方法就有相同的名字,引數和返回值型別
2.不可以出現比父類更嚴格的訪問許可權
3.重寫方法和被重寫方法必須同為static或同不是
4.子類丟擲異常不可以比父類被重寫方法的異常大
5.子類重寫的返回值 型別 可以比父類返回值型別小,或是相同;
總結:若父類的方法對子類不適用,子類可以對父類的方法進行重寫
繼承大練習(其實也不大,如果用Array List做非常簡單)
專案2:客戶資訊管理軟體 目標 • 模擬實現一個基於文字介面的《客戶資訊管理軟體》 • 進一步掌握程式設計技巧和除錯技巧,熟悉面向物件程式設計 • 主要涉及以下知識點: – 類和物件(屬性、方法及構造器) – 類的封裝 – 引用陣列 – 陣列的插入、刪除和替換 – 物件的聚集處理 – 多物件協同工作 需求說明 模擬實現基於文字介面的《客戶資訊管理軟體》。 該軟體能夠實現對客戶物件的插入、修改和刪除(用陣列實現),並能夠列印客戶明細表。 專案採用分級選單方式。主選單如下:-----------------客戶資訊管理軟體----------------- 1 添 加 客 戶 2 修 改 客 戶 3 刪 除 客 戶 4 客 戶 列 表 5 退 出 請選擇(1-5):_ • 每個客戶的資訊被儲存在Customer物件中。 • 以一個Customer型別的陣列來記錄當前所有的客戶 • 每次“新增客戶”(選單1)後,客戶(Customer)物件被新增到陣列中。 • 每次“修改客戶”(選單2)後,修改後的客戶(Customer)物件替換陣列中原物件。 • 每次“刪除客戶”(選單3)後,客戶(Customer)物件被從陣列中清除。 • 執行“客戶列表 ”(選單4)時,將列出陣列中所有客戶的資訊 “新增客戶”的介面及操作過程如下所示: …… 請選擇(1-5):1 ---------------------新增客戶--------------------- 姓名:張三 性別:男 年齡:30 電話:010-56253825 郵箱:[email protected] ---------------------新增完成--------------------- “修改客戶”的介面及操作過程如下所示: …… 請選擇(1-5):2 ---------------------修改客戶--------------------- 請選擇待修改客戶編號(-1退出):1 姓名(張三):<直接回車表示不修改> 性別(男): 年齡(30): 電話(010-56253825): 郵箱([email protected]):[email protected] ---------------------修改完成--------------------- “刪除客戶”的介面及操作過程如下所示: …… 請選擇(1-5):3 ---------------------刪除客戶--------------------- 請選擇待刪除客戶編號(-1退出):1 確認是否刪除(Y/N):y ---------------------刪除完成--------------------- “客戶列表”的介面及操作過程如下所示: …… 請選擇(1-5):4 ---------------------------客戶列表--------------------------- 編號 姓名 性別 年齡 電話 郵箱 1 張三 男 30 010-56253825 [email protected] 2 李四 女 23 010-56253825 [email protected] 3 王芳 女 26 010-56253825 wang@163.com -------------------------客戶列表完成------------------------- 軟體設計結構 該軟體由以下三個模組組成: CustomerView為主模組,負責選單的顯示和處理使用者操作 CustomerList為Customer物件的管理模組,內部用陣列管理一組Customer物件,並提供相應的新增、修改、刪除和獲取方法,供CustomerView呼叫 Customer為實體物件,用來封裝客戶資訊 Customer類的設計 • Customer為實體類,用來封裝客戶資訊 • 該類封裝客戶的以下資訊: – String name :客戶姓名 – char gender :性別 – int age :年齡 – String phone:電話號碼 – String email :電子郵箱 • 提供各屬性的get/set方法 • 提供所需的構造器 (可自行確定) CustomerList類的設計 • CustomerList為Customer物件的管理模組,內部用陣列管理一組Customer物件 • 本類封裝以下資訊: – Customer[] customers:用來儲存客戶物件的陣列 – int total = 0 :記錄已儲存客戶物件的數量 • 該類至少提供以下方法: – public CustomerList(int totalCustomer) – public boolean addCustomer(Customer customer) – public boolean replaceCustomer(int index, Customer cust) – public boolean deleteCustomer(int index) – public Customer[] getAllCustomers() – public Customer getCustomer(int index) • public CustomerList(int totalCustomer) – 用途:構造器,用來初始化customers陣列 – 引數:totalCustomer:指定customers陣列的最大空間 • public boolean addCustomer(Customer customer) – 用途:將引數customer新增組中最後一個客戶物件記錄之後 – 引數:customer指定要新增的客戶物件 – 返回:新增成功返回true;false表示陣列已滿,無法新增 • public boolean replaceCustomer(int index, Customer cust) – 用途:用引數customer替換陣列中由index指定的物件 – 引數:customer指定替換的新客戶物件 index指定所替換物件在陣列中的位置 – 返回:替換成功返回true;false表示索引無效,無法替換 – public boolean deleteCustomer(int index) – 用途:從陣列中刪除引數index指定索引位置的客戶物件記錄 – 引數: index指定所刪除物件在陣列中的索引位置 – 返回:刪除成功返回true;false表示索引無效,無法刪除 – public Customer[] getAllCustomers() – 用途:返回陣列中記錄的所有客戶物件 – 返回: Customer[] 陣列中包含了當前所有客戶物件,該陣列長度與物件個數相同。 – public Customer getCustomer(int index) – 用途:返回引數index指定索引位置的客戶物件記錄 – 引數: index指定所要獲取的客戶物件在陣列中的索引位置 – 返回:封裝了客戶資訊的Customer物件 CustomerView類的設計 • CustomerView為主模組,負責選單的顯示和處理使用者操作 • 本類封裝以下資訊: – CustomerList customers = new CustomerList(10); 建立最大包含10客戶物件的CustomerList 物件,供以下各成員方法使用。 • 該類至少提供以下方法: – public void enterMainMenu() – private void addNewCustomer() – private void modifyCustomer() – private void deleteCustomer() – private void listAllCustomers() – public static void main(String[] args) • public void enterMainMenu() – 用途:顯示主選單,響應使用者輸入,根據使用者操作分別呼叫其他相應的成員方法(如addNewCustomer),以完成客戶資訊處理。 • private void addNewCustomer() private void modifyCustomer() private void deleteCustomer() private void listAllCustomers() – 用途:這四個方法分別完成“新增客戶”、“修改客戶”、“刪除客戶”和“客戶列表”等各選單功能。 這四個方法僅供enterMainMenu()方法呼叫。 • public static void main(String[] args) – 用途:建立CustomerView例項,並呼叫 enterMainMenu()方法以執行程式。 enterMainMenu()方法的活動圖 鍵盤訪問的實現 • 專案中提供了CMUtility.java類,可用來方便地實現鍵盤訪問。 • 該類提供了以下靜態方法: – public static char readMenuSelection() 用途:該方法讀取鍵盤,如果使用者鍵入’1’-’5’中的任意字元,則方法返回。返回值為使用者鍵入字元。 – public static char readChar() 和 public static char readChar(char defaultValue) 用途:這兩個方法功能相同,均從鍵盤讀取一個字元,並將其作為方法的返回值。 引數: defaultValue — 如果使用者不輸入字元而直接回車,方法將以defaultValue 作為返回值。(提示:此方法可在修改客戶時呼叫) – public static int readInt() 和 public static int readInt(int defaultValue) 用途:這兩個方法功能相同,均從鍵盤讀取一個長度不超過2位的 整數,並將其作為方法的返回值。 引數: defaultValue — 如果使用者不輸入字元而直接回車,方法將以defaultValue 作為返回值。 – public static String readString(int limit) 和 public static String readString(int limit, String defaultValue) 用途:這兩個方法功能相同,均從鍵盤讀取一個長度不超過limit的字串,並將其作為方法的返回值。 引數:limit — 指定字串的最大長度 defaultValue — 如果使用者不輸入字元而直接回車,方法將以defaultValue 作為返回值。 – public static char readConfirmSelection() : 用途:從鍵盤讀取‘Y’或’N’,並將其作為方法的返回值。 第1步 — 實現Customer類 1. 按照設計要求編寫Customer類,並編譯 2. 在Customer 類中臨時新增一個main方法中,作為單元測試方法。 在方法中建立Customer物件,並呼叫物件的各個方法,以測試該類是否編寫正確。 第2步 — 實現CustomerList類 1. 按照設計要求編寫CustomerList類,並編譯 2. 在CustomerList類中臨時新增一個main方法中,作為單元測試方法。 3. 在方法中建立CustomerList物件(最多存放5個客戶物件),然後分別用模擬資料呼叫以下各個方法,以測試各方法是否編寫正確: – addCustomer – replaceCustomer – deleteCustomer – getAllCustomers – getCustomer 4. 進一步測試以下情況,以驗證該類是否編寫正確: – 呼叫addCustomer方法,新增至5個以上客戶物件時 – 當陣列中客戶物件數量為0時,仍然呼叫replaceCustomer方法替換物件 – 當陣列中客戶物件數量為0時,仍然呼叫deleteCustomer方法刪除物件 – 對於replaceCustomer、 deleteCustomer和getCustomer的呼叫,當引數index的值無效時(例如-1或6) – getAllCustomers方法返回的陣列長度是否與實際的客戶物件數量一致 第3步 — 實現CustomerView類 1. 按照設計要求編寫CustomerView類,逐一實現各個方法,並編譯 2. 執行main方法中,測試以下功能: – 主選單顯示及操作是否正確 – “新增客戶”操作是否正確,給使用者的提示是否明確合理;測試當新增的客戶總數超過10時,執行是否正確 – “修改客戶”操作是否正確,給使用者的提示是否明確合理; – “刪除客戶”操作是否正確,給使用者的提示是否明確合理; – “客戶列表”操作是否正確,表格是否規整; 3. 思考以下問題: – 當軟體退出時,所有客戶資訊便丟失了!運用什麼手段可以將這些資訊長久儲存,以便在下一次執行軟體時繼續使用?
package com.xian; public class Customer { private String name;// :客戶姓名 private String gender;// :性別 private int age;// :年齡 private String phone;//:電話號碼 private String email;// :電子郵箱 public Customer() { super(); } public Customer(String name, String gender, int age, String phone, String email) { super(); this.name = name; this.gender = gender; this.age = age; this.phone = phone; this.email = email; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "Customer [name=" + name + ", gender=" + gender + ", age=" + age + ", phone=" + phone + ", email=" + email + "]"; } }
package com.xian; public class CustomerList { private Customer[] customers; private int total = 0; public CustomerList(int totalCustomer) { customers = new Customer[totalCustomer]; } public boolean addCustomer(Customer customer) { for(int i=0;i<customers.length;i++) { if(customers[i]==null) { customers[i] = customer; total++; return true; } } return false; } public boolean replaceCustomer(int index, Customer cust) { if(index>=customers.length) { return false; } customers[index] = cust; return true; } public boolean deleteCustomer(int index) { if(index>=customers.length) { return false; } customers[index] = null; total--; return true; } public Customer[] getAllCustomers() { return customers; } public Customer getCustomer(int index) { if(index>=customers.length) { return null; } return customers[index]; } public Customer[] getCustomers() { return customers; } public void setCustomers(Customer[] customers) { this.customers = customers; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } }
package com.xian; import java.util.Scanner; public class CustomerView { private CustomerList list = new CustomerList(5); private static Scanner scan = new Scanner(System.in); public static void main(String[] args) { CustomerView cv = new CustomerView(); cv.enterMainMenu(); } public void enterMainMenu() { while(true) { while(true) { souts(); int i = scan.nextInt(); switch (i) { case 1: addNewCustomer(); break; case 2: modifyCustomer(); break; case 3: deleteCustomer(); break; case 4: listAllCustomers(); break; case 5: return; default: System.out.println("請選擇(1-5):_"); break; } } } } public void souts(){ System.out.println("-----------------客戶資訊管理軟體-----------------"); System.out.println("1 添 加 客 戶"); System.out.println("2 修 改 客 戶"); System.out.println("3 刪 除 客 戶"); System.out.println("4 客 戶 列 表"); System.out.println("5 退 出"); System.out.println("請選擇(1-5):_"); } private void addNewCustomer() { while(true) { System.out.println("請輸入客戶姓名:"); String name = scan.next(); System.out.println("請輸入客戶年齡:"); int age = scan.nextInt(); System.out.println("請輸入客戶性別:"); String gender = scan.next(); System.out.println("請輸入客戶電話:"); String phone = scan.next(); System.out.println("請輸入客戶郵箱:"); String email = scan.next(); Customer c = new Customer(name,gender,age,phone,email); boolean b = list.addCustomer(c); String noti = b?"您插入成功":"您插入失敗"; System.out.println(noti); break; } } private void modifyCustomer(){ Customer cs=new Customer(); listAllCustomers(); System.out.println("選擇需要修改的使用者"); int id=scan.nextInt(); if(id>list.getTotal()){ System.out.println("輸入錯誤"); } soutChange(id,cs); list.replaceCustomer(id,cs); } private void deleteCustomer(){ while(true){ System.out.println("請輸入要刪除的序號:"); int id=scan.nextInt(); if(id>list.getTotal()){ System.out.println("輸入錯誤"); } list.deleteCustomer(id); return; } } private void listAllCustomers(){ Customer[] custList=new Customer[10]; custList=list.getAllCustomers(); for (int i = 0; i < custList.length; i++) { System.out.println(custList[i]); } return; } public void soutChange(int id,Customer cs){ list.getCustomer(id); System.out.println("修改姓名"); cs.setName(scan.next()); System.out.println("修改性別"); cs.setGender(scan.next()); System.out.println("修改年齡"); cs.setAge(scan.nextInt()); System.out.println("修改電話"); cs.setPhone(scan.next()); System.out.println("修改郵箱"); cs.setEmail(scan.next()); } }