8.3Java入门--->第十一节
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 邮箱:zhang@abc.com ---------------------添加完成--------------------- “修改客户”的界面及操作过程如下所示: …… 请选择(1-5):2 ---------------------修改客户--------------------- 请选择待修改客户编号(-1退出):1 姓名(张三):<直接回车表示不修改> 性别(男): 年龄(30): 电话(010-56253825): 邮箱(zhang@abc.com):zsan@abc.com ---------------------修改完成--------------------- “删除客户”的界面及操作过程如下所示: …… 请选择(1-5):3 ---------------------删除客户--------------------- 请选择待删除客户编号(-1退出):1 确认是否删除(Y/N):y ---------------------删除完成--------------------- “客户列表”的界面及操作过程如下所示: …… 请选择(1-5):4 ---------------------------客户列表--------------------------- 编号 姓名 性别 年龄 电话 邮箱 1 张三 男 30 010-56253825 abc@email.com 2 李四 女 23 010-56253825 lisi@ibm.com 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()); } }