02-面向对象进阶-分类和static
原创
©著作权归作者所有:来自51CTO博客作者武大保安的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
0. 项目创建
File->Close Project->Create New Project->左下角empty project-》弹出窗口 继续 new module ->取好名字一路next ->右键src-:new ->Package
1.分类思想
1.1分类思想概述 (理解)
分工协作,专人干专事
1.2javaSE信息管理系统 (理解)
- Student类 标准学生类,封装键盘录入的学生信息(id , name , age , birthday)
- StudentDao类 Dao : (Data Access Object 缩写) 用于访问存储数据的数组或集合
- StudentService类 用来进行业务逻辑的处理(例如: 判断录入的id是否存在)
- StudentController类 和用户打交道(接收用户需求,采集用户信息,打印数据到控制台)
2.分包思想
2.1分包思想概述 (理解)
如果将所有的类文件都放在同一个包下,不利于管理和后期维护,所以,对于不同功能的类文件,可以放在不同的包下进行管理
2.2包的概述 (记忆)
- 包
本质上就是文件夹 - 创建包
多级包之间使用 " . " 进行分割
多级包的定义规范:公司的网站地址翻转(去掉www)
比如:www.whu.edu.cn
后期我们所定义的包的结构就是:cn.whu.其他的包名 (.edu就省略了) - 包的命名规则
字母都是小写
2.3包的注意事项 (理解)
- package语句必须是程序的第一条可执行的代码
- package语句在一个java文件中只能有一个
- 如果没有package,默认表示无包名
2.4类与类之间的访问 (理解)
- 同一个包下的访问(package后面完全相同才算同一个包下 也就是说同一个文件夹下才算)
不需要导包,直接使用即可 - 不同包下的访问
1.import 导包后访问
2.通过全类名(包名 + 类名)访问 - 注意:import 、package 、class 三个关键字的摆放位置存在顺序关系
package 必须是程序的第一条可执行的代码
import 需要写在 package 下面
class 需要在 import 下面
3.javaSE信息管理系统
3.1系统介绍 (理解)
3.2学生管理系统 (应用)
3.2.1需求说明
- 添加学生: 键盘录入学生信息(id,name,age,birthday)
使用数组存储学生信息,要求学生的id不能重复 - 删除学生: 键盘录入要删除学生的id值,将该学生从数组中移除,如果录入的id在数组中不存在,需要重新录入
- 修改学生: 键盘录入要修改学生的id值和修改后的学生信息
将数组中该学生的信息修改,如果录入的id在数组中不存在,需要重新录入 - 查询学生: 将数组中存储的所有学生的信息输出到控制台
3.2.2实现步骤
- 环境搭建实现步骤再好好回顾一下三层的职责 不过其实难点在于同一个层次不同模块文件之间交互逻辑的准确划分 eg: StudentService 和 HomeworkService
包
| 存储的类
| 作用
|
cn.whu.info.manager.domain
| Student.java
| 封装学生信息
|
cn.whu.info.manager.dao
| StudentDao.java
| 访问存储数据的数组,进行赠删改查(库管)
|
cn.whu.info.manager.service
| StudentService.java
| 业务的逻辑处理(业务员)
|
cn.whu.info.manager.controller
| StudentController.java
| 和用户打交道(客服接待)
|
cn.whu.info.manager.entry
| InfoManagerEntry.java
| 程序的入口类,提供一个main方法
|
File->Project Structure…->“+” -> New Module->next->取名: whu-edu-info-manager ->Finish->OK
右键src->new -> Package ->写好包名 (同样方法重复 建立好包结构)
然后创建各个初始类:
Student.java
public class Student {
private String id;
private String name;
private String age;
private String birthday;
}
右键-》Generate->生成:空参+全参构造方法 所有的get/set方法
- 展示欢迎页面,用输出语句完成主界面的编写
- 获取用户的选择,用Scanner实现键盘录入数据
- 根据用户的选择执行对应的操作,用switch语句完成操作的选择
- 添加功能实现步骤
- 添加功能优化:判断id是否存在
- 删除功能实现步骤
- 修改功能实现步骤
- 系统优化
- 把updateStudent和deleteStudentById中录入学生id代码抽取到一个方法(inputStudentId)中
该方法的主要作用就是录入学生的id,方法的返回值为String类型
- 把addStudent和updateStudent中录入学生信息的代码抽取到一个方法(inputStudentInfo)中
该方法的主要作用就是录入学生的信息,并封装为学生对象,方法的返回值为Student类型
3.2.3代码实现
学生类 Student.java
public class Student {
private String id;
private String name;
private String age;
private String birthday;
//空参/全参构造方法+所有get/set
}
程序入口 InfoManagerEntry.java
package cn.whu.info.manager.entry;
import cn.whu.info.manager.controller.StudentController;
import java.util.Scanner;
/**
* 程序入口点
*/
public class InfoManagerEntry {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
//主菜单搭建
System.out.println("--------欢迎来到javaSE信息管理系统--------");
System.out.println("请输入您的选择: 1.学生管理 2.老师管理 3.退出");
String choice = sc.next();
switch (choice) {
case "1":
//System.out.println("学生管理");
//开启学生管理系统 这是前端 肯定先调用controller
StudentController studentController = new StudentController();
studentController.start();
break;
case "2":
System.out.println("老师管理");
break;
case "3":
System.out.println("感谢您的使用");
System.exit(0);//退出当前正在运行的JVM
break;
default: //用字符串类型的好处 default可以处理所有非法输入
System.out.println("您的输入有误,请重新输入!");
break;
}
}
}
}
StudentController.java
package cn.whu.info.manager.controller;
import cn.whu.info.manager.dao.StudentDao;
import cn.whu.info.manager.domain.Student;
import cn.whu.info.manager.service.StudentService;
import java.util.List;
import java.util.Scanner;
public class StudentController {
private StudentService studentService = new StudentService();
private Scanner sc = new Scanner(System.in);
/**
* 开启学生管理系统,并展示学生管理系统菜单
*/
public void start() {
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;//只是退出子系统 javaSE系统尚未退出
default:
System.out.println("您的输入有误,请重新输入!");
break;
}
}
}
private void updateStudent() {
//1.录入要修改的学生Id
String id,name,age,birthday;
id = inputStudentId();
//2.录入新数据
//3.封装数据
Student updateStudent = inputStudentInfo(id);
//4.调用service更新数据
studentService.updateStudent(updateStudent);
System.out.println("修改成功~");
}
private void deleteStudentById() {
String id = inputStudentId();
studentService.deleteStudentById(id);
System.out.println("删除成功~");
}
public void findAllStudent() {
//1. 调用service获取学生对象数组
Student[] stus = studentService.findAllStudent();
//2. 判断是否为空(空需要打印提示信息)
if(stus==null){
System.out.println("查无信息,请稍后再试!");
return;
}
//3.遍历数组,获取学生信息,打印出来
System.out.println("学号\t\t姓名\t年龄\t\t生日");
for (Student stu : stus) {
if(stu!=null) System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getAge()+"\t\t"+stu.getBirthday());
}
}
//记住:controller接受数据 打印提示信息
public void addStudent() {
//1.接受用户输入的信息
String id;
while (true){
System.out.println("请输入学生id:");
id=sc.next();
if(studentService.isExists(id)){
System.out.println("id已经存在,请重新输入:");
}else{
break;
}
}
Student student = inputStudentInfo(id);
//3.将数据传递给studentService
boolean result = studentService.addStudent(student);
//4.根据返回结果,在控制台打印 成功\失败
if(result){
System.out.println("添加成功~");
}else {
System.out.println("添加失败!");
}
}
//录入学生非id信息
private 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();
//2.封装用户提交的数据
return new Student(id, name, age, birthday);
}
//键盘录入学生id
private String inputStudentId() {
String id;
while (true) {
System.out.println("请输入学生id:");
id = sc.next();
if (studentService.isExists(id)) {
break;
} else {
System.out.println("查无此生,请重新输入!");
}
}
return id;
}
//ctrl+shift+/ 快速折叠代码
//ctrl+* 快速展开代码
}
StudentService.java
package cn.whu.info.manager.service;
import cn.whu.info.manager.dao.StudentDao;
import cn.whu.info.manager.domain.Student;
public class StudentService {
//1.创建studentDao库管 大胆写 完全可以写在成员变量这里 一直只有一份 完全可以 下面一直用即可
StudentDao studentDao = new StudentDao();
public boolean addStudent(Student student) {
return studentDao.addStudent(student);
}
public boolean isExists(String id) {
Student[] stus = studentDao.findAll();
for (Student student : stus) {
if(student!=null && student.getId().equals(id)){
return true;//一旦相等 说明存在了
}
}
return false;
}
public Student[] findAllStudent() {
//1.获取学生信息
Student[] stus = studentDao.findAll();
//2.业务层考虑齐全 没有学生信息时得直接返回null方便controller打印提示信息
for (Student stu : stus) {
if(stu!=null) return stus;
}
return null;
}
public void deleteStudentById(String id) {
studentDao.deleteStudentById(id);
}
public void updateStudent(Student updateStudent) {
studentDao.updateStudent(updateStudent);
}
}
StudentDao.java
package cn.whu.info.manager.dao;
import cn.whu.info.manager.domain.Student;
public class StudentDao {
//1.创建学生对象数组(数据库)
private static Student[] stus = new Student[5];//必须static全局变量 才不会被释放内存
static {//给一些初始数据 方便测试
stus[0]=new Student("1001","han","18","2001-11-12");//还必须写在下面 java编译也是重上到下啊
stus[1]=new Student("1002","zhu","19","2002-01-02");
}
/**
* 用数组存放student对象
* 长度为5 最多只能存5个学生
* @param student
* @return
*/
public boolean addStudent(Student student) {
//2.添加学生到数组
//2.1 找数组中是否有空闲位置
int index=-1;
for (int i = 0; i < stus.length; i++) {
if(stus[i]==null){
index=i;
break;
}
}
//2.2 根据是否找到空位 来添加并返回
if(index==-1){
return false;//满了 装不下 添加失败
}else{
stus[index]=student;
return true;
}
}
public Student[] findAll() {
return stus;
}
public void deleteStudentById(String id) {
//删除操作一定在dao完成 crud的落实都在dao
Integer i = getIndexById(id);
stus[i]=null;
}
/**
* 查找id对应的学生下标 本系统调用此方法 则应该一定存在 此处不存在还是返回-1吧
* @param id
* @return
*/
public Integer getIndexById(String id){
for (int i = 0; i < stus.length; i++) {
if(stus[i]!=null&&stus[i].getId().equals(id)) return i;
}
return -1;
}
public void updateStudent(Student updateStudent) {
Integer i = getIndexById(updateStudent.getId());
stus[i]=updateStudent;
}
}
3.3老师管理系统 (应用)
3.3.1需求说明
- 添加老师: 通过键盘录入老师信息(id,name,age,birthday)
使用数组存储老师信息,要求老师的id不能重复 - 删除老师: 通过键盘录入要删除老师的id值,将该老师从数组中移除,如果录入的id在数组中不存在,需要重新录入
- 修改老师: 通过键盘录入要修改老师的id值和修改后的老师信息
将数组中该老师的信息修改,如果录入的id在数组中不存在,需要重新录入 - 查询老师: 将数组中存储的所有老师的信息输出到控制台
3.3.2实现步骤
包
| 存储的类
| 作用
|
cn.whu.edu.info.manager.domain
| Student.java Teacher.java | 封装学生信息 封装老师信息
|
cn.whu.edu.info.manager.dao
| StudentDao.java TeacherDao.java | 访问存储数据的数组,进行赠删改查(库管)
|
cn.whu.edu.info.manager.service
| StudentService.java TeacherService.java | 业务的逻辑处理(业务员)
|
cn.whu.edu.info.manager.controller
| StudentController.java TeacherController.java | 和用户打交道(客服接待)
|
com.itheima.edu.info.manager.entry
| InfoManagerEntry.java | 程序的入口类,提供一个main方法
|
发现和学生管理系统雷同 就不再赘述了
4.static关键字
4.1static关键字概述 (理解)
static 关键字是静态的意思,是Java中的一个修饰符,可以修饰成员方法,成员变量
4.2static修饰的特点 (记忆)
- 被类的所有对象共享
是我们判断是否使用静态关键字的条件 - 随着类的加载而加载,优先于对象存在
对象需要类被加载后,才能创建 - 可以通过类名调用
也可以通过对象名调用(不推荐)
4.3static关键字注意事项 (理解)
- 静态方法只能访问静态的成员
-也就是说静态方法不能访问非静态成员,因为静态方法存在时(类存在时就存在)非静态成员可能还不存在(对象存在时才存在) 【静态成员:静态成员方法和静态成员变量】 - 非静态方法可以访问静态的成员,也可以访问非静态的成员
- 静态方法中是没有this关键字this是当前对象 static方法是属于类的 不是属于某一个对象的 况且static存在时可能还没有任何对象呢
小知识:
成员变量 堆内存
方法 栈内存
ctrl+shift+/ 快速折叠代码
ctrl+* 快速展开代码