第六章_面向对象进阶(1)_分类和static

一、分类与分包思想

  • 1.(分类思想)信息管理系统
    • Student类:标准学生类,封装键盘录入的学生信息(id , name , age , birthday)
    • StudentDao类:Dao(Data Access Object 缩写) 用于访问存储数据的数组或集合
    • StudentService类:用来进行业务逻辑的处理(例如: 判断录入的id是否存在)
    • StudentController类:和用户打交道(接收用户需求,采集用户信息,打印数据到控制台)
  • 2.分包思想:如果将所有的类文件都放在同一个包下,不利于管理和后期维护,所以,对于不同功能的类文件,可以放在不同的包下进行管理
    • 包:本质上就是文件夹
    • 创建包:多级包之间使用 " . " 进行分割;多级包的定义规范:公司的网站地址翻转(去掉www)
      • 比如:网站址为www.baidu.com;后期我们所定义的包的结构就是:com.baidu.其他的包名
    • 包的命名规则:字母都是小写
  • 3.包的注意事项
    • package语句必须是程序的第一条可执行的代码
    • package语句在一个java文件中只能有一个
  • 4.import 、package 、class的顺序
    • package必须是程序的第一条可执行的代码
    • import需要写在package下面
    • class需要在import下面
package com.itheima.test;
import com.itheima.test2.Student;
public class TestPackage {
    public static void main(String[] args) {
    }
}

二、static关键字

  • static概念:static关键字是静态的意思,是java中的一个修饰符,可以修饰成员方法,成员变量
    • 被static修饰的成员变量,一般叫做静态变量
    • 被static修饰的成员方法,一般叫做静态方法
  • static特点
    • 被static修饰的成员, 会被该类的所有对象所[共享]
    • 被static修饰的成员, 会随着类的加载而加载, 优先于对象存在
    • 多了一种调用方式, 可以通过类名.进行调用
  • static注意事项
    • 静态方法中, 只能访问静态成员(成员变量, 成员方法)
    • 非静态方法中, 可以使用静态成员, 也可以使用非静态成员
    • 静态方法中, 没有this关键字
public class Student {
    String name;
    int age;
    static String school;
    public void show() {
        System.out.println(name + "..." + age + "..." + school);
    }
    public static void method(){
        // this: 当前对象的引用
        // this需要在创建对象之后, 才会存在, 静态存在的时候, 对象可能还没有被创建
        // this.name = "张三";
    }
}
public class Test1Static {
    public static void main(String[] args) {
        Student.school = "传智专修学院";
        Student stu1 = new Student();
        stu1.name = "张三";
        stu1.age = 23;
        //stu1.school = "传智专修学院";
        stu1.show();
        Student stu2 = new Student();
        stu2.show();
        method();
    }

    public static void method(){

    }
}

三、学生管理系统思路分析

  • 需求分析

    • 添加学生:键盘录入学生信息(id,name,age,birthday) 使用数组存储学生信息,要求学生的id不能重复
    • 删除学生:键盘录入要删除学生的id值,将该学生从数组中移除,如果录入的id在数组中不存在,需要重新录入
    • 修改学生:键盘录入要修改学生的id值和修改后的学生信息 将数组中该学生的信息修改,如果录入的id在数组中不存在,需要重新录入
    • 查询学生:将数组中存储的所有学生的信息输出到控制台
  • 环境搭建

    存储的类作用
    com.itheima.edu.info.manager.domainStudent.java封装学生信息
    com.itheima.edu.info.manager.daoStudentDao.java访问存储数据的数组,进行赠删改查(库管)
    com.itheima.edu.info.manager.serviceStudentService.java业务的逻辑处理(业务员)
    com.itheima.edu.info.manager.controllerStudentController.java和用户打交道(客服接待)
    com.itheima.edu.info.manager.entryInfoManagerEntry.java程序的入口类,提供一个main方法
  • 菜单搭建实现步骤

    • 展示欢迎页面,用输出语句完成主界面的编写
    • 获取用户的选择,用Scanner实现键盘录入数据
    • 根据用户的选择执行对应的操作,用switch语句完成操作的选择
  • 基本添加功能分析
    在这里插入图片描述

  • 添加功能加入学号判断
    在这里插入图片描述

  • 查询学生思路分析
    在这里插入图片描述

  • 删除学生分析
    在这里插入图片描述

  • 修改学生分析
    在这里插入图片描述

四、学生管理系统思路分析

老师管理与学生管理类似,这里只介绍学生管理系统的实现即可

1.入口类InfoManagerEntry

public class InfoManagerEntry {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            // 主菜单搭建
            System.out.println("--------欢迎来到黑马信息管理系统--------");
            System.out.println("请输入您的选择: 1.学生管理  2.老师管理  3.退出");
            String choice = sc.next();
            switch (choice) {
                case "1":
                    // System.out.println("学生管理");
                    // 开启学生管理系统
                    StudentController studentController = new StudentController();
                    studentController.start();
                    break;
                case "2":
                    System.out.println("老师管理");
                    TeacherController teacherController = new TeacherController();
                    teacherController.start();
                    break;
                case "3":
                    System.out.println("感谢您的使用");
                    // 退出当前正在运行的JVM虚拟机
                    System.exit(0);
                    break;
                default:
                    System.out.println("您的输入有误, 请重新输入");
                    break;
            }
        }
    }
}

2.domain-Student

public class Student{
    private String id;
    private String name;
    private String age;
    private String birthday;
    //GET...SET...省略
}

3.StudentController

import java.util.Scanner;

public class StudentController {
    // 业务员对象
    private StudentService studentService = new StudentService();

    private Scanner sc = new Scanner(System.in);

    // 开启学生管理系统, 并展示学生管理系统菜单
    public void start() {
        //Scanner sc = new Scanner(System.in);
        studentLoop:
        while (true) {
            System.out.println("--------欢迎来到 <学生> 管理系统--------");
            System.out.println("请输入您的选择: 1.添加学生  2.删除学生  3.修改学生  4.查看学生  5.退出");
            String choice = sc.next();
            switch (choice) {
                case "1":
                    // System.out.println("添加");
                    addStudent();
                    break;
                case "2":
                    // System.out.println("删除");
                    deleteStudentById();
                    break;
                case "3":
                    // System.out.println("修改");
                    updateStudent();
                    break;
                case "4":
                    // System.out.println("查询");
                    findAllStudent();
                    break;
                case "5":
                    System.out.println("感谢您使用学生管理系统, 再见!");
                    break studentLoop;
                default:
                    System.out.println("您的输入有误, 请重新输入");
                    break;
            }
        }
    }

    // 修改学生方法
    public void updateStudent() {
        String updateId = inputStudentId();
        Student newStu = inputStudentInfo(updateId);
        studentService.updateStudent(updateId, newStu);
        System.out.println("修改成功!");
    }

    // 删除学生方法
    public void deleteStudentById() {
        String delId = inputStudentId();
        // 3. 调用业务员中的deleteStudentById根据id, 删除学生
        studentService.deleteStudentById(delId);
        // 4. 提示删除成功
        System.out.println("删除成功!");
    }

    // 查看学生方法
    public void findAllStudent() {
        // 1. 调用业务员中的获取方法, 得到学生的对象数组
        Student[] stus = studentService.findAllStudent();
        // 2. 判断数组的内存地址, 是否为null
        if (stus == null) {
            System.out.println("查无信息, 请添加后重试");
            return;
        }
        // 3. 遍历数组, 获取学生信息并打印在控制台
        System.out.println("学号\t\t姓名\t年龄\t生日");
        for (int i = 0; i < stus.length; i++) {
            Student stu = stus[i];
            if (stu != null) {
                System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
            }
        }
    }

    // 添加学生方法
    public void addStudent() {
        // StudentService studentService = new StudentService();
        // 1. 键盘接收学生信息
        String id;
        while (true) {
            System.out.println("请输入学生id:");
            id = sc.next();
            boolean flag = studentService.isExists(id);
            if (flag) {
                System.out.println("学号已被占用, 请重新输入");
            } else {
                break;
            }
        }
        Student stu = inputStudentInfo(id);
        // 3. 将学生对象,传递给StudentService(业务员)中的addStudent方法
        boolean result = studentService.addStudent(stu);
        // 4. 根据返回的boolean类型结果, 在控制台打印成功\失败
        if (result) {
            System.out.println("添加成功");
        } else {
            System.out.println("添加失败");
        }
    }

    // 键盘录入学生id
    public String inputStudentId() {
        String id;
        while (true) {
            System.out.println("请输入学生id:");
            id = sc.next();
            boolean exists = studentService.isExists(id);
            if (!exists) {
                System.out.println("您输入的id不存在, 请重新输入:");
            } else {
                break;
            }
        }
        return id;
    }

    // 键盘录入学生信息
    public Student inputStudentInfo(String id) {
        System.out.println("请输入学生姓名:");
        String name = sc.next();
        System.out.println("请输入学生年龄:");
        String age = sc.next();
        System.out.println("请输入学生生日:");
        String birthday = sc.next();
        Student stu = new Student();
        stu.setId(id);
        stu.setName(name);
        stu.setAge(age);
        stu.setBirthday(birthday);
        return stu;
    }
}

4.StudentService

public class StudentService {
    // 创建StudentDao (库管)
    private StudentDao studentDao = new StudentDao();
    // 添加学生方法
    public boolean addStudent(Student stu) {
        // 2. 将学生对象, 传递给StudentDao 库管中的addStudent方法
        // 3. 将返回的boolean类型结果, 返还给StudentController
        return studentDao.addStudent(stu);
    }
    // 判断学号是否存在方法
    public boolean isExists(String id) {
        Student[] stus = studentDao.findAllStudent();
        // 假设id在数组中不存在
        boolean exists = false;
        // 遍历数组, 获取每一个学生对象, 准备进行判断
        for (int i = 0; i < stus.length; i++) {
            Student student = stus[i];
            if(student != null && student.getId().equals(id)){
                exists = true;
                break;
            }
        }
        return exists;
    }
    // 查看学生方法
    public Student[] findAllStudent() {
        // 1. 调用库管对象的findAllStudent获取学生对象数组
        Student[] allStudent = studentDao.findAllStudent();
        // 2. 判断数组中是否有学生信息 (有: 返回地址,  没有: 返回null)
        // 思路: 数组中只要存在一个不是null的元素, 那就代表有学生信息
        boolean flag = false;
        for (int i = 0; i < allStudent.length; i++) {
            Student stu = allStudent[i];
            if(stu != null){
                flag = true;
                break;
            }
        }
        if(flag){
            // 有信息
            return allStudent;
        }else{
            // 没有信息
            return null;
        }
    }

    public void deleteStudentById(String delId) {
        studentDao.deleteStudentById(delId);
    }

    public void updateStudent(String updateId, Student newStu) {
        studentDao.updateStudent(updateId, newStu);
    }
}

5.StudentDao

public class StudentDao {
    // 创建学生对象数组
    private static Student[] stus = new Student[5];
    // 添加学生方法
    public boolean addStudent(Student stu) {

        // 2. 添加学生到数组
        //2.1 定义变量index为-1,假设数组已经全部存满,没有null的元素
        int index = -1;
        //2.2 遍历数组取出每一个元素,判断是否是null
        for (int i = 0; i < stus.length; i++) {
            Student student = stus[i];
            if(student == null){
                index = i;
                //2.3 如果为null,让index变量记录当前索引位置,并使用break结束循环遍历
                break;
            }
        }
        // 3. 返回是否添加成功的boolean类型状态
        if(index == -1){
            // 装满了
            return false;
        }else{
            // 没有装满, 正常添加, 返回true
            stus[index] = stu;
            return true;
        }
    }
    // 查看学生方法
    public Student[] findAllStudent() {
        return stus;
    }

    public void deleteStudentById(String delId) {
        // 1. 查找id在容器中所在的索引位置
        int index = getIndex(delId);
        // 2. 将该索引位置,使用null元素进行覆盖
        stus[index] = null;
    }

    public int getIndex(String id){
        int index = -1;
        for (int i = 0; i < stus.length; i++) {
            Student stu = stus[i];
            if(stu != null && stu.getId().equals(id)){
                index = i;
                break;
            }
        }
        return index;
    }

    public void updateStudent(String updateId, Student newStu) {
        // 1. 查找updateId, 在容器中的索引位置
        int index = getIndex(updateId);
        // 2. 将该索引位置, 使用新的学生对象替换
        stus[index] = newStu;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无休止符

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值