【Java面向对象编程——名片管理系统】
文章目录
- (一)编程实现
- 1、创建名片实体类
- 2、创建名片管理类
- (1)创建主菜单
- (2)创建登录方法
- (3)创建名片管理方法
- (4)创建添加名片方法
- (5)创建保存名片方法
- (6)创建读取名片文件方法
- (7)创建查询名片方法
- (8)创建修改名片方法
- (9)创建删除名片方法
- (二)知识点讲解
- 1、数组列表
- 2、文件读写
- (三)拓展练习
- 任务:实现图书增删改查功能
- 实现可进可退的多级菜单系统
- 功能:添加名片、查询名片、修改名片、删除名片、保存名片、读取名片
- 要求:数据要持久化保存到磁盘上
(一)编程实现
1、创建名片实体类
- 在
net.huawei.p03.t07
包里创建Card
实体类
- 运行程序,查看结果
public class Card {private String id;private String name;private String workUnit;private String post;private String telephone;/*** 无参构造方法*/public Card() {}/*** 有参构造方法* * @param id* @param name* @param workUnit* @param post* @param telephone*/public Card(String id, String name, String workUnit, String post, String telephone) {this.id = id;this.name = name;this.workUnit = workUnit;this.post = post;this.telephone = telephone;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getWorkUnit() {return workUnit;}public void setWorkUnit(String workUnit) {this.workUnit = workUnit;}public String getPost() {return post;}public void setPost(String post) {this.post = post;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}@Overridepublic String toString() {return "Card{" +"id='" + id + '\'' +", name='" + name + '\'' +", workUnit='" + workUnit + '\'' +", post='" + post + '\'' +", telephone='" + telephone + '\'' +'}';}
}
2、创建名片管理类
- 在
net.huawei.p03.t07
包里创建CardManagement
类
(1)创建主菜单
public class CardManagement {public static void main(String[] args) {// 声明部分int mc1;Scanner sc = new Scanner(System.in);boolean isRunning = true; // 循环控制变量while (isRunning) {// 绘制一级菜单System.out.println(" 名片管理系统");System.out.println("================");System.out.println(" 1. 登录");System.out.println(" 0. 退出");System.out.println("================");System.out.print("输入菜单编号[1,0]:");mc1 = sc.nextInt();// 根据用户选择进行相应的操作switch (mc1) {case 1:// 调用登录方法login();break;case 0:System.out.println("谢谢使用~再见~");isRunning = false; // 结束循环break;default:System.out.println("输入的菜单编号有误!");}}}
}
- 程序报错,因为在菜单项1里要调用的登录方法login()尚未定义
(2)创建登录方法
在CardManagement
类里创建login()
方法
/** * 登录方法 */
private static void login() { String username, password; Scanner sc = new Scanner(System.in); System.out.print("用户名:"); username = sc.next(); System.out.print("密 码:"); password = sc.next(); if (username.equals("howard") && password.equals("903213")) { System.out.println("登录成功~"); // 调用名片管理方法 cardManagement(); } else { System.out.println("用户名或密码有误,登录失败~"); }
}
-程序报错,因为在login()
方法要调用的名片管理方法cardManagement()
尚未定义
(3)创建名片管理方法
- 在
CardManagemen
类里创建cardManagement()
方法
/**
* 名片管理方法
*/
private static void cardManagement() { int mc2; Scanner sc = new Scanner(System.in); boolean isRunning = true; // 循环控制变量 while (isRunning) { // 绘制二级菜单 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(" 6. 保存名片"); System.out.println(" 7. 返回上级"); System.out.println("======================="); System.out.print("输入菜单编号[1,2,3,4,5,6,7]:"); mc2 = sc.nextInt(); switch (mc2) { case 1: System.out.println("执行添加名片功能~"); break; case 2: System.out.println("执行修改名片功能~"); break; case 3: System.out.println("执行查询名片功能~"); break; case 4: System.out.println("执行删除名片功能~"); break; case 5: System.out.println("读取名片文件到名片数组列表~"); break; case 6: System.out.println("将名片数组列表写入名片文件~"); break; case 7: isRunning = false; // 结束二级菜单循环 break; default: System.out.println("输入的菜单编号有误!"); } }
}
- 现在一个可进可退的菜单系统我们就做好了,可以简单测试一下
(4)创建添加名片方法
在
CardManagement
类里创建addCard()
方法
思路:输入名片信息,基于名片信息构建名片对象,将名片对象添加到名片数组列表
在类的声明部分创建名片列表对象(思考为什么要这样做)
![在编写
addCard()
方法代码
/** * 添加名片方法 */
private static void addCard() { // 声明变量 String id; String name; String workUnit; String post; String telephone; Scanner sc = new Scanner(System.in); // 输入名片信息 System.out.print("编号:"); id = sc.next(); System.out.print("姓名:"); name = sc.next(); System.out.print("单位:"); workUnit = sc.next(); System.out.print("职位:"); post = sc.next(); System.out.print("手机:"); telephone = sc.next(); // 创建名片对象 Card card = new Card(id, name, workUnit, post,telephone); // 将名片对象添加名片数组列表 cards.add(card);
}
修改
cardManagement()
方法,需要调用addCard()
方法
运行程序,测试效果
(5)创建保存名片方法
在
CardManagement类
里创建saveCards()
方法
思路:遍历名片数组列表,将每一个名片对象的属性拼接成一个有分隔符的字符串,写入名片文件
/** * 保存名片到文件 */
private static void saveCards() { try { // 创建文件字符输出流 FileWriter fw = new FileWriter("cards.txt"); // 用增强for循环遍历名片数组列表 for (Card card : cards) { // 输出名片对象 System.out.println(card); // 创建名片字符串缓冲对象 StringBuffer buffer = new StringBuffer(); // 添加名片字段信息(空格作为分隔符) buffer.append(card.getId() + " "); buffer.append(card.getName() + " "); buffer.append(card.getWorkUnit() + " "); buffer.append(card.getPost() + " "); buffer.append(card.getTelephone()); // 将名片信息写入名片文件(必须添加换行符) fw.write(buffer.toString() + "\n"); } // 关闭文件字符输出流 fw.close(); // 提示用户写入成功 System.out.println("恭喜,名片数据成功写入文件~"); } catch (IOException e) { e.printStackTrace(); }
}
- 对每一个名片对象都会写入磁盘文件,这个方法不好,需要优化的,将所有名片数据分行放到一个字符串缓冲对象里,这样只需要写一次磁盘文件,效率就提高了。
/** * 保存名片到文件 */
private static void saveCards() { try { // 创建文件字符输出流 FileWriter fw = new FileWriter("cards.txt"); // 创建名片容器字符串缓冲对象 StringBuffer cardsBuffer = new StringBuffer(); // 用增强for循环遍历名片数组列表 for (Card card : cards) { // 输出名片对象 System.out.println(card); // 创建名片字符串缓冲对象 StringBuffer buffer = new StringBuffer(); // 添加名片字段信息(空格作为分隔符) buffer.append(card.getId() + " "); buffer.append(card.getName() + " "); buffer.append(card.getWorkUnit() + " "); buffer.append(card.getPost() + " "); buffer.append(card.getTelephone()); // 将名片信息添加到名片容器字符串缓冲对象 cardsBuffer.append(buffer.toString() + "\n"); } // 将名片容器字符串缓冲对象里的数据写入文件 fw.write(cardsBuffer.toString()); // 关闭文件字符输出流 fw.close(); // 提示用户写入成功 System.out.println("恭喜,名片数据成功写入文件~"); } catch (IOException e) { e.printStackTrace(); }
}
- 修改
cardManagement()
方法,添加调用saveCards()
方法
(6)创建读取名片文件方法
在
CardManagement类
里创建readCardFile()
方法
思路:行读取名片文件,把每行数据按空格拆分名片字段信息,基于名片字段信息创建名片对象,然后将每个名片对象添加到名片数组列表
先把名片文件读取出来
运行程序,查看结果
读取名片文件的完整代码
/** * 读取名片文件,保存到名片数组列表 */
private static void readCardFile() { try { // 创建文件字符输入流 FileReader fr = new FileReader("cards.txt"); // 创建缓冲字符输入流 BufferedReader br = new BufferedReader(fr); // 定义行变量 String nextLine = ""; // 通过循环读取名片文件 while ((nextLine = br.readLine()) != null) { // 拆分行字符串得到字段数组 String[] fields = nextLine.split(" "); // 基于有参构造方法创建名片对象 Card card = new Card(fields[0], fields[1], fields[2], fields[3], fields[4]); // 将名片对象添加到名片数组列表 cards.add(card); // 提示用户添加成功 System.out.println("添加" + card + "到名片数组列表~"); } // 关闭缓冲字符输入流 br.close(); // 关闭文件字符输入流 fr.close(); } catch (FileNotFoundException e) { System.err.println("温馨提示:名片文件不存在~"); } catch (IOException e) { e.printStackTrace(); }
- 修改
cardManagement()
方法,添加调用readCardFile()
方法
(7)创建查询名片方法
在
CardManagement
类里创建findCard()
方法
思路:我们可以再做一个子菜单,包含两个选项:
按编号查询
和按姓名查询
,但是我们不想再做子菜单,让用户输入待查的编号和姓名,这样会有四种情况:输入的编号和姓名全为空字符串,此时查询全部名片;输入的编号不为空字符串但是姓名为空字符串,此时按编号查询名片;输入的编号为空字符串但是姓名不为空字符串,此时按姓名查询;输入的编号和姓名都不为空字符串,此时按编号和姓名查询名片。
/** * 查询名片方法 */
private static void findCard() { String id, name; Scanner sc = new Scanner(System.in); System.out.print("编号:"); id = sc.nextLine(); // 单行输入,敲回车确认 System.out.print("姓名:"); name = sc.nextLine(); // 单行输入,敲回车确认 // 判断用户按哪种方式查询名片 if (id.equals("")) { if (name.equals("")) { // 查询全部名片 // 遍历名片数组列表 for (Card card : cards) { System.out.println(card.getId() + " " + card.getName() + " " + card.getWorkUnit() + " " + card.getPost() + " " + card.getTelephone()); } } else { // 按姓名查询名片 System.out.println("~按姓名查询名片~"); boolean found = false; // 遍历名片数组列表,按姓名来找 for (Card card : cards) { if (card.getName().equals(name)) { found = true; // 找到了 break; } } // 根据found值提示用户 if (found) { // 针对可能存在的同名情况 for (Card card : cards) { if (card.getName().equals(name)) { System.out.println(card.getId() + " " + card.getName() + " " + card.getWorkUnit() + " " + card.getPost() + " " + card.getTelephone()); } } } else { System.out.println("温馨提示:查无此人~"); } } } else { if (name.equals("")) { // 按编号查询名片 System.out.println("~按编号查询名片~"); boolean found = false; // 遍历名片数组列表,按编号来找 for (Card card : cards) { if (card.getId().equals(id)) { found = true; // 找到了 // 输出名片信息 System.out.println(card.getId() + " " + card.getName() + " " + card.getWorkUnit() + " " + card.getPost() + " " + card.getTelephone()); break; // 跳出循环 } } // 根据found值提示用户 if (!found) { System.out.println("温馨提示:查无此人~"); } } else { // 按编号和姓名查询名片 System.out.println("~按编号和姓名查询名片~"); boolean found = false; // 遍历名片数组列表,按编号和姓名来找 for (Card card : cards) { if (card.getId().equals(id) && card.getName().equals(name)) { found = true; // 找到了 // 输出名片信息 System.out.println(card.getId() + " " + card.getName() + " " + card.getWorkUnit() + " " + card.getPost() + " " + card.getTelephone()); break; // 跳出循环 } } // 根据found值提示用户 if (!found) { System.out.println("温馨提示:查无此人~"); } } }
}
修改
cardManagement()
方法,添加调用findCard()
方法
测试名片中有同名的情况,修改cards.txt
运行程序,测试效果
(8)创建修改名片方法
在
CardManagement
类里创建modifyCard()
方法
思路:按编号查询到名片之后,可以对每个字段进行修改,如果该字段没有输入非空值,那么表明该字段不做任何修改
/** * 修改名片方法 */
private static void modifyCard() { String id, name, workUnit, post, telephone; Scanner sc = new Scanner(System.in); boolean found = false; System.out.print("输入待修改者编号:"); id = sc.nextLine(); // 遍历名片列表数组 for (Card card : cards) { if (card.getId().equals(id)) { found = true; // 找到了 // 输出名片信息 System.out.println(card.getId() + " " + card.getName() + " " + card.getWorkUnit() + " " + card.getPost() + " " + card.getTelephone()); break; // 跳出循环 } } // 判断是否找到名片 if (found) { System.out.println("说明:不输入信息,直接敲回车,表明不修改字段值"); System.out.print("姓名:"); name = sc.nextLine(); System.out.print("单位:"); workUnit = sc.nextLine(); System.out.print("职务:"); post = sc.nextLine(); System.out.print("手机:"); telephone = sc.nextLine(); // 采用传统for循环遍历名片数组列表 for (int i = 0; i < cards.size(); i++) { // 获取名片对象 Card card = cards.get(i); if (card.getId().equals(id)) { // 按编号找到名片 // 根据用户输入修改名片对象 if (!name.equals("")) { card.setName(name); } if (!workUnit.equals("")) { card.setWorkUnit(workUnit); } if (!post.equals("")) { card.setPost(post); } if (!telephone.equals("")) { card.setTelephone(telephone); } // 用修改后的名片对象去更新名片数组列表对应的元素 cards.set(i, card); // 显示修改的数组列表对应元素 System.out.println(cards.get(i)); break; // 跳出循环 } } } else { System.out.println("温馨提示:查无此人~"); }
}
- 修改
cardManagement()
方法,添加调用modifyCard()
方法
(9)创建删除名片方法
在
CardManagement
类里创建deleteCard()
方法
修改cardManagement()方法,添加调用deleteCard()方法
(二)知识点讲解
1、数组列表
数组列表
ArrayList
的类层次结构图
数组数组列表
ArrayList
的类图
ArrayList是List接口的实现类
ArrayList的常用方法:add()、remove()、set()、get()
2、文件读写
(三)拓展练习
任务:实现图书增删改查功能
【Java面向对象编程——名片管理系统】相关推荐
- java面向对象编程基础
java面向对象编程基础 前言:什么是java 是咖啡飘香的清晨 - 是斯坦福校园意浓情深 - 是James的思想睿智 是剁手党双十一挥舞的利刃 是大数据云计算驰骋的平台 - 是ATM上吐出的钞票 - ...
- java面向对象编程知识点总结
一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...
- Java面向对象编程篇6——注解与反射
Java面向对象编程篇6--注解与反射 1.注解概述 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制 Java 语言中的类.方法.变量.参数和包等都可 ...
- Java面向对象编程篇5——枚举
Java面向对象编程篇5--枚举 1.枚举的概念 在日常生活中这些事物的取值只有明确的几个固定值,此时描述这些事 物的所有值都可以一一列举出来,而这个列举出来的类型就叫做枚举类型 2.枚举的定义 使用 ...
- Java面向对象编程篇4——内部类
Java面向对象编程篇4--内部类 1.内部类的概念 当一个类的定义出现在另外一个类的类体中时,那么这个类叫做内部类 (Inner),而这个内部类所在的类叫做外部类(Outer). 类中的内容:成员变 ...
- Java面向对象编程篇3——接口与抽象类
Java面向对象编程篇3--接口与抽象类 1.接口(interface) 接口中可以含有变量和方法.但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是pub ...
- Java面向对象编程篇2——面向对象三大特点
Java面向对象编程篇2--面向对象三大特点 1.封装 1.1.封装的概念 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,无 论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生 ...
- Java面向对象编程篇1——类与对象
Java面向对象编程篇1--类与对象 1.面向过程 1.1.概念 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 1.2.优缺点 优点:性 ...
- 【Java】《Java面向对象编程的三大特性》阅读笔记
前言 偶然读到这篇文章(<Java面向对象编程的三大特性>),想来这也算论文?这种还不满网络都是?读罢觉得写得还真不错,这里以我愚见,简单点评一二,不足之处还望指教. 阅读笔记 笔记1 文 ...
最新文章
- Apple苹果公司组织架构
- 排序学习之---快速排序
- 使用云祺虚拟机备份软件恢复Citrix XenServer 虚拟机
- 物联网架构成长之路(3)-EMQ消息服务器了解
- mysql修改密码的三种方式
- MyBatis Mapper Demo
- 利用 AVDictionary 配置参数
- Windows终端利器Cmder
- mui案例:导航栏 颜色渐变
- 重大变动:OpenCV拟更改授权协议!
- openwrt拦截snmp报文
- pcm转换在线工具_律师必备的PDF在线转换工具,推荐5款,全免费!
- 怎样呵护友谊_我不善于经营友情,有好的开始却没有好的友谊,怎样建设友情呢?...
- 程序员必须知道的一些事
- 最棒的10款MySQL GUI工具
- Linux下怎么进入波浪线目录,linux 波浪线 ~ 使用方法
- XXE漏洞详解与利用
- 水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。例如:1^3+5^3+3^3=153
- B_随笔_关于网站记录(2)
- Mac OS 下的解压缩软件——The Unarchiver