基于Java零基础实现《学生成绩管理系统》的简单小项目
声明:由于本人基础薄弱,最近在恶补Java语言能力,故利用这些小项目练习Java基础能力,Java大佬请绕行,当然也可以给点建议再走;
这个小程序涉及到了以下知识点:
- Java基础知识
- 队列《数据结构》
- 单例模式“双检锁/双重校验锁(DCL,即 double-checked locking)”
废话不多说,来给大家看看运行的效果吧!
首先会获取班级人数
知识点:这个也就是队列的最大容量
然后会显示信息菜单操作,这一步很简单的。
因为队列中没有数据存在的原因,我们先选择“a(add):添加学生成绩信息”。
最后我们可以查看信息的显示。
接下来我们来显示项目的创建吧!本人默认正在看博客的你会用“IDEA”创建项目工程的,所以怎么新建工程我就不讲了。这个项目一共就涉及三个类“ArrayQueue”、“Student”、“ArrayQueueDome”
ArrayQueue类(用队列来存储学生成绩信息)
//使用数组模拟队列-编写一个ArrayQueue类
public class ArrayQueue {
private int maxSize;//表示数组的最大容量
private int front;//队列头
private int rear;//队列尾
private Student[] arr;//该数据用于存放数据,模拟队列
//创建队列的构造器
public ArrayQueue(int arrMaxSize){
maxSize=arrMaxSize;
arr=new Student[maxSize];
front=-1;//指向队列头部,分析出from是指向队列头的前一个位置
rear=-1;//指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
}
//判断对列是否满
public boolean isFull(){
return rear==maxSize-1;
}
//判断对列是否为空
public boolean isEmpty(){
return rear==front;
}
//添加数据到对列
public void addQueue(Student student){
//判断对列是否满
if (isFull()){
System.out.println("对列满,不能加入数据~");
return;
}
rear++;//让rear后移
arr[rear]=student;
}
//获取对列的数据,出队列
public Student getQueue(){
//判断队列是否空
if(isEmpty()){
//通过抛出异常
throw new RuntimeException("队列空,不能取数据~~~");
}
System.out.println("姓名\t\t年龄\t\t学号\t\t语文\t\t数学\t\t英语\t\t综合");
front++;//front后移
return arr[front];
}
//显示对列的所有数据
public void showQueue(){
//遍历
if(isEmpty()){
System.out.println("队列空的,没有数据~~");
return;
}
System.out.println("姓名\t\t年龄\t\t学号\t\t语文\t\t数学\t\t英语\t\t综合");
for (int i=0;i<arr.length;i++){
if (arr[i]!=null){
System.out.println(arr[i]);
}
}
}
//显示对列的头数据,注意不是取出数据
public Student headQueue(){
//判断
if (isEmpty()){
throw new RuntimeException("队列空的,没有数据~~");
}
System.out.println("姓名\t\t年龄\t\t学号\t\t语文\t\t数学\t\t英语\t\t综合");
return arr[front+1];
}
}
Student类(用来构建学生对象,涉及到了单例模式,可以着重看一下)
public class Student {
private String name;
private int age;
private int id;
private double ChinsesGrade;//语文成绩
private double MathGrade;//数学成绩
private double EnglishGrade;//英语成绩
private double OverallBandScore;//综合成绩
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;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getChinsesGrade() {
return ChinsesGrade;
}
public void setChinsesGrade(double chinsesGrade) {
ChinsesGrade = chinsesGrade;
}
public double getMathGrade() {
return MathGrade;
}
public void setMathGrade(double mathGrade) {
MathGrade = mathGrade;
}
public double getEnglishGrade() {
return EnglishGrade;
}
public void setEnglishGrade(double englishGrade) {
EnglishGrade = englishGrade;
}
public double getOverallBandScore() {
return OverallBandScore;
}
public void setOverallBandScore(double overallBandScore) {
OverallBandScore = overallBandScore;
}
public static void setStudent(Student student) {
Student.student = student;
}
public void setOverallBandScore(int overallBandScore) {
OverallBandScore = overallBandScore;
}
/**双重校验锁(DCL,即 double-checked locking)
*JDK 版本:JDK1.5 起
*是否 Lazy 初始化:是
*是否多线程安全:是
*实现难度:较复杂
*描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
*getInstance() 的性能对应用程序很关键。
*/
//采用volatile修饰 这里会涉及到面试的问题,可以看文章最后的面试问题
private volatile static Student student;
private Student(String name,int age,int id,double ChineseGrade,double MathGrade,double EnglishGrade,double OverallBandScore){
this.name=name;
this.age=age;
this.id=id;
this.ChinsesGrade=ChineseGrade;
this.MathGrade=MathGrade;
this.EnglishGrade=EnglishGrade;
this.OverallBandScore=OverallBandScore;
}
public static Student getStudent(String name,int age,int id,double ChineseGrade,double MathGrade,double EnglishGrade,double OverallBandScore) {
if (student==null){
synchronized (Student.class){
if (student==null){
student=new Student(name,age,id,ChineseGrade,MathGrade,EnglishGrade,OverallBandScore);
}
}
}
return student;
}
//以上都是单例实例
//为了打印学生信息美观,重写toString()方法
@Override
public String toString() {
return name + '\t' +age + '\t' +id + '\t' +ChinsesGrade + '\t' +MathGrade + '\t' +EnglishGrade + '\t' + OverallBandScore ;
// return "Student{" +
// "name='" + name + '\'' +
// ", age=" + age +
// ", id=" + id +
// ", ChinsesGrade=" + ChinsesGrade +
// ", MathGrade=" + MathGrade +
// ", EnglishGrade=" + EnglishGrade +
// ", OverallBandScore=" + OverallBandScore +
// '}';
}
}
ArrayQueueDome类(涉及到Scanner、swtch)
import java.util.Scanner;
public class ArrayQueueDome {
public static void main(String[] args) {
Scanner scanner= new Scanner(System.in);
//测试一把
//创建一个队列
String name;
int age;
int id;
double ChinsesGrade;
double MathGrade;
double EnglishGrade;
double OverallBandScore;
System.out.println("请输入班级人数:");
int StuNum=scanner.nextInt();
ArrayQueue arrayQueue=new ArrayQueue(StuNum);
char key= ' ';//接受用户输入
boolean loop=true;
//输出一个菜单
while(loop){
System.out.println("s(show):显示学生信息");
System.out.println("e(exit):退出学生成绩管理系统");
System.out.println("a(add):添加学生成绩信息");
System.out.println("g(get):查询学生成绩信息");
System.out.println("h(head):查看第一名学生");
key=scanner.next().charAt(0);//接受一个字符
switch (key){
case 's':
arrayQueue.showQueue();
break;
case 'e':
System.exit(0);
case 'a':
System.out.println("请输入姓名:");
name=scanner.next();
System.out.println("请输入年龄:");
age= scanner.nextInt();
System.out.println("请输入学号:");
id=scanner.nextInt();
System.out.println("请输入语文成绩:");
ChinsesGrade=scanner.nextDouble();
System.out.println("请输入数学成绩:");
MathGrade=scanner.nextDouble();
System.out.println("请输入英语成绩:");
EnglishGrade=scanner.nextDouble();
System.out.println("请输入综合成绩:");
OverallBandScore=scanner.nextDouble();
arrayQueue.addQueue(Student.getStudent(name,age,id,ChinsesGrade,MathGrade,EnglishGrade,OverallBandScore));
break;
case 'g':
try {
Student res=arrayQueue.getQueue();
System.out.println(res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'h':
try {
Student res=arrayQueue.headQueue();
System.out.println(res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
default:
break;
}
}
}
}
Java面试会出的几个面试题:
- Java并发这块了解的怎么样?说说你对volatile关键字的理解。
- 就我理解的而言,被volatile修饰的共享变量,就具有了以下两点特性:
- 1. 保证了不同线程对该变量操作的内存可见性;
- 2. 禁止指令重排序
- 就我理解的而言,被volatile修饰的共享变量,就具有了以下两点特性:
- 能不能详细说下什么是内存可见性,什么又是重排序呢?
- 那你具体说说这三个特性呢?
- volatile关键字如何满足并发编程的三大特性的?
- volatile的两点内存语义能保证可见性和有序性,但是能保证原子性吗?
以上volatile的面试问题都是我白嫖的(我这个小白可不会这么多)如果你对这些问题也一脸懵逼,你可以看一下大神对volatile的见解“面试官最爱的volatile关键字”
- 你知道单例模式吗?(单例模式特点(什么是单例模式)?)
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
- 单例模式的作用(用单例模式的目的)?
- Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
- 一般Singleton模式通常有几种种形式:
- 这个我就不回答了,感兴趣的童鞋可以自己去查询一下资料
注意:不出意外的话,这几天我会再写一篇《学生成绩管理系统》涉及到的知识点有算法排序,感兴趣的童鞋,可以关注一下。
我是Java小白,我们一起努力学Java吧!(我是2020年07月28日正式开始学习Java语言的,目标四个月后可以实现“北漂”的梦)。
项目源代码获取我会发在评论区里,我建议像我一样基础不好的童鞋可以自己动手敲一遍!!!