一、前言
面向对象这一块也要结束了,不知道读者们掌握的如何呢。不过面向对象的路程远不止于此,可以利用面向对象来做一些小型的系统来巩固一下。接下来就进入新的章节了,回顾一下这已经是第五天了,之前说的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
对象:s1
、s2
和s3
。 - 每个学生对象都使用
Students
类的构造方法进行初始化,分别传入学生的ID、姓名和年龄信息。
将学生对象添加到数组中:
s[0] = s1; s[1] = s2; s[2] = s3;
- 这三行代码将之前创建的
Students
对象分别赋值给数组s
的第 0、1、2 个位置。 - 现在,数组
s
包含了三个学生对象,分别是s1
、s2
和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;}
}