Java面向对象进阶篇综合训练(附带全套源代码及逐语句分析)->基于javabeen

一、前言

面向对象这一块也要结束了,不知道读者们掌握的如何呢。不过面向对象的路程远不止于此,可以利用面向对象来做一些小型的系统来巩固一下。接下来就进入新的章节了,回顾一下这已经是第五天了,之前说的7天拿下java还是太过于理想化了。当然如果只是为了了解一下,那学习到这里已经算是结束了,不过为了后面的学习,java这部分要深入的去学,毕竟在开发方面java还是主流的编程语言。在进阶篇的时候希望大家不要放弃,跟着小编的步伐就行了。一起加油!!!

建议先看完基础 篇再来看进阶篇

Java面向对象基础篇综合训练(附带全套源代码及逐语句分析)->基于javabeen

二、案例简介

本案例的主要目的是对学生信息的管理,可以简单理解为简易版的学生管理系统。主要目的还是熟练面向对象的操作。javabeen的应用一定要熟练,这对后面的学习帮助很大。虽然本案例所实现的功能并不是很多,但是对于初学者还是有一定的难度的,代码量150行左右。感兴趣的同学可以在上面进行功能的拓展。

这也算是日后一些命令行系统的模板,如果有想法的小伙伴想要去拓展功能,可以去参考一下小编之前所写的基于C语言的一些系统。

温馨提示一下,这些系统都能用于C语言这门学科的程序设计作业

C语言项目--企业员工管理系统(附带全套源代码)

C语言实战项目--图书管理系统(附带全套源代码)

C语言实战项目-学生成绩管理系统(附带全套源代码)

三、案例分析

1. 准备工作

//复杂对象数组练习//1.创建数组存储学生对象Students[] s = new Students[3];//2.创建学生对象Students s1 = new Students(1, "张三", 18);Students s2 = new Students(2, "李四", 20);Students s3 = new Students(3, "王五", 21);//3.将学生对象添加到数组中s[0] = s1;s[1] = s2;s[2] = s3;

这一步和之前的没什么区别就是简单的创建数组存放信息

创建数组存储学生对象:

Students[] s = new Students[3];

  • 在这行代码中,声明了一个名为 s 的数组,类型为 Students[],长度为 3。这意味着 s 可以存储三个 Students 类型的对象。

创建学生对象:

Students s1 = new Students(1, "张三", 18); Students s2 = new Students(2, "李四", 20); Students s3 = new Students(3, "王五", 21);

  • 在这三行代码中,创建了三个 Students 对象:s1s2 和 s3
  • 每个学生对象都使用 Students 类的构造方法进行初始化,分别传入学生的ID、姓名和年龄信息。

将学生对象添加到数组中:

s[0] = s1; s[1] = s2; s[2] = s3;

  • 这三行代码将之前创建的 Students 对象分别赋值给数组 s 的第 0、1、2 个位置。
  • 现在,数组 s 包含了三个学生对象,分别是 s1s2 和 s3,它们按照顺序存储在数组中。

2. 再添加一个学生

//4.再添加一个学生Students s4=new Students(4,"VON",18);boolean flag = contains(s,s4.getId());if(flag){//id重复System.out.println("当前id重复,请修改id");}else{int count = getCount(s);if(count==s.length){//已经存满Students[] news = CreateNews(s);news[count] = s4;Prints(news);//遍历所有学生信息}else{//没有存满s[count] = s4;Prints(s);//遍历所有学生信息}}

创建新学生对象:

Students s4 = new Students(4, "VON", 18);

  • 创建了一个名为 s4 的新的 Students 对象,该对象的ID为 4,姓名为 "VON",年龄为 18。

检查是否存在重复的ID:

boolean flag = contains(s, s4.getId());注:contains是下面所构造的方法

  • contains 方法用于检查数组 s 中是否已经存在与 s4 相同的学生ID。这里假设该方法返回一个布尔值 flag,表示是否存在重复的ID。

根据情况进行处理:核心步骤

if (flag) {System.out.println("当前id重复,请修改id");
} else {int count = getCount(s);if (count == s.length) { // 数组已经存满Students[] news = CreateNews(s); // 创建一个新的数组,通常是扩展现有数组的容量news[count] = s4; // 将新的学生对象添加到新数组的最后Prints(news); // 打印遍历所有学生信息} else { // 数组未存满s[count] = s4; // 将新的学生对象直接添加到数组的下一个空位Prints(s); // 打印遍历所有学生信息}
}
  • 如果 flag 为 true,即存在重复的ID,则输出提示信息 "当前id重复,请修改id"
  • 否则,根据当前数组 s 中已有的学生数量 count 进行判断:
    • 如果 count 等于数组 s 的长度,表示数组已经存满。此时调用 CreateNews(s) 方法创建一个新的数组 news,通常会扩展原有数组的容量,然后将 s4 添加到 news 的末尾,并调用 Prints(news) 方法打印遍历所有学生的信息。
    • 如果 count 小于数组 s 的长度,表示数组未存满。直接将 s4 添加到数组 s 的下一个空位,并调用 Prints(s) 方法打印遍历所有学生的信息。

3. 删除id为2的学生

//找到id在数组中对应的索引
//这一步删除学生的id为2
int index = GetIndex(s,2);//这里是对原数组进行的操作,只有三位同学
if(index>=0){//id存在s[index] = null;Prints(s);}else{//id不存在System.out.println("当前id不存在,删除失败!");}System.out.println();

找到id在数组中对应的索引:

int index = GetIndex(s, 2);注:GetIndex是下面构造的方法

  • GetIndex 方法用于在数组 s 中查找具有指定ID(这里是2)的学生对象,并返回该学生对象在数组中的索引。假设 index 是这个操作的返回值。

根据索引进行删除操作:

if (index >= 0) { // 如果找到了指定ID的学生对象s[index] = null; // 将该索引位置的学生对象置为 null,相当于删除Prints(s); // 打印遍历所有学生信息
} else { // 如果未找到指定ID的学生对象System.out.println("当前id不存在,删除失败!");
}
  • 如果 index 大于等于 0,说明找到了具有指定ID的学生对象。此时将数组 s 中该索引位置的元素设为 null,表示删除该学生对象。
  • 然后调用 Prints(s) 方法,打印遍历所有学生信息,显示更新后的数组内容。
  • 如果 index 小于 0,表示未找到指定ID的学生对象,输出 "当前id不存在,删除失败!"

4. 将id为1的学生年龄加一

        //方法一、找到id为1的学生的索引int index2 = GetIndex(s,1);if(index2>=0){int newage = s[index2].getAge()+1;s[index2].setAge(newage);Prints(s);}System.out.println();/*方法二、利用循环for (int i = 0; i < s.length; i++) {if(s[i]!=null){if(s[i].getId()==1){int newage = s[i].getAge()+1;s[i].setAge(newage);//注:不能写s[i].getAge()++Prints(s);break;}}else{System.out.println("当前id不存在,修改失败");}}*/

注:这一步中的两种方法都能够实现该功能

方法一分析:

int index2 = GetIndex(s, 1);
if (index2 >= 0) { // 如果找到了指定ID的学生对象int newage = s[index2].getAge() + 1; // 获取该学生对象的年龄并加1s[index2].setAge(newage); // 设置该学生对象的年龄为新值Prints(s); // 打印遍历所有学生信息
}
System.out.println();
  • GetIndex 方法:根据指定ID(这里是1),返回数组 s 中该学生对象的索引。
  • 如果 index2 大于等于 0,表示找到了具有指定ID的学生对象。此时获取该学生对象的年龄并加1,然后更新学生对象的年龄。
  • 最后调用 Prints(s) 方法,打印遍历所有学生信息,显示更新后的数组内容。

方法二分析:

for (int i = 0; i < s.length; i++) {if (s[i] != null) { // 检查数组元素不为空if (s[i].getId() == 1) { // 如果当前学生对象的ID等于1int newage = s[i].getAge() + 1; // 获取该学生对象的年龄并加1s[i].setAge(newage); // 设置该学生对象的年龄为新值Prints(s); // 打印遍历所有学生信息break; // 结束循环,因为已经找到并修改了目标学生对象}} else {System.out.println("当前id不存在,修改失败");}
}
  • 循环遍历:通过循环遍历数组 s 中的每个学生对象。
  • 对于每个非空的学生对象,检查其ID是否等于1。如果等于1,则进行年龄加1的操作,并更新学生对象的年龄。
  • 在找到并修改了目标学生对象后,调用 Prints(s) 方法打印更新后的数组内容,并使用 break 结束循环。
  • 如果某个数组元素为 null,说明对应位置没有学生对象,输出 "当前id不存在,修改失败"

5.方法分析

上文中所提到的方法,方法一定要写在主体部分的下方。

5.1 找到id在数组中对应的索引

//找到id在数组中对应的索引public static int GetIndex(Students[] s,int id){for(int i=0;i<s.length;i++){if(s[i]!=null){if(s[i].getId()==id){return i;}}}return -1;}

方法解析:

参数说明

  • s 是一个 Students 对象数组,用来存储学生对象。
  • id 是要查找的学生对象的ID。

方法逻辑

  • 使用 for 循环遍历数组 s 中的每个元素。
  • 在循环中,首先检查当前索引 i 处的元素是否为 null,以避免空指针异常。
  • 如果 s[i] 不为 null,继续判断 s[i] 的 ID 是否等于输入的 id
  • 如果找到了符合条件的学生对象(即 s[i].getId() == id),则立即返回当前索引 i
  • 如果循环结束仍未找到符合条件的学生对象,则返回 -1,表示未找到对应的学生对象。

返回值

  • 如果找到了对应的学生对象,则返回该对象在数组中的索引。
  • 如果未找到,则返回 -1

特性

  • 这段代码使用简单直接的线性搜索方式,在数组中查找指定ID的学生对象。
  • 由于可能存在 null 元素,因此在判断 s[i] 是否为 null 时进行了额外的检查,以避免空指针异常。
  • 返回 -1 表示未找到指定ID的学生对象,这是一种常见的约定。

5.2 遍历数组中所有学生的信息

//遍历数组中的所有学生信息public static void Prints(Students[] s){for(int i=0;i<s.length;i++){if(s[i]!=null){System.out.println("学号:"+s[i].getId()+"姓名:"+s[i].getName()+"年龄:"+s[i].getAge());}}}

方法逻辑

  • 使用 for 循环遍历数组 s 中的每个元素,从索引 0 到 s.length - 1
  • 在循环体内,使用条件判断 if (s[i] != null) 来检查当前索引 i 处的元素是否为 null
  • 如果 s[i] 不为 null,则表示在该位置有一个有效的学生对象,将其相关信息打印出来。
  • 使用 s[i].getId()s[i].getName() 和 s[i].getAge() 分别获取该学生对象的学号、姓名和年龄,并通过 System.out.println 方法打印出来。

注:在遍历过程中,通过 s[i] != null 的判断确保只有有效的学生对象被打印,避免了尝试访问空对象可能引发的空指针异常。

5.3 创建新数组

//创建新数组,长度=老数组+1public static Students[] CreateNews(Students[]s){Students[] news = new Students[s.length+1];for(int i=0;i<s.length;i++){news[i] = s[i];}return news;}

方法逻辑

  • 首先,根据输入数组 s 的长度创建一个新的数组 news,其长度为 s.length + 1
  • 使用 for 循环遍历输入数组 s 中的每个元素。
  • 在循环体内,将输入数组 s 中的每个元素 s[i] 赋值给新数组 news 的相同索引位置 news[i]
  • 循环结束后,新数组 news 的前 s.length 个元素与输入数组 s 的元素完全相同。

注:这段代码并没有在新数组 news 的最后一个位置(即 news[s.length])添加任何元素或进行其他操作。新数组只是在原有数组的基础上扩展了长度。如果需要在新数组中添加新的元素或对其进行进一步的操作,需要在循环外部或循环内部添加相应的逻辑。

5.4 判断数组中存放数据个数

//检查数组中存放了几个数据public static int getCount(Students[] s) {int count = 0;for (int i = 0; i < s.length; i++) {if (s[i] != null) {count++;}}return count;}

方法逻辑

  • 定义一个整型变量 count,用来计数非空元素的数量,初始值为 0
  • 使用 for 循环遍历数组 s 中的每个元素,从索引 0 到 s.length - 1
  • 在循环体内,使用条件判断 if (s[i] != null) 检查当前索引 i 处的元素是否不为 null
  • 如果 s[i] 不为 null,则将 count 的值增加 1,表示找到了一个非空元素。
  • 循环结束后,返回变量 count 的值,即数组中非空元素的个数。

5.5 根据id判断学生是否存在于数组中

//根据id判断学生是否存在public static boolean contains(Students[] s,int t) {for (int i = 0; i < s.length; i++) {if(s[i]!=null && s[i].getId()==t){return true;}}return false;}

方法逻辑

  • 使用 for 循环遍历数组 s 中的每个元素,从索引 0 到 s.length - 1
  • 在循环体内,首先使用条件 if (s[i] != null) 来确保数组当前索引 i 处有一个有效的学生对象。
  • 如果 s[i] 不为 null,则进一步判断 s[i].getId() == t 是否成立:
    • s[i].getId() 是获取当前学生对象的ID。
    • t 是传入的目标学生ID。
  • 如果上述条件都成立,则说明找到了与目标ID匹配的学生,直接返回 true
  • 如果循环结束都没有找到与目标ID匹配的学生,则返回 false,表示数组中不存在该学生。

四、全套源代码

Java部分

package day5;public class text2 {//主函数public static void main(String[] args) {//复杂对象数组练习//1.创建数组存储学生对象Students[] s = new Students[3];//2.创建学生对象Students s1 = new Students(1, "张三", 18);Students s2 = new Students(2, "李四", 20);Students s3 = new Students(3, "王五", 21);//3.将学生对象添加到数组中s[0] = s1;s[1] = s2;s[2] = s3;//4.再添加一个学生Students s4=new Students(4,"VON",18);boolean flag = contains(s,s4.getId());if(flag){//id重复System.out.println("当前id重复,请修改id");}else{int count = getCount(s);if(count==s.length){//已经存满Students[] news = CreateNews(s);news[count] = s4;Prints(news);//遍历所有学生信息}else{//没有存满s[count] = s4;Prints(s);//遍历所有学生信息}}System.out.println();//找到id在数组中对应的索引//这一步删除学生的id为2int index = GetIndex(s,2);//这里是对原数组进行的操作,只有三位同学if(index>=0){//id存在s[index] = null;Prints(s);}else{//id不存在System.out.println("当前id不存在,删除失败!");}System.out.println();//5.将id为1的学生年龄加一//方法一、找到id为1的学生的索引int index2 = GetIndex(s,1);if(index2>=0){int newage = s[index2].getAge()+1;s[index2].setAge(newage);Prints(s);}System.out.println();/*方法二、利用循环for (int i = 0; i < s.length; i++) {if(s[i]!=null){if(s[i].getId()==1){int newage = s[i].getAge()+1;s[i].setAge(newage);//注:不能写s[i].getAge()++Prints(s);break;}}else{System.out.println("当前id不存在,修改失败");}}*/}//方法//找到id在数组中对应的索引public static int GetIndex(Students[] s,int id){for(int i=0;i<s.length;i++){if(s[i]!=null){if(s[i].getId()==id){return i;}}}return -1;}//遍历数组中的所有学生信息public static void Prints(Students[] s){for(int i=0;i<s.length;i++){if(s[i]!=null){System.out.println("学号:"+s[i].getId()+"姓名:"+s[i].getName()+"年龄:"+s[i].getAge());}}}//创建新数组,长度=老数组+1public static Students[] CreateNews(Students[]s){Students[] news = new Students[s.length+1];for(int i=0;i<s.length;i++){news[i] = s[i];}return news;}//检查数组中存放了几个数据public static int getCount(Students[] s) {int count = 0;for (int i = 0; i < s.length; i++) {if (s[i] != null) {count++;}}return count;}//根据id判断学生是否存在public static boolean contains(Students[] s,int t) {for (int i = 0; i < s.length; i++) {if(s[i]!=null && s[i].getId()==t){return true;}}return false;}
}

JavaBeen部分

package day5;public class Students {private int id;private String name;private int age;//空参public Students() {}public Students(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}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 int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

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

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

相关文章

LLaMA-Factory:开源的低代码大模型训练框架

LLaMA-Factory 是一个由零隙智能&#xff08;SeamLessAI&#xff09;开源的低代码大模型训练框架&#xff0c;它集成了业界最广泛使用的微调方法和优化技术&#xff0c;并支持众多开源模型的微调和二次训练。 一、功能特点 支持多种开源模型&#xff1a;LLaMA-Factory支持包括…

辐射神经场算法——Instant-NGP / Mipi-NeRF 360 / 3D Gaussian Splatting

辐射神经场算法——Instant-NGP / Mipi-NeRF 360 / 3D Gaussian Splatting 1. Instant-NGP1. MultiResolution Hash Encoding1.2 Accelerated Ray Marching1.3 实验结果 2. Mip-NeRF 3602.1 场景参数化2.2 在线蒸馏2.3 失真正则化2.4 实验结果 3. 3D Gaussian Splatting3.1 Dif…

krpano开启日志公能

<krpano version"1.21" title"博物馆" debugmode"true" > 之后鼠标右键菜单栏最后一行 点击&#xff08;开启后会发生变化&#xff09;。

汽车预约维修小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;技师管理&#xff0c;技师信息管理&#xff0c;用户预约管理&#xff0c;取消预约管理&#xff0c;订单信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;技师信息&a…

新开发的软件老被系统拦截有什么办法解决吗?

一套新开发的软件要想在windows操作系统畅通无阻&#xff0c;那就需要使用代码签名证书&#xff0c;只要是对软件进行实名从而证明软件发布者身份&#xff0c;确保该软件是一个合法有效的主体开发的&#xff0c;也是让这个软件开发者承担相应的责任。 特别主要如果要获得即时性…

【深度学习入门篇 ③】PyTorch的数据加载

【&#x1f34a; 易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a; 】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创…

【漏洞复现】宏景HCM-LoadOtherTreeServlet SQL注入

声明&#xff1a;本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动&#xff0c;将与本文档的作者或发布者无关。 一、漏洞描述 宏景HCM人力资源信息管理系统是一个全面的人力资源管理软件&#xff0c;它覆盖了人力资源管理的各个模块…

华为官方出品:《应用现代化实践指南》电子书,可免费下载

本期云享书库为各位开发者带来了应用现代化方面的技术内容。 在数字化时代&#xff0c;企业面临着前所未有的机遇与挑战。随着技术的飞速发展&#xff0c;特别是云计算、大数据、人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;的兴起&#xff0c;正…

Python爬虫速成之路(1):获取网页源代码

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

Threadlocal使用获取最后更新人信息

Threadlocal 的作用范围是一个线程&#xff0c;tomcat启动默认开启一个线程 首先点击登录&#xff0c;登录方法会返回token 拿到token后放在请求头中发送商品的插入请求&#xff0c;在插入是设置拿到token中的nickName&#xff08;花名&#xff09;放入&#xff08;lastUpdate…

windows系统长时间不用,无法唤醒

问题背景 在我们使用windows系统的时候&#xff0c;有这样一种情况&#xff0c;就是电脑长时间不不操作&#xff0c;就会“睡死”过去。此时再用鼠标键盘都无法将其唤醒。没办法只能长按电源键强制关机&#xff0c;再重启。那么该如何解决这种问题呢&#xff1f; 原因分析 系…

高可用hadoop分布式节点的扩容

解决方案 修改hdfs-site.xml 文件 原xml文件 <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text/xsl" href"configuration.xsl"?> <!--Licensed under the Apache License, Version 2.0 (th…

Python: 从 2.7 升级到 3,我比 vue 慢了一点点

小破站搜索云前端&#xff0c;查看视频版 2024 年 7 月 7 日&#xff0c;据一位长期的Python观察者爆料&#xff0c;Fedora 41 系统最终将停止支持 Python 2.7。这是Python 2系列的最后一个版本&#xff0c;Python 2.7在Fedora Linux 41中将被退役且不再替代。除了PyPy之外&…

利用【Python】【线性规划】优化工厂生产:实现智能资源配置与利润最大化的现代解决方案

目录 1. 问题背景和描述 1.1 问题背景 1.2 问题描述 2. 数学模型的建立 2.1决策变量 2.2 目标函数 2.3 约束条件 2.4 数学模型总结 3. 使用Python解决线性规划问题 3.1 导入必要的库 3.2 定义目标函数系数 3.3 定义不等式约束矩阵和向量 3.4 定义变量的边界 非负…

政安晨:【Keras机器学习示例演绎】(五十二)—— 使用门控残差和变量选择网络进行分类

目录 简介 数据集 安装准备 数据准备 定义数据集元数据 创建用于训练和评估的 tf.data.Dataset 创建模型输入 对输入特征进行编码 实施门控线性单元 实施门控余留网络 实施变量选择网络 创建门控残差和变量选择网络模型 编译、训练和评估模型 政安晨的个人主页&am…

OpenCV和PIL进行前景提取

摘要 在图像处理和分析中&#xff0c;前景提取是一项关键技术&#xff0c;尤其是在计算机视觉和模式识别领域。本文介绍了一种结合OpenCV和PIL库的方法&#xff0c;实现在批量处理图像时有效提取前景并保留原始图像的EXIF数据。具体步骤包括从指定文件夹中读取图像&#xff0c…

【链表】- 环形链表 II

1. 对应力扣题目连接 环形链表 II 2. 实现思路 a. 链表图示&#xff1a; b. 检测链表中是否存在环&#xff0c;即&#xff1a;会相交 思路&#xff1a; 使用 Floyd 的龟兔赛跑算法&#xff08;Floyd’s Tortoise and Hare algorithm&#xff09;&#xff0c;即快慢指针法&…

二分法求函数的零点 信友队

题目ID&#xff1a;15713 必做题 100分 时间限制: 1000ms 空间限制: 65536kB 题目描述 有函数&#xff1a;f(x) 已知f(1.5) > 0&#xff0c;f(2.4) < 0 且方程 f(x) 0 在区间 [1.5,2.4] 有且只有一个根&#xff0c;请用二分法求出该根。 输入格式 &#xff08;无…

Mysql查询近半年每个月有多少天

Mysql 查询近6个月每个月有多少天&#xff1a; SELECT DATE_FORMAT(DATE_ADD(NOW(),INTERVAL-(CAST( help_topic_id AS SIGNED INTEGER )) MONTH ), %Y-%m) as months,DAY(LAST_DAY(CONCAT(DATE_FORMAT(DATE_ADD(NOW(),INTERVAL-(CAST( help_topic_id AS SIGNED INTEGER )) MO…

开源软件项目的发展趋势与参与经验

目录 前言1. 开源项目的发展现状1.1 开源项目的快速增长1.2 企业对开源项目的重视 2. 开源社区的活跃度2.1 开源社区的多样性2.2 社区活动的丰富性 3. 开源项目在技术创新中的作用3.1 促进技术的快速迭代3.2 提供灵活的解决方案 4. 参与开源项目的经验和收获4.1 如何选择开源项…