今日内容

  • 案例演示
  • 设计类
  • 制作类
  • 实现功能(对学生信息的增删查改的功能)

第一章 案例演示

1.1 程序启动

运行com.itheima.main.MainApp类,启动程序:

1.2 测试学员信息管理模块

1.3 测试【4.查询学员】

1.4 测试【1.添加学员】

1.5 测试【2.修改学员】

  • 输入不存在的编号:

  • 输入存在的编号:

1.6 测试【3.删除学员】

  • 输入不存在的编号:

  • 输入存在的编号,但取消操作:

  • 输入存在的编号,执行删除:

业务逻辑分析:

image-20200614090047729

第二章 类设计

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对象

第五章 课后练习

5.1参考学员管理实现教师管理模块

posted on 2022-04-24 23:40  ofanimon  阅读(35)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css