今日内容
- 案例演示
- 设计类
- 制作类
- 实现功能(对学生信息的增删查改的功能)
第一章 案例演示
1.1 程序启动
运行com.itheima.main.MainApp类,启动程序:
1.2 测试学员信息管理模块
1.3 测试【4.查询学员】
1.4 测试【1.添加学员】
1.5 测试【2.修改学员】
-
输入不存在的编号:
-
输入存在的编号:
1.6 测试【3.删除学员】
-
输入不存在的编号:
-
输入存在的编号,但取消操作:
-
输入存在的编号,执行删除:
业务逻辑分析:
第二章 类设计
2.1 父类Person(抽象)
Person类:
成员变量: 编号,姓名,性别,生日,年龄
构造方法: 空参构造,满参构造
成员方法: set\get方法
public String show(){
return "我是一名"+getType()+",我的工作是:"+getWork();
}
public abstract String getType();
public abstract String getWork();
2.2 子类Student
学生类: 继承Person类
构造方法: 空参构造,满参构造
成员方法:
public String getType(){
return "学生";
}
public String getWork(){
return "学习Java";
}
2.3 子类Teacher
老师类: 继承Person类
构造方法: 空参构造,满参构造
成员方法:
public String getType(){
return "老师";
}
public String getWork(){
return "教Java";
}
2.4 工具类Utils类
1.定义一个静态方法用了根据出生日期计算年龄
2.定义一个静态方法用来根据指定格式打印一个学生或者老师信息
3.定义一个静态方法用来根据指定格式打印所有学生或者老师信息
2.5 启动类
MainApp类:
1.循环生成一级菜单
2.循环生成二级菜单
3.实现添加功能
4.实现查询功能
5.实现修改功能
6.实现删除功能
第三章 类制作
3.1 父类Person(抽象)
/**
* Created by PengZhiLin on 2021/8/2 9:57
*/
public abstract class Person {
//成员变量: 编号,姓名,性别,生日,年龄
private int id;
private String name;
private String sex;
private String birthday;
private int age;
//构造方法: 空参构造,满参构造
public Person(int id, String name, String sex, String birthday, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.birthday = birthday;
this.age = age;
}
public Person() {
}
//成员方法: set\get方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String show(){
return "我是一名"+getType()+",我的工作是:"+getWork();
}
public abstract String getType();
public abstract String getWork();
}
3.2 子类Student
/**
* Created by PengZhiLin on 2021/8/2 9:59
*/
public class Student extends Person{
//构造方法: 空参构造,满参构造
public Student(int id, String name, String sex, String birthday, int age) {
super(id, name, sex, birthday, age);
}
public Student() {
}
//成员方法:
@Override
public String getType(){
return "学生";
}
@Override
public String getWork(){
return "学习Java";
}
}
3.3 子类Teacher
/**
* Created by PengZhiLin on 2021/8/2 9:59
*/
public class Teacher extends Person{
//构造方法: 空参构造,满参构造
public Teacher(int id, String name, String sex, String birthday, int age) {
super(id, name, sex, birthday, age);
}
public Teacher() {
}
//成员方法:
@Override
public String getType(){
return "老师";
}
@Override
public String getWork(){
return "教Java";
}
}
3.4 工具类Utils类
import com.itheima.bean.Person;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
/**
* Created by PengZhiLin on 2021/8/2 10:02
*/
public class Utils {
// 定义一个静态成员变量,用来记录学生的编号,初始值为0
public static int sid = 0;
// 定义一个静态成员变量,用来记录教师的编号,初始值为0
public static int tid = 0;
//1.定义一个静态方法用了根据出生日期计算年龄
public static int birthdayToAge(String birthday) {
//1.把String类型的出生日期转换为Date类型的出生日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birthdayDate = null;
try {
birthdayDate = sdf.parse(birthday);
} catch (ParseException e) {
e.printStackTrace();
}
//2.获取当前时间的日历对象
Calendar calendar = Calendar.getInstance();
//3.获取当前时间的年,月,日
int nowYear = calendar.get(Calendar.YEAR);
int nowMonth = calendar.get(Calendar.MONTH);
int nowDay = calendar.get(Calendar.DAY_OF_MONTH);
//4.使用当前时间的日历对象调用setTime方法传入出生日期Date对象
calendar.setTime(birthdayDate);
//5.获取出生日期的年,月,日
int birthdayYear = calendar.get(Calendar.YEAR);
int birthdayMonth = calendar.get(Calendar.MONTH);
int birthdayDay = calendar.get(Calendar.DAY_OF_MONTH);
//6.判断出生日期是否在当前日期之后,如果在当前日期之后,就直接返回-1,结束方法
if (calendar.after(Calendar.getInstance())){
return -1;
}
//7.使用当前年份 - 出生日期年份,得到一个初步年龄
int age = nowYear - birthdayYear;
//8.判断月份,如果月份没到,那么真实年龄为初步年龄-1
if (nowMonth < birthdayMonth){
age--;
}
//9.如果出生月份刚好为当前月份,那么就判断日期,如果日期没到,真实年龄为初步年龄-1
if (nowMonth == birthdayMonth){
if (nowDay < birthdayDay){
age--;
}
}
//10.其余情况,都是已经过生日了,那么真实年龄就是初步年龄
return age;
}
//2.定义一个静态方法用来根据指定格式打印一个学生或者老师信息
public static void printPerson(Person p){
System.out.println(p.getId()+"\t\t"+p.getName()+"\t\t"+p.getSex()+"\t\t"+p.getBirthday()+"\t\t"+p.getAge()+"\t\t"+p.show());
}
//3.定义一个静态方法用来根据指定格式打印所有学生或者老师信息
public static void printArrayList(ArrayList list){
System.out.println("***********************************************************************************");
System.out.println("编号\t\t姓名\t\t性别\t\t生日\t\t\t\t年龄\t\t描述");
for (int i = 0; i < list.size(); i++) {
// 获取集合元素
Person p = (Person) list.get(i);
// 调用printPerson方法
printPerson(p);
}
System.out.println("***********************************************************************************");
}
}
import com.itheima.bean.Student;
import com.itheima.utils.Utils;
import java.util.ArrayList;
/**
* Created by PengZhiLin on 2021/8/2 10:24
*/
public class MainApp {
public static void main(String[] args) {
System.out.println(Utils.birthdayToAge("1996-10-10"));// 24
System.out.println(Utils.birthdayToAge("1996-08-10"));// 24
System.out.println(Utils.birthdayToAge("1996-08-01"));// 25
System.out.println(Utils.birthdayToAge("1996-01-01"));// 25
System.out.println(Utils.birthdayToAge("2996-01-01"));// -1
// 创建Student对象
Student stu = new Student(1,"张三","男","1999-10-10",18);
Utils.printPerson(stu);
// 创建ArrayList集合,限制集合中元素的类型
ArrayList<Student> list = new ArrayList<Student>();
// 创建学生对象,并添加学生信息
Student stu1 = new Student(1,"张三1","男","1999-10-10",18);
Student stu2 = new Student(2,"张三2","男","1999-10-10",18);
Student stu3 = new Student(3,"张三3","男","1999-10-10",18);
Student stu4 = new Student(4,"张三4","男","1999-10-10",18);
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
Utils.printArrayList(list);
}
}
第四章 启动类实现
4.1 主菜单
/**
* Created by PengZhiLin on 2021/8/2 10:24
*/
public class MainApp {
public static void main(String[] args) {
// 创建ArrayList集合,用来存储学生对象
ArrayList<Student> stuList = new ArrayList<>();
// 创建ArrayList集合,用来存储教师对象
ArrayList<Teacher> teaList = new ArrayList<>();
// 创建Scanner对象
Scanner sc = new Scanner(System.in);
// 循环生成一级菜单
while (true){
System.out.println("--------------------------------------------------------");
System.out.println("1.学生信息管理 2.教师信息管理 3.系统退出");
System.out.println("请选择功能序号:");
int op = sc.nextInt();
// 根据用户输入的选项进入对应的功能
switch (op){
case 1:
// 进入学生信息管理
studentManage(stuList,sc);
break;
case 2:
// 进入教师信息管理
teacherManage(teaList,sc);
break;
case 3:
// 系统退出
System.out.println("欢迎下次再来!");
System.exit(0);
default:
System.out.println("您输入有误,请重新输入!");
break;
}
}
}
/**
* 教师信息管理
* @param stuList
* @param sc
*/
private static void teacherManage(ArrayList<Teacher> stuList, Scanner sc) {
}
/**
* 学生信息管理
* @param stuList
* @param sc
*/
private static void studentManage(ArrayList<Student> stuList, Scanner sc) {
}
}
4.2 学员信息管理二级菜单
/**
* 学生信息管理
* @param stuList
* @param sc
*/
private static void studentManage(ArrayList<Student> stuList, Scanner sc) {
// 循环生成二级菜单
while (true){
System.out.println("---------------------------------");
System.out.println("1.添加学生 2.查询学生 3.修改学生 4.删除学生 5.返回");
System.out.println("请输入要选择的功能序号:");
int op = sc.nextInt();
// 判断用户输入
switch (op){
case 1:
// 添加学生
addStudent(stuList,sc);
break;
case 2:
// 查询学生
selectStudent(stuList);
break;
case 3:
// 修改学生
updateStudent(stuList,sc);
break;
case 4:
// 删除学生
deleteStudent(stuList,sc);
break;
case 5:
// 返回
return;// 结束当前方法
default:
System.out.println("您输入有误,请重新输入!");
break;
}
}
}
/**
* 删除学生信息
* @param stuList
* @param sc
*/
private static void deleteStudent(ArrayList<Student> stuList, Scanner sc) {
}
/**
* 修改学生信息
* @param stuList
* @param sc
*/
private static void updateStudent(ArrayList<Student> stuList, Scanner sc) {
}
/**
* 查询学生信息
* @param stuList
*/
private static void selectStudent(ArrayList<Student> stuList) {
}
/**
* 添加学生信息
* @param stuList
* @param sc
*/
private static void addStudent(ArrayList<Student> stuList, Scanner sc) {
}
4.3 查询所有学员
/**
* 查询学生信息
* @param stuList
*/
private static void selectStudent(ArrayList<Student> stuList) {
// 如果没有学生信息,就显示没有信息
if (stuList.size() == 0){
System.out.println("【查询结果】:没有学生信息");
return;
}
// 如果有学生信息,就按照指定格式显示
Utils.printArrayList(stuList);
}
4.4 添加学员
/**
* 添加学生信息
* @param stuList
* @param sc
*/
private static void addStudent(ArrayList<Student> stuList, Scanner sc) {
// 1.用户输入姓名,性别,出生日期
System.out.println("请输入姓名:");
String name = sc.next();
System.out.println("请输入性别:");
String sex = sc.next();
System.out.println("请输入出生日期,格式为yyyy-MM-dd:");
String birthday = sc.next();
// 2.创建Student对象
Student stu = new Student();
// 3.封装输入的学生信息--->编号自增,年龄根据出生日期计算
// 方式一
//stu.setId(++Utils.sid);
// 方式二: 学生类的构造代码块中++
stu.setId(Utils.sid);
stu.setName(name);
stu.setSex(sex);
stu.setBirthday(birthday);
int age = Utils.birthdayToAge(birthday);
stu.setAge(age);
// 4.把学生添加到集合中
stuList.add(stu);
}
4.5 修改学员
/**
* 修改学生信息
*
* @param stuList
* @param sc
*/
private static void updateStudent(ArrayList<Student> stuList, Scanner sc) {// 1,2,3...10
// 1.输入要修改的学生编号
System.out.println("请输入学生编号:");
int sid = sc.nextInt();// 3
// 2.判断,如果学生编号不存在,就不修改,如果存在,就修改(保留原值的功能)
for (int i = 0; i < stuList.size(); i++) {
// 获取学生对象
Student stu = stuList.get(i);
// 判断学生编号
if (stu.getId() == sid) {
// 修改
System.out.println("请输入要修改的姓名,保留原值输入0:");
String name = sc.next();
System.out.println("请输入要修改的性别,保留原值输入0:");
String sex = sc.next();
System.out.println("请输入要修改的出生日期,保留原值输入0:");
String birthday = sc.next();
// 判断,然后修改
if (!"0".equals(name)) {
// 要修改name
stu.setName(name);
}
if (!"0".equals(sex)) {
// 要修改sex
stu.setSex(sex);
}
if (!"0".equals(birthday)) {
// 要修改birthday
stu.setBirthday(birthday);
// 要修改age
stu.setAge(Utils.birthdayToAge(birthday));
}
// 修改完了结束方法
System.out.println("【修改成功】!");
return;
}
}
// 来到这里,说明没有找到,不修改
System.out.println("【修改失败】:没有找到id为" + sid);
}
4.6 删除学员
/**
* 删除学生信息
*
* @param stuList
* @param sc
*/
private static void deleteStudent(ArrayList<Student> stuList, Scanner sc) {
// 1.输入要删除的学生编号
System.out.println("请输入要删除的学生编号:");
int sid = sc.nextInt();
// 2.判断,如果学生编号不存在,就不删除,如果存在,就删除(确认删除的功能)
for (int i = 0; i < stuList.size(); i++) {
// 获取学生对象
Student stu = stuList.get(i);
// 判断,如果学生id存在,就删除,删除完了,就结束方法
if (stu.getId() == sid) {
// 显示要删除的学生信息
System.out.println("【要删除的学生信息】:");
System.out.println("***********************************************************************************");
System.out.println("编号\t\t姓名\t\t性别\t\t生日\t\t\t\t年龄\t\t描述");
Utils.printPerson(stu);
System.out.println("***********************************************************************************");
// 确定删除的功能
System.out.println("请确认是否删除,y:确认删除,n:取消删除:");
String confirm = sc.next();
// 判断
if ("y".equalsIgnoreCase(confirm)){
// 删除
stuList.remove(i);
// 删除完了,就结束方法
System.out.println("【删除成功】!");
}else{
// 取消删除
System.out.println("【取消删除】!");
}
// 结束方法
return;
}
}
// 来到这里说明没有找到学生id
System.out.println("【删除失败】:没有找到id为" + sid + "的学生");
}
Scanner的扩展
import java.util.Scanner;
/**
* Created by PengZhiLin on 2021/8/2 12:06
*/
public class Test {
public static void main(String[] args) {
/*
Scanner类:
String next(); 获得键盘录入的字符串, 不可以获取空格,tab,回车
String nextLine(); 获得键盘录入的字符串,可以获取空格,tab,回车
double nextDouble();获得键盘录入的小数
*/
// 创建Scanner对象
Scanner sc = new Scanner(System.in);
// 使用next()方法
//System.out.println("请输入一个字符串:");
//String str1 = sc.next();
//System.out.println("str1:" + str1);
// 使用nextLine()方法
//System.out.println("请输入一个字符串:");
//String str2 = sc.nextLine();
//System.out.println("str2:" + str2);
// 注意:
System.out.println("请输入编号:");
//int op = sc.nextInt();// 获得键盘录入的整数
double op = sc.nextDouble();// 获得键盘录入的小数
System.out.println("op:" + op);
System.out.println("请输入姓名:");
String name = sc.next();// 获得字符串,但不会获得空格,tab,回车
//sc.nextLine(); // 把之前剩下的回车获取了
//String name = sc.nextLine();// 获得字符串,但会获得空格,tab,回车
System.out.println("name:" + name);
}
}
总结
必须练习:
1.类的设计---->Person类使用模板设计\继承
2.测试类中的修改和删除的功能必须要练习
3.工具类中的打印集合和打印Person对象的方法必须练习---->多态
4.根据出生日期计算年龄---->日期相关类的方法
- 能够编写主菜单
死循环生成主菜单,具体步骤查看第四章启动类实现的主菜单
- 能够定义Person类并应用模板模式
抽象父类, show方法定义为了通用模板,getType,getWork定义为了填充模板
- 能够定义子类Student类并添加特有成员
继承Person类,重写getType,getWork
- 能够定义子类Teacher类并添加特有成员
继承Person类,重写getType,getWork
- 能够理解继承在案例中的使用
Student,Teacher继承Person
- 能够理解模板模式在案例中的使用
Person类应用模板模式
- 能够定义并使用打印Person的静态方法
// 形参多态
public static void printPerson(Person p) {
System.out.println(p.getId() + "\t\t" + p.getName() + "\t\t" + p.getSex() + "\t\t" + p.getBirthday() + "\t\t" + p.getAge() + "\t\t" + p.show());
}
- 能够定义并使用打印ArrayList的静态方法
public static void printArrayList(ArrayList list) {// 不要加泛型,加泛型报错 System.out.println("****************************************************************");
System.out.println("编号\t\t姓名\t\t性别\t\t生日\t\t\t\t年龄\t\t描述");
for (int i = 0; i < list.size(); i++) {
Person p = (Person)list.get(i);
// System.out.println(p.getId() + "\t\t" + p.getName() + "\t\t" + p.getSex() + "\t\t" + p.getBirthday() + "\t\t" + p.getAge() + "\t\t" + p.show());
printPerson(p);
}
System.out.println("****************************************************************");
}
- 能够理解静态成员变量和静态方法在案例中的使用
实现学生编号\老师编号自增: 静态成员变量在内存中只有一份,被共享
静态方法: 工具类中的根据出生日期计算年龄,按照指定格式打印集合或者Person对象