Java小项目谁看谁都会(图书管理)

article/2025/10/12 10:47:30

在我之前的几篇博客中对于Java语法,思想等等进行了总结,但是还是差点那味,就是没有将这些知识串起来那么今天的这篇博客我就将Java中:类 对象 封装 继承 多态 抽象类 接口等等知识共同使用完成一个Java的小项目一起来看

介绍

我们先来看看这个小项目都有什么功能

可以看到通过输入姓名和身份可以有不同的操作选择,增删查改呀之类的看起来挺简单的我们就来实现以下,我们来看一下所用到的类

知道了功能和类我们就来实现这个项目

实现

book包

在这个包中我们定义了两个类:Book和BookList分别来说以下

在Book类中我定义了书的名字,作者,类型,价格等成员变量,并且使用private修饰提供getset方法来体现封装,提供了构造方法,重写了toString方法方便进行打印,代码很简单看看就可以

package book;
public class Book {private String name;private String author;private int price;private String type;private boolean isBorrowed;public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public String getType() {return type;}public void setType(String type) {this.type = type;}public boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +(isBorrowed==false?" 未借出":" 已借出")+'}';}}

 在BookList中定义了书这个类的数组和有几本数的记录,构造方法中初始化了四本书,提供了关于数组操作和记录书的方法

package book;
public class BookList {private Book[] books=new Book[10];private int useSize=0;public BookList() {books[0] = new Book("三国演义", "罗贯中", 34, "小说");books[1]=new Book("西游记","吴承恩",25,"小说");books[2]=new Book("红楼梦","曹雪芹",32,"小说");books[3]=new Book("水浒传","施耐庵",45,"小说");this.useSize=4;}public int getUseSize() {return useSize;}public void setUseSize(int useSize) {this.useSize = useSize;}/*得到pos下标的书* */public Book getBook(int pos) {return books[pos];}/*设置一本书在pos位置* */public void setBook(int pos,Book book) {books[pos]=book;}
}

这里要说一下了为什么不把增删查改方法放到这里,是因为我想把方法单独提取出来易读便于后续的修改

User包

在这个包中定义了三个类父类User,子类AdminUser和子类NormalUser,主要是菜单的展示和实例化对应选择的对象

package user;import book.BookList;
import operation.IOperation;public abstract class User {protected String name;public User(String name){this.name=name;}protected IOperation[] iOperations;public abstract int menu();public void doOperation(int choice, BookList bookList) {iOperations[choice].work(bookList);}
}
package user;import operation.*;import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {super(name);iOperations=new IOperation[]{//初始化new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new DisplayOperation(),};}public int menu() {System.out.println("hello "+this.name+" 来到图书系统");System.out.println("1.查找图书");System.out.println("2.新增图书");System.out.println("3.删除图书");System.out.println("4.显示图书");System.out.println("0.退出系统");System.out.println("请选择你的操作");Scanner sca=new Scanner(System.in);int choice=sca.nextInt();return choice;}
}
package user;import operation.*;import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);iOperations=new IOperation[]{//初始化new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation(),};}public int menu() {System.out.println("hello "+this.name+" 来到图书系统");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("请选择你的操作");Scanner sca=new Scanner(System.in);int choice=sca.nextInt();return choice;}
}

 我们在父类中定义了接口数组,在子类中通过初始化用户对象不同使得数组内对象不同从而管理员和学生操作选择不同

 Operation包

在这个包中我实现了增删查改等的类通过接口调用不同类中方法

AddOperation

package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class AddOperation implements IOperation{public void work(BookList bookList) {System.out.println("新增图书");System.out.println("图书名字");Scanner sca=new Scanner(System.in);String name=sca.nextLine();System.out.println("图书作者");String author=sca.nextLine();System.out.println("图书类型");String type=sca.nextLine();System.out.println("图书价格");int price=sca.nextInt();Book book=new Book(name,author,price,type);int currentSize= bookList.getUseSize();bookList.setBook(currentSize,book);bookList.setUseSize(currentSize+1);System.out.println("新增成功");}
}

BorrowOperation

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowOperation implements IOperation{public void work(BookList bookList) {System.out.println("借阅图书");System.out.println("请输入要借阅的图书");Scanner sca=new Scanner(System.in);String bookName=sca.nextLine();int currentSize= bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book=bookList.getBook(i);if(book.getName().equals(bookName)) {book.setBorrowed(true);System.out.println("借阅成功");return;}}System.out.println("没有要借阅的书");}
}

DelOperation

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class DelOperation implements IOperation{public void work(BookList bookList) {System.out.println("删除图书");System.out.println("请输入要删除图书的名字");Scanner sca=new Scanner(System.in);String name=sca.nextLine();int currentSize= bookList.getUseSize();int index=0;int i = 0;for (; i <currentSize ; i++) {Book book=bookList.getBook(i);if(book.getName().equals(name)) {index=i;break;}}if(i==currentSize) {System.out.println("没有要删除的书");return ;}for (int j = index; j <currentSize ; j++) {Book book=bookList.getBook(j+1);bookList.setBook(j,book);}bookList.setBook(currentSize-1,null);bookList.setUseSize(currentSize-1);System.out.println("删除成功");}
}

DisPlayOperation

package operation;import book.Book;
import book.BookList;public class DisplayOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("显示图书");int currentSize= bookList.getUseSize();for (int i=0;i<currentSize;i++) {Book book=bookList.getBook(i);System.out.println(book);}}
}

 ExitOperation

package operation;import book.Book;
import book.BookList;public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出程序");int currentSize= bookList.getUseSize();for (int i=0;i<currentSize;i++) {bookList.setBook(i,null);}System.exit(0);}
}

 FindOperation

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOperation{public void work(BookList bookList) {System.out.println("查找图书");System.out.println("请输入要查找的图书");Scanner sca=new Scanner(System.in);String bookName=sca.nextLine();int currentSize= bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book=bookList.getBook(i);if(book.getName().equals(bookName)) {System.out.println("找到了信息如下");System.out.println(book);return;}}System.out.println("没有要找的书");}
}

 ReturnOperation

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class ReturnOperation implements IOperation{public void work(BookList bookList) {System.out.println("归还图书");System.out.println("请输入要归还的图书");Scanner sca=new Scanner(System.in);String bookName=sca.nextLine();int currentSize= bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book=bookList.getBook(i);if(book.getName().equals(bookName)) {book.setBorrowed(false);System.out.println("归还成功");return;}}System.out.println("没有要归还的书");}
}

 IOperation

package operation;import book.BookList;public interface IOperation {void work(BookList bookList);
}

Main类

主函数实现了login()方法能够根据方法返回值确定用户身份,在循环中只要不选择退出循环就会一直执行

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User login() {System.out.println("请输入姓名");Scanner sca=new Scanner(System.in);String name=sca.nextLine();System.out.println("请输入身份:1.管理员 0.学生");int choice=sca.nextInt();if(choice==1) {return new AdminUser(name);} else {return new NormalUser(name);}}public static void main(String[] args) {BookList books=new BookList();User user=login();while(true) {int choice=user.menu();user.doOperation(choice,books);}}
}

难点

个人感觉这个程序最难的点在于这里

我画图分析一下

以上就是实现这个小项目的所有代码了,觉得不理解的可以把代码拷贝下来自己跑一下,对于新手练习我觉得是非常好的项目,还请点赞评论!!!会持续更新Java知识的 蟹蟹

 


http://chatgpt.dhexx.cn/article/KbWyDhii.shtml

相关文章

推荐几个适合新手的Java练手项目(好玩又有趣)

Java练手项目第一波 一、坦克大战 链接&#xff1a;https://www.bilibili.com/video/BV1zP4y1b7gw/?spm_id_from333.337.search-card.all.click Java练手小项目&#xff0c;熟练掌握面向对象编程思想、对象池的使用、IO流、多线程、GUI等基础。 二、贪吃蛇 链接&#xff1a;ht…

10个优质的Java练手项目

10个优质的Java练手项目 最近有很多小伙伴私信我说推荐几个毕设项目&#xff0c;还有就是学了Java有一段时间了&#xff0c;想找几个项目想练练手&#xff0c;在面试的时候也可以增加一点项目经验。 在这里我收集了10个可以直接导入运行的项目。 由简单到复杂&#xff0c;分别…

JAVA小项目(一)——一个简单的记帐本【轻松入门,附源码】

目录 1. 实现效果 2.项目架构 3. 细节代码实现 &#x1f31e;哈喽&#xff0c;大家好丫&#xff0c;你们的小郭子又来啦 ~ &#x1f31e;今天我们用java来写一个简单的小项目——【记账本】&#xff0c;嘿嘿 话不多说&#xff0c;直接上干货&#xff0c; 1. 实现效果 2.项目…

【目标定位】基于matlab TDOA GPS混合定位【含Matlab源码 2310期】

⛄一、基于粒子滤波污染源定位简介 1 混合定位的系统结构 本文提出的GPS/TDOA混合定位系统结构可见于图1。 移动终端集成了无线通信模块和GPS接收模块,终端可同时测得通信网络中相对于服务基站的TDOA和GPS卫星到终端的伪距。在CDMA通信系统中,从通信终端测量TDOA的具体方法和…

基于图像的目标检测与定位方法概述

目录 1. 目标检测与定位概念2. 目标检测与定位方法2.1 传统目标检测流程2.2 two-stage检测算法2.2.1 R-CNN2.2.2 two-stage其他算法2.2.2.1 Spatial Pyramid Pooling&#xff08;空间金字塔池化&#xff09;2.2.2.2 Fast-RCNN2.2.2.3 P11 Faster RCNN 2.3 One-Stage2.3.1 YOLO2…

大疆无人机实现目标定位

大疆无人机实现目标定位 大疆无人机回传的实时视频可以帮助飞友观察发现美景&#xff0c;就称为目标吧&#xff0c;你偏偏对目标很感兴趣&#xff0c;迫切想知道目标的位置&#xff0c;最好是经纬度坐标。你查找大疆Document&#xff0c;欣喜地发现大疆提供了定位机体本身的定…

2-基于单目视觉的目标定位

1-四种坐标系描述 一、世界坐标系 客观三维世界的绝对坐标系&#xff0c;也称客观世界坐标系&#xff0c;是以目标为原点建立起来的坐标系。 二、摄像机坐标系 摄像机坐标系是以摄像机的光心作为坐标系的原点&#xff0c;&#xff3a;c&#xff0e;轴与光轴重合&#xff0c;并…

复杂情况下,目标区域定位

复杂情况下&#xff0c;基于halcon的目标区域定位 原始图源代码处理结果 原始图 源代码 dev_close_window () read_image (Image, E:/Halcon_Learn/黑块提取_网络/1.bmp) get_image_size (Image, Width, Height) dev_open_window_fit_size (0, 0, Width, Height, -1, -1, Wind…

目标检测_精确定位_2020

Side-Aware Boundary Localization for More Precise Object Detection 论文&#xff1a;https://arxiv.org/pdf/1912.04260.pdf 代码&#xff1a; 关键文章&#xff1a;Faster R-CNN [37], RetinaNet [25], and Cascade R-CNN 提出问题&#xff1a; 传统的基于锚点和大小…

Opencv中关于特征点匹配定位的问题(二)单目标和多目标定位

单目标和多目标定位 单目标定位多目标定位 单目标定位 在opencv官方提供了一种定位的思路&#xff0c;就是通过匹配的点来获取透视变换矩阵&#xff0c;然后经过透视变换后就能够获得对应的目标的坐标了。 import cv2 import numpy as np# 打开两个文件 img1 cv2.imread(321…

目标定位和检测系列(1):一些基本概念

最近开始学习深度学习中的定位和检测任务。本来打算直接看论文&#xff0c;却发现文章中的的很多基本概念都搞不清楚&#xff0c;于是就自己先梳理了一些定位和检测任务的基本概念。&#xff08;内容主要来自斯坦福大学的CS231课程、吴恩达的deeplearning.ai卷积部分&#xff0…

OpenCV技巧篇——多目标视觉定位(以飞镖定位为例)

OpenCV技巧篇【1】——多目标视觉定位&#xff08;以飞镖定位为例&#xff09; 1、针对问题 多目标视觉定位是指通过计算机视觉技术对一张图片中的多个目标进行识别和定位的过程。本篇将以对飞镖定位为例&#xff0c;提出一个简单有效的多目标定位技巧&#xff0c;最终实现如…

目标定位算法(二)之基于测距的定位算法

文章目录 基于测距的定位算法1.最小二乘原理2.最小二乘定位算法3.基于RSSI测距的定位算法4.基于TOA/TDOA的目标定位算法1&#xff09;基于TOA测距2&#xff09;基于TDOA测距 基于测距的定位算法 非测距的定位算法往往误差较大&#xff0c;提高精度往往依赖于密集的观测站部署。…

YOLO v5与双目测距结合,实现目标的识别和定位测距

YOLO v5与双目测距结合&#xff0c;实现目标的识别和定位测距 1、首先安装YOLO v52、数据集的标定3、双目测距代码的单独运行调试4、YOLO v5与双目测距的代码的结合5、最终识别测距效果6、代码下载调试运行7、最终演示视频欢迎各位点赞投币收藏哦&#x1f923;&#x1f923;&am…

单目视觉的运动目标跟踪定位

[转] http://www.leiphone.com/news/201704/z87wjT8j9s94tMnG.html 市场上空间定位的技术方案分为单目、双目以及激光雷达三大阵营&#xff0c;其中激光雷达由于成本高昂市场接受度较低&#xff0c;而在都是基于计算机视觉的单目和双目中&#xff0c;双目则显得更受欢迎。在国内…

目标定位

声明&#xff1a;本文引用吴恩达教授的DeepLearning课程内容。 图像分类&#xff1a;图片分类问题并不陌生&#xff0c;例如&#xff0c;输入一张图片到多层卷积神经网络。这就是卷积神经网络&#xff0c;它会输出一个特征向量&#xff0c;并反馈给 softmax 单元来预测图片类型…

目标定位与检测

学习笔记仅用作自己复习 https://b23.tv/JAqvgA Object Recognition Object Detection Object Localization 位置表示&#xff0c;x,y中心点坐标&#xff0c;w宽度,h高度&#xff0c;就可以得到矩形框的范围。&#xff08;先找中心点再得到矩形框&#xff09; 黄色全连接层是…

定位目标地理位置

获取目标地理位置 一、GPS简介及分布二、定位工具&#xff1a;Seeker三、反向代理&#xff1a;Ngrok四、实战&#xff1a;获取目标地理位置1.运行 seeker2.上传 ngrok3.短链接伪装4.转发链接 一、GPS简介及分布 物理位置定位&#xff1a;根据P的定位不准确&#xff0c;容易被欺…

目标定位算法(四)之移动目标定位算法

文章目录 移动目标定位算法1.移动目标计算机仿真建模2.基于距离观测的运动目标定位3.纯方位角的运动目标定位 移动目标定位算法 实时探测目标并对目标进行实时定位。 1.移动目标计算机仿真建模 假定目标做匀速直线运动&#xff0c;第i个观测站的位置为(x,y)&#xff0c;目标…

目标定位跟踪系统概述

一、观测系统&#xff1a;目标、观测站、坐标系。 观测站如雷达、声纳等传感器。坐标系&#xff1a;二维、三维直角坐标系&#xff08;描述确定位置&#xff09;&#xff1b;极坐标系&#xff08;r,cita&#xff09;、球坐标系(r,cita,fai)&#xff08;利用角度描述位置&#x…