续简单学生管理系统、包装类--day18

Day18

一、删除的思考题

思考题:删除功能可以省略第一步吗?不可以

有第一步判断学生信息合法性,如果信息不合法会直接结束返回

如果没有第一步,将会在第二步判断是否有该学生query循环匹配查找,数据量大情况,效率很低

二、学生管理系统 --功能实现

StudentManagerSystemImpl类

查询功能

1.根据性别查询学生对象数组

步骤

1.验证学生信息合法性

2.获取符合条件的人数

3.创建新数组

4.遍历数据源,把符合条件的学生对象存入新数组中

@Override
public Student[] getStusByName(String name) {
//1.验证学生信息合法性
if (!StuInfoUtil.isName(name)) {
return null;
}
//2.获取符合条件的人数
int count = 0;
for (int i = 0; i < size; i++) {
if (stus[i].getName().equals(name)) {
count++;
}
}
if (count == 0) {
return null;
}
//3.创建新数组
Student[] newStus = new Student[count];
//4.遍历数据源,把符合条件的学生对象存入新数组中
int index = 0;
for (int i = 0; i < size; i++) {
if (stus[i].getName().equals(name)) {
newStus[index++] = stus[i];
}
}
return newStus;
}

后面几个相似

2.根据性别查询学生对象数组

getStusBySex判断时用“==”,不使用equals无法对基元类型char调用equals(char)

3.根据年龄查询学生对象数组
4.根据班级号查询学生对象数组

queryMenu

main方法中封装前端查询方法(多态)

步骤

  1. 查询功能展示
  2. 声明一个学生数组为空
  3. swicth匹配对应功能
  4. 优化基础办法,提示输入查询条件,学生系统调用相应方法查询,根据条件获取到的学生信息赋值给学生数组(多态)
  5. 对学生数组条件判断,查询成功打印数组(打印数组做成默认方法放在接口中),失败打印错误信息
private static void queryMenu(Scanner scan, StudentManagerSystemImpl sms) {System.out.println("请选择查询的条件:");System.out.println("1 - 根据姓名查询");System.out.println("2 - 根据性别查询");System.out.println("3 - 根据年龄查询");System.out.println("4 - 根据班级号查询");int num = scan.nextInt();//第二种Student[] stus = null;//2switch (num) {case 1:System.out.println("请输入需要查询的姓名:");String name = scan.next();//2stus = sms.getStusByName(name);//第一种最基础的办法
//					 String name = scan.next();//1
//					 Student[] stus = sms.getStusByName(name);
//					 for (Student stu : stus) {
//						System.out.println(stu);
//					}break;case 2:System.out.println("请输入需要查询的性别:");char sex  = scan.next().charAt(0);stus = sms.getStusBySex(sex);break;case 3:System.out.println("请输入需要查询的起始年龄(包含):");int start = scan.nextInt();System.out.println("请输入需要查询的结束年龄(不包含):");int end = scan.nextInt();stus = sms.getStusByAge(start, end);break;case 4:System.out.println("请输入需要查询的班级号:");String classId = scan.next();stus = sms.getStusByClassId(classId);break;}if (stus != null) {//2
//打印数组做成默认方法sms.printStus(stus);
//					for (Student stu : stus) {
//						System.out.println(stu);
//					}} else {System.out.println("查询错误");}}

三、包装类

理解:

8种基本数据类型对应类

出现原因:

Java为纯面向对象语言(万物皆对象),8种基本数据类型不能new对象,

就破坏Java为纯面向对象语言的特征,Java为8种基本数据类型分别匹配

了对应的类,这种类叫做包装类/封装类

基本数据类型包装类继承关系
byteByteObject.Number.Byte
shortShortObject.Number.Short
intIntegerObject.Number.Integer
longLongObject.Number.Long
floatFloatObject.Number.Float
doubleDoubleObject.Number.Double
charCharacterObject.Character
booleanBooleanObject.Boolean

注意:

1.int的包装类的写法为:Integer

2.char的包装类的写法为:Charater

3.其余基本数据类型的包装类均是基本类型的首字母大写

装箱和拆箱

手动装箱:

基本数据类型 -> 包装类

int num =100;
Integer integer = Integer.valueOf(num);//静态方法
System.out.println(integer);//String类型的100
手动拆箱:

​ 包装类 -> 基本数据类型

Integer integer = new Integer(100);
int num = integer.intValue();
System.out.println(num);//int类型的100
自动装箱

Window的show View的Navigator查看bin目录的class文件,再反编译查看底层

JDK1.5开始的新特性

基本数据类型 -> 包装类

int num = 100;
Integer integer = num;//底层实现:Integer.valueOf(num);
System.out.println(integer);
自动拆箱

包装类 -> 基本数据类型

Integer integer = new Integer(100);
int num = integer;//底层实现:integer.intValue();
System.out.println(num);

深入Integer的底层原理

面试题

描述下列代码的运行结果

	Integer integer1 = Integer.valueOf(100);Integer integer2 = Integer.valueOf(100);System.out.println(integer1 == integer2);//引用类型比较内存地址,trueInteger integer3 = Integer.valueOf(200);Integer integer4 = Integer.valueOf(200);System.out.println(integer3 == integer4);//引用类型比较内存地址,false

面试题:描述Integer的valueOf的底层原理
答:判断输入的int值是否在-127~128的区间内,如果在就从Integer的缓存类数组中获取对象
如果不在,就重新new Integer的对象

MyInteger MyInteger1 = MyInteger.valueOf(100);
MyInteger MyInteger2 = MyInteger.valueOf(100);
System.out.println(MyInteger1 == MyInteger2);//true

MyInteger MyInteger3 = MyInteger.valueOf(200);
MyInteger MyInteger4 = MyInteger.valueOf(200);
System.out.println(MyInteger3 == MyInteger4);//超过范围new对象,false

编写MyInteger

步骤:

  1. 定义一个int变量

  2. 有参构造获值

  3. intValue()返回值

  4. 重写toSting使用valueOf()将int值转换为String字符串再返回

  5. 编写缓存类(静态)

  6. 在缓存类中编写静态代码块初始化缓存数组

public class MyInteger {private int value;public MyInteger(int value) {super();this.value = value;}public int intValue(){return value;}//编写MyInteger的valueOf判断输入的int值是否在-127~128的区间内,如果在就从Integer的缓存类数组中获取对象,不在就重新new Integer的对象public static MyInteger valueOf(int i){if (i>=MyIntegerCache.low && i<=MyIntegerCache.hight) {return MyIntegerCache.cache[i + (-MyIntegerCache.low)];}return new MyInteger(i);}@Overridepublic String toString() {return String.valueOf(value);//将int值转换为String字符串}//缓存类private static class MyIntegerCache {//没有用到外部类的成员属性就可制成静态private static final int low = -128;//低位private static final int hight = 127;//高位private static final MyInteger[] cache;//缓存数组(-127~128的MyInteger的对象)static{//可用代码块//初始化缓存数组cache = new MyInteger[hight - low +1];int j = low;for (int i = 0; i < cache.length; i++) {cache[i] = new MyInteger(j++);}}}
}

测试

Integer integer = new Integer(100);System.out.println(integer);//100int num1 = integer.intValue();System.out.println(num1);//100MyInteger myInteger = new MyInteger(100);System.out.println(myInteger);//直接打印类的全路径com.qf.package_class.MyInteger@15db9742//MyInteger中重写toSting方法转化value值之后,100int num2 = myInteger.intValue();
System.out.println(nm2);//100

四学生管理系统 --功能实现

StudentManagerSystemImpl类(多态,包装类)

修改功能

注意:

用Object原因:ps:sex自动装箱将char装箱成Character,再将Character向上转型成Object(多态),方法里面又要向下转型

步骤:

  1. 判断学生信息的合法性

  2. 判断是否有该学生

  3. 判断修改类型

  4. switch判断修改类型,对应修改功能

    ​ 优化:利用实现类中定义的静态常量,提高代码可读性(程序定死的可以用)

  5. 对应功能:判断修改的数据的合法性

    ​ 修改数据

@Override
public int update(String classId, String id, int type, Object val) {//用Object原因:ps:sex自动装箱将char装箱成Character,再将Character向上转型成Object(多态),方法里面又要向下转型//1.判断学生信息的合法性if (!StuInfoUtil.isClassId(classId) && !StuInfoUtil.isId(id)) {return -1;}//2.判断是否有该学生int index = query(classId, id);if (index == -1) {return -2;}//3.判断修改类型switch (type) {//		利用实现类中定义的静态常量,提高代码可读性(程序定死的可以用)case NAME:String nameVal = (String)val;
//			外部传进来的val处理,前端可以屏蔽掉
//			if (val instanceof String) {
//				String name = (String)val;
//			}//判断修改的数据的合法性if (!StuInfoUtil.isName(nameVal)) {return -3;}//修改数据stus[index].setName(nameVal);break;case SEX:char sexVal = (Character) val;//强转成Character类型,再自动拆箱成char类型//判断修改的数据的合法性if (!StuInfoUtil.isSex(sexVal)) {return -3;}//修改数据stus[index].setSex(sexVal);break;case AGE:int ageVal = (Integer) val;//强转成Integer类型,再自动拆箱成int类型//判断修改的数据的合法性if (!StuInfoUtil.isAge(ageVal)) {return -3;}//修改数据stus[index].setAge(ageVal);break;case CLASS_ID:String classIdVal = (String)val;//判断目标班级上是否有重复学生(即修改班级号对应班级是否已经存在学生 ps:2041 001 -> 2042 001)if (query(classIdVal, id) != -1) {return -4;}//判断修改的数据的合法性if (!StuInfoUtil.isClassId(classIdVal)) {return -3;}//修改数据stus[index].setClassId(classIdVal);break;case ID:String idVal = (String)val;//判断目标学号上是否有重复学生(即修改学号对应学号是否已经存在学生 ps:2041 001 -> 2041 002)if (query(classId, idVal) != -1) {return -5;}//判断修改的数据的合法性if (!StuInfoUtil.isId(idVal)) {return -3;}//修改数据stus[index].setId(idVal);break;}return 1;}

updateMenu

main方法中封装前端查询方法(多态)

步骤:

  1. 提示输入班级号、学号
  2. 查询功能展示
  3. 声明一个Object为空
  4. swicth匹配对应功能
  5. 优化基础办法,提示输入查询条件,学生系统调用相应方法查询,根据条件获取到的学生信息赋值给Object(多态,向上转型)
  6. 获取修改状态码:学生系统调用添加方法返回修改状态码
  7. 根据修改状态码进行条件判断修改的情况息
private static void updateMenu(Scanner scan, StudentManagerSystemImpl sms) {System.out.println("请输入需要修改学生的班级号:");String classId = scan.next();System.out.println("请输入需要修改学生的学号:");String id = scan.next();System.out.println("请选择需要修改的类型:");System.out.println("1 - 修改姓名");System.out.println("2 - 修改性别");System.out.println("3 - 修改年龄");System.out.println("4 - 修改班级号");System.out.println("5 - 修改学号");int type = scan.nextInt();System.out.println("请输入修改的值");Object val = null;switch (type) {case 1:case 4:case 5://					String val = scan.next();val = scan.next();//String -> Objectbreak;case 2:val = scan.next().charAt(0);//char -> Character -> Objectbreak;case 3:val = scan.nextInt();//int -> Integer -> Objectbreak;default:System.out.println("修改失败  -- 修改类型错误");return;}int updateCode = sms.update(classId, id, type, val);if (updateCode == -1) {System.out.println("修改失败 -- 学生信息不合法");}else if (updateCode == -2) {System.out.println("修改失败 -- 没有该学生");	}else if (updateCode == -3) {System.out.println("修改失败 -- 修改值的信息不合法");	}else if (updateCode == -4) {System.out.println("修改失败 -- 目标班级上有学生");	}else if (updateCode == -5) {System.out.println("修改失败 -- 目标学号上有学生");	}else if (updateCode == 1) {System.out.println("修改成功");	}}

总结

1.学生管理系统 – 删除的思考题

2.学生管理系统 – 查询功能

3.包装类
概念
出现原因
手动装箱、手动拆箱
自动装箱、自动拆行
深入Integer的底层原理 – 重要!!!!

4.学生管理系统 – 修改功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯倒计时 43天 - 前缀和,单调栈

最大数组和 算法思路&#xff1a;利用前缀和化简 for 循环将 n^2 简化成 nn&#xff0c;以空间换时间。枚举每个 m&#xff0c;m是删除最小两个数&#xff0c;那k-m就是删除最大数&#xff0c;m<k&#xff0c;求和最大的值。暴力就是枚举 m-O(n)&#xff0c;计算前 n-(k-m)的…

PCSA时钟控制集成之时钟门控级别

这一部分描述了&#xff1a; • 时钟门控的级别。 • 实现最大效果的时钟门位置。 • 实现有效和高效时钟门控的集成方法。 时钟树是由时钟缓冲器构建的&#xff0c;这些缓冲器在时钟源&#xff08;时钟输入或PLL&#xff09;与时钟终端&#xff08;寄存器或RAM&#xff09…

ULN2003(COM的作用)

单路内部电路原理图 三极管多级放大电路&#xff0c;最大可达到500ma&#xff1b; 典型应用&#xff1a; ULN2003属于灌电流驱动方式&#xff1b;输入与输出电平反向&#xff0c;下拉4K电阻&#xff0c;为解决单片机上电IO瞬间不稳定&#xff1b; COM端 1.可悬空&#xff1a…

Java面题总结7

spring事务什么时候会失效 1:发生自调用&#xff0c;类里面使用this调用本类的方法&#xff08;&#xff09;此时这个this对象不是代理类&#xff0c;而是UserService对象本身 2&#xff1a;方法不是public 3&#xff1a;数据库不支持事务 4&#xff1a;没有被spring管理 …

git标签操作

一.标签管理 1.理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名,当我们需要回退到某个重要版本时&#xff0c;直接使⽤标签就能很快定位到 2.创建标签 ⾸先&#xff0c;切换到需要打标签的分⽀上,然后&#xf…

经典目标检测网络Yolo——原理部分

目标检测问题 分为两个子问题: 找到图片中哪些位置、哪些区域含有目标对象识别这些区域中的目标对象是什么基于CNN的目标检测算法能够很好的解决第二个问题,在一张图片仅含一个对象,且该对象占据了整张图片绝大部分面积时,基于CNN的对象识别算法具有很高的准确率。 一种定…

操作系统(1)——学习导论(Ⅱ)

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/6grrU) 学习导论&#xff08;Ⅱ&#xff09;操作系统-赏前人佳作大型操作系统大型操作系统的一些特点和功能举例 服务器操作系统服务器操作系统特点和功能举例 多处理器操作系统举例 个人计算机操作系统举例 掌上计算机操作…

什么是ACID属性。在MySQL中,如何使用事务?给出一个使用事务的示例,并解释其工作原理。

解释什么是ACID属性 ACID是数据库事务正确执行的四个基本要素的缩写&#xff0c;包括原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;。这四个属性…

设计模式:什么是设计模式?①

一、什么是设计模式&#xff1f; 1. 是一类程序设计思想 2. 是在大量实践过程中摸索总结出的标准经验提炼 3. 具有多样性和丰富性&#xff0c;不同情况应用的思想不同 二、设计模式的好处 1. 代码生产力和效率的提升 2. 让代码表现更为规整&#xff0c;简洁。阅读维护管理的成本…

【竞技宝】DOTA2-梦幻联赛S22:AR命悬一线 XG确定晋级淘汰赛

北京时间2024年2月28日&#xff0c;DOTA2梦幻联赛S22的比赛在昨日进入小组赛第三个比赛日&#xff0c;本次梦幻联赛共有AR、XG、IG三支中国区的队伍参赛&#xff0c;那么经过三日激烈的比赛之后&#xff0c;目前三支队伍的积分情况以及晋级形势如何呢&#xff1f; XG XG是小组…

贪心(基础算法)--- 区间选点

905. 区间选点 思路 &#xff08;贪心&#xff09;O(nlogn) 根据右端点排序 将区间按右端点排序 遍历区间&#xff0c;如果当前区间左端点不包含在前一个区间中&#xff0c;则选取新区间&#xff0c;所选点个数加1&#xff0c;更新当前区间右端点。如果包含&#xff0c;则跳…

常见的算法

查找算法 基本查找 package MyApi.search;public class a01BasicSearchdemo01 {public static void main(String[] args) { int[] arr{131,127,147,81,103,23,7,79}; int number82;System.out.println(BasicSearch(arr,number));}public static boolean BasicSearch(int[] ar…

Java二叉树(1)

&#x1f435;本篇文章将对二叉树的相关概念、性质和遍历等知识进行讲解 一、什么是树 在讲二叉树之前&#xff0c;先了解一下什么是树&#xff1a;树是一种非线性结构&#xff0c;其由许多节点和子节点组成&#xff0c;整体形状如一颗倒挂的树&#xff0c;比如下图&#xff1…

给nginx部署https及自签名ssl证书

一、生成服务器root证书 openssl genrsa -out root.key 2048 openssl req -new -key root.key -out root.csr#Country Name (2 letter code) [XX]:---> CN#Country Name (2 letter code) [XX]:---> CN#State or Province Name (full name) []:---> Shanghai#Locality…

多层感知机 + 代码实现 - 动手学深度学习v2 | 李沐动手学深度学习课程笔记

感知机 感知机≈二分类问题 感知机和其他问题的对比 训练感知机 如果小于等于零&#xff0c;说明预测错啦 &#xff0c;其实就是同号为正&#xff0c;异号为负 举个分类的例子 增加样本&#xff0c;改变分类线 继续分类 感知机的收敛定理 XOR问题 XOR问题其实就是第1、3象限数…

【踩坑】一条指令解决torch_scatter等安装报错安装不上问题

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 目录 背景说明 (推荐方法)解决方法一&#xff1a;使用conda安装。 解决方法二&#xff1a;指定pip的网站。 解决方法三&#xff1a;直接去下载whl文件。 (终极方法)解决方法四&#xff1a;配置MSVC 特殊情况…

Linux系统运维脚本:扫描主机上多个端⼝状态

目 录 一、要求 二、解决方案 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;方案 三、脚本程序实现 &#xff08;一&#xff09;脚本代码和解释 1、脚本代码 2、代码解释 &#xff08;二&#xff09;脚本验证 1、脚本编辑 2、给予执…

构建 ESLint 内存泄露检测插件入门:提升代码质量与防范运行时风险

前言 本文目的是介绍如何创建开发一个自定义规则 ESLint 插件。利用其能力,检测一些代码中可能存在的内存泄露并及时进行提示,避免潜在的后期影响。 本文实现其中一部分功能–检测事件监听器的使用是否存在内存泄露为例来演示基本的 ESLint 自定义规则插件开发的过程。用以…

nginx笔记整理

目录 一.Nginx基础介绍 二.nginx安装配置 三.Nginx配置文件 3.1nginx主配置文件(/etc/nginx/nginx.conf) 3.2默认的网站配置文件(/etc/nginx/conf.d/default.conf) 四.创建新的虚拟主机 五.Nginx日志 5.1nginx日志格式 5.2查看日志 5.3日志缓存(了解) 5.4日志轮转(/…

COMPOSER安装使用WIN下升级PHP-V

想用TP6使用phpspreadsheet但是说我PHP版本低&#xff0c;原来是PHP7.0 composer要求至少7.4 直接修改环境变量&#xff0c;把PHP目录切换到7.4 composer升级比较简单&#xff0c;在PHP目录下CMD然后官网的命令执行下即可 下面就可以在TP根目录下执行命令安装PHPSPREADSHEET…