【JavaSE】图书系统

目录

当我们学习完Java的语法后,可以写一个简单的项目进行总结梳理一下,这个项目也会用到我们所学过的Java所有的语法知识:目录是咱们用文件夹包装起来的类。

1.book

在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。

图书系统无非就是由使用者,工具,被使用者组成,谁被使用呢,无非就是图书,那图书又是存放在哪里呢,那就是书架,所以我们把书和书架可以归类为被使用者,用一个包来封装它们。

我们在进行下一步前先得学一个知识点,那就是类。

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干 啥),描述完成后计算机就可以识别了。

类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类 具有哪些功能,称为类的成员方法。

就比如一个洗衣机可以做类,里面成员有它的属性,也有它的功能

class WashMachine{public String brand;   // 品牌public String type;    // 型号public double weight;  // 重量public double length;  // 长public double width;  // 宽public double height;  // 高public String color;   // 颜色public void washClothes(){   // 洗衣服System.out.println("洗衣功能");}public void dryClothes(){    // 脱水System.out.println("脱水功能");}public void setTime(){       // 定时System.out.println("定时功能");}
}

当我们简单了解了一下类之后,接下来,咱们在这个包底下创建俩个类,名字分别是书和书架。


1.1Book

如下代码,我们先定义书的属性,名字,作者,价格,类型。这里的isBorrow是用来判断书是否被借出的标记变量。

下面的public Book是构造函数,就是当book被创建时,需要对这些变量进行初始化。

下面的所有方法都是对咱们的属性成员进行基本操作的方法,可以用快捷键一键生成,可以节约很多时间。

以下代码运用到的第一个知识点就是继承(往下滑会有简单描述)中的this。

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

package book;public class Book {private String name;private String author;private int price;private String tyle;private boolean isBorrow;public Book(String name, String author, int price, String tyle) {this.name = name;this.author = author;this.price = price;this.tyle = tyle;}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 getTyle() {return tyle;}public void setTyle(String tyle) {this.tyle = tyle;}public boolean isBorrow() {return isBorrow;}public void setBorrow(boolean borrow) {isBorrow = borrow;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + tyle + '\'' +((isBorrow == true) ? " 已经借出" : " 未被借出") +/*", isBorrowed=" + isBorrowed +*/'}';}
}

这里最后一个方法是重写方法,因为我们所有的类都默认继承Object类,toString是该类底下的一种方法,我们只需要对其进行重写即可使用这个方法,这里运用的了对isBorrow进行三目运算来判断书是否被借出。

继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。 例如:狗和猫都是动物,那么我们就可以将共性的内容进行抽取,然后采用继承的思想来达到共用。

1.2BookList

这里我们创建一个可以放十本书的书架,默认先放好三本书,下面方法同样是对我们的成员进行操作的方法。

package book;public class BookList {private Book[] books;private int useSize;public BookList() {this.books = new Book[10];//放好树!!this.books[0] = new Book("三国演义","罗贯中",10,"小说");this.books[1] = new Book("西游记","吴承恩",9,"小说");this.books[2] = new Book("红楼梦","曹雪芹",19,"小说");this.useSize = 3;}public int getUseSize() {return useSize;}public void setUseSize(int useSize) {this.useSize = useSize;}public Book getBooks(int pos) {return books[pos];}public Book setBooks(int pos, Book book) {return books[pos]=book;}public Book[] getBooks() {return books;}public void setBooks(Book[] books) {this.books = books;}
}

 

2.operation

这个包我们创建过来是为了把所有功能类分装在一起,以便后期的代码扩展性能更好地表达。

2.1AddOperattion

package operation;
import book.BookList;
import book.Book;
import java.util.Scanner;public class AddOperation implements IOPeration {@Overridepublic void work(BookList bookList) {System.out.println("新增图书!!!");Scanner sc=new Scanner(System.in);System.out.println("请输入书名:");String name=sc.nextLine();System.out.println("请输入作者:");String author=sc.nextLine();System.out.println("请输入类型:");String type=sc.nextLine();System.out.println("请输入价格");int price=sc.nextInt();Book book=new Book(name,author,price,type);int currentSize=bookList.getUseSize();for(int i=0;i<currentSize;i++){Book book1=bookList.getBooks(i);if(book1.getName().equals(name)){System.out.println("有这本书,不进行存放了!");return;}}if(bookList.getBooks().length==currentSize){System.out.println("书架满了!");}else{bookList.setBooks(currentSize,book);bookList.setUseSize(currentSize+1);}}
}

2.2BorrowOperation

package operation;import book.BookList;
import book.Book;
import java.util.Scanner;public class BorrowOperation implements IOPeration {@Overridepublic void work(BookList bookList) {System.out.println("借阅图书!!!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要借的图书:");String name = scanner.nextLine();int currentSize=bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book=bookList.getBooks(i);if(book.getName().equals(name)){book.setBorrow(true);System.out.println("借阅成功!");System.out.println(book);return;}}System.out.println("你借阅的图书不存在!!");}
}

2.3DelOperation

package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class DelOperation implements IOPeration {@Overridepublic void work(BookList bookList) {System.out.println("删除图书!!!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要删除的图书:");String name = scanner.nextLine();int pos=0;int currentSize=bookList.getUseSize();int i = 0;for (; i < currentSize; i++) {Book book=bookList.getBooks(i);if (book.getName().equals(name)) {pos=i;break;}}if(i==currentSize){System.out.println("没有你要删除的书!!");}for(;pos<currentSize-1;pos++){Book book=bookList.getBooks(pos);bookList.setBooks(pos,book);}bookList.setBooks(pos,null);bookList.setUseSize(currentSize-1);}
}

2.4ExitOperation

package operation;import book.BookList;public class ExitOperation implements IOPeration {@Overridepublic void work(BookList bookList) {System.out.println("退出图书!!!");System.exit(0);}
}

2.5FindOperation

package operation;import book.BookList;
import book.Book;
import java.util.Scanner;public class FindOperation implements IOPeration {@Overridepublic void work(BookList bookList) {System.out.println("查找图书!!!");Scanner sc=new Scanner(System.in);String name=sc.nextLine();int currentSize=bookList.getUseSize();for(int i=0;i<currentSize;i++){Book book=bookList.getBooks(i);if(book.getName().equals(name)){System.out.println("找到了这本书,信息如下:");return;}}System.out.println("没有找到这本书!");}
}

2.6IOperation

咱们这里用到了一个接口,可以让主其他类通过这个接口来链接所有功能类,只要其他被链接的类名+implements+接口名,然后重写接口的方法,在其中进行逻辑操作即可串接上这个类。

接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

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

2.7ReturnOperation

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class ReturnOperation implements IOPeration {@Overridepublic void work(BookList bookList) {System.out.println("归还图书!!!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要归还的图书:");String name = scanner.nextLine();int currentSize=bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book=bookList.getBooks(i);if(book.getName().equals(name)){book.setBorrow(false);System.out.println("归还成功!");System.out.println(book);return;}}System.out.println("你归还的图书不存在!!");}
}

2.8ShowOperation

package operation;
import book.Book;
import book.BookList;public class ShowOperation implements IOPeration {@Overridepublic void work(BookList bookList) {System.out.println("打印图书!!!");int currentSize = bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBooks(i);System.out.println(book);}}
}

3.user

这里我们的使用者分为俩类人:管理员和普通用户

这些人也用一个包集中起来,后续方便拓展。

3.1AdminUser

这里当我们帮助父类的构造方法时,需要运用到super关键字。

由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成 员时,该如何操作?直接访问是无法做到的,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。

package user;
import java.util.Scanner;
import operation.*;
public class AdminUser extends User {public AdminUser(String name) {super(name);this.ioPerations = new IOPeration[]{new ExitOperation(),new AddOperation(),new FindOperation(),new DelOperation(),new ShowOperation(),};}public int menu() {System.out.println("**********管理员用户*****");System.out.println("1. 查找图书");System.out.println("2. 新增图书");System.out.println("3. 删除图书");System.out.println("4. 显示图书");System.out.println("0. 退出系统");System.out.println("**********************");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作:");int choice = scanner.nextInt();return choice;}
}

3.2NormaUser

package user;
import book.BookList;
import operation.*;
import java.util.Scanner;public class NormaUser extends User {public NormaUser(String name) {super(name);this.ioPerations = new IOPeration[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation(),};}public int menu() {System.out.println("**********普通用户******");System.out.println("1. 查找图书");System.out.println("2. 借阅图书");System.out.println("3. 归还图书");System.out.println("0. 退出系统");System.out.println("**********************");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作:");int choice = scanner.nextInt();return choice;}}

4.Main

众所周知,每一个项目中都必须有个main函数操作整个项目,这里我们将main单独写一个类会更加方便,因为我们每次运行程序都会有些重复的代码。

import book.BookList;
import user.AdminUser;
import user.NormaUser;
import user.User;import java.util.Scanner;
public class Main {public static User login(){System.out.println("请输入你的姓名");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();System.out.print("请输入你的身份,1:管理员   2:普通用户->");int choice = scanner.nextInt();if(choice == 1){return new AdminUser(name);}else{return new NormaUser(name);}}public static void main(String[] args) {BookList bookList = new BookList();User user=login();while(true){int choice= user.menu();System.out.println("choice :"+ choice);user.doOperation(choice,bookList);}}
}

5.总结

在整个图书系统中我们有运用到许多知识,有数组,类和对象,继承,多态,接口,抽象类,还有一些比较灵活的算法,这就是我JavaSE中所学的知识结合起来做的一个小项目。

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

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

相关文章

k8s微服务

一 、什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f;需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。 借助Service&#xff0c;应用可以实现服务发现和负载均衡。 service默认只支持4层负载均…

斯坦福大学提出电影剧本可视化工具ScriptViz:能够根据剧本中的文本和对话自动检索相关的电影画面,帮助剧作家更好地构思和调整剧情

title:斯坦福大学提出电影剧本可视化工具ScriptViz&#xff1a;能够根据剧本中的文本和对话自动检索相关的电影画面&#xff0c;帮助剧作家更好地构思和调整剧情 斯坦福大学的研究者们开发了一个电影剧本可视化工具ScriptViz工具&#xff0c;ScriptViz的工作原理可以简单地理解…

基于java SpringBoot和Vue校园食堂网站管理系统设计

摘要 本文旨在探讨一种基于Java Spring Boot和Vue框架的校园食堂网站管理系统的设计。首先&#xff0c;介绍了系统开发的背景及意义&#xff0c;即为了提高校园食堂的管理效率和改善学生的就餐体验。接着&#xff0c;详细阐述了系统的技术选型&#xff0c;包括后端采用Spring …

vue+ElementUI—实现基础后台管理布局(sideBar+header+appMain)(附源码)

后台管理的模板很多&#xff0c;vue本身就提供了完整的vue-template-admin&#xff0c;vue-admin-beautiful等后台管理系统化框架&#xff0c;但是这些框架正是因为成体系而显得繁重。假如你想搭建一个静态的后台管理模板页面和几个单独的菜单页面&#xff0c;直接就上框架是否…

C#源码安装ZedGraph曲线显示组件

在软件开发里,数据的显示,已经是软件开发的大头。 如果让数据更加漂亮地、智能地显示,就是软件的核心价值了。 因为不管数据千万条,关键在于用户看到图。因为一个图表,就可以表示整个数据的趋势, 或者整个数据的走向,数据频度和密码。所以图表显示是软件的核心功能,比如…

【计网】从零开始理解UDP协议 --- 理解端口号和UDP结构

我依旧敢和生活顶撞&#xff0c; 敢在逆境里撒野&#xff0c; 直面生活的污水&#xff0c; 永远乐意为新一轮的月亮和日落欢呼。 --- 央视文案 --- 从零开始理解UDP协议 1 再谈端口号2 理解UDP 报头结构3 UDP 的特点4 UDP 的缓冲区5 UDP 使用注意事项 1 再谈端口号 之前我…

Ubuntu 24.04 在 BPI-F3 上通过 SD 卡安装并从 NVME 运行

github 代码&#xff1a; https://github.com/rcman/BPI-F3 Ubuntu 24.04 现在正在我的 BPI-F3 上运行。很快会为 YouTube 制作一个视频。 这应该适用于任何版本的 Linux&#xff0c;仅在 Ubuntu 24.04 上测试过 入门 下载 Bianbu映像并使用您最喜欢的工具将其映像到微型 SD 卡…

【win10】VMware Workstation 16安装win10专业版及安装VMware Tools操作说明

参考链接 VMware虚拟机安装win10系统教程&#xff08;巨细&#xff09;_vmware安装win10-CSDN博客https://blog.csdn.net/gdidea/article/details/129523700 win10专业版安装说明 下载win10安装包 百度网盘 链接: https://pan.baidu.com/s/1kf4ORdXYgcqwAz2j86LSZw?pwdk4…

MySQL-数据库的基础操作 o(´^`)o

文本目录&#xff1a; ❄️一、数据库操作&#xff1a; ☑ 1、查看所有的数据库&#xff1a; ☑ 2、创建数据库&#xff1a; ☑ 3、使用数据库&#xff1a; ☑ 4、删除数据库&#xff1a; ❄️二、常用的数据类型&#xff1a; ➷ 1、数值类型&#xff1a; ➷ 2、字符串类型&a…

【2D/3D-Lidar-SLAM】 Cartographer详细解读

【2D/3D-Lidar-SLAM】 Cartographer详细解读 1. 摘要2. Cartographer系统数据处理流程2.1. 数据获取&#xff08;Input Sensor Data&#xff09;2.2 姿态外推器&#xff08;PoseExtrapolator&#xff09;2.3 局部建图&#xff08;Local SLAM&#xff09; 3. 关键模块实现 3.1 局…

MyBatis XML映射文件

XML映射文件 XML映射文件的名称与Mapper接口名称一致&#xff0c;并且将XML映射文件和Mapper接口放置在相同包下&#xff08;同包同名&#xff09;XML映射文件的namespace属性为Mapper接口全限定名一致XML映射文件中SQL语句的id与Mapper接口中的方法名一致&#xff0c;并保持返…

某知名国企面试题

引言 金九银十&#xff0c;求职热潮再度来袭。最近&#xff0c;有位同学去一家知名国企应聘&#xff0c;回来后带回了一套面试题。这套面试题非常典型&#xff0c;其中包含了许多供应链金融方面的典型问题。这些问题很有分享的价值&#xff0c;大家也可以先自己独立思考一下&a…

Chromium cookies数据存储位置介绍c++

一、cookies数据库存储位置&#xff1a; C:\Users\Administrator\AppData\Local\Chromium\User Data\Default\Network\Cookies 二 、数据库操作类&#xff1a; net\extras\sqlite\sqlite_persistent_cookie_store.cc net\extras\sqlite\sqlite_persistent_cookie_store.h …

003 Springboot操作RabbitMQ

Springboot整合RabbitMQ 文章目录 Springboot整合RabbitMQ1.pom依赖2.yml配置3.配置队列、交换机方式一&#xff1a;直接通过配置类配置bean方式二&#xff1a;消息监听通过注解配置 4.编写消息监听发送测试5.其他类型交换机配置1.FanoutExchange2.TopicExchange3.HeadersExcha…

4D-fy: Text-to-4D Generation Using Hybrid Score Distillation Sampling技术路线

这篇文章分为四部分&#xff0c;首先从2021年的CLIP说起。 这篇论文的主要工作是提出了一种名为 CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09; 的模型&#xff0c;它通过自然语言监督学习视觉模型&#xff0c;以实现视觉任务的零样本&#xff08;zer…

20 Shell Script输入与输出

标出输入、标准输出、错误输出 一、程序的基本三个IO流 一&#xff09;文件描述符 ​ 任何程序在Linux系统中都有3个基本的文件描述符 ​ 比如: ​ cd/proc/$$/fd ​ 进入当前shell程序对于内核在文件系统的映射目录中: [rootlocalhost ~]# cd /proc/$$/fd [rootlocalhos…

Web集群服务-代理和负载均衡

1. 概述 1. 用户----->代理--->Web节点,后面只有一个节点,一般使用的是nginx代理功能即可 2. 后面如果是集群需要使用nginx负载均衡功能 2. 代理分类 代理分类方向应用正向代理用户(服务器)-->代理--->外部(某网站)服务器通过代理实现共享上网/访问公网反向代理用…

Linux:进程控制(三)——进程程序替换

目录 一、概念 二、使用 1.单进程程序替换 2.多进程程序替换 3.exec接口 4.execle 一、概念 背景 当前进程在运行的时候&#xff0c;所执行的代码来自于自己的源文件。使用fork创建子进程后&#xff0c;子进程执行的程序中代码内容和父进程是相同的&#xff0c;如果子进…

Python基础语法条件

注释 注释的作用 通过用自己熟悉的语言&#xff0c;在程序中对某些代码进行标注说明&#xff0c;这就是注释的作用&#xff0c;能够大大增强程序的可读性。 注释的分类及语法 注释分为两类&#xff1a;单行注释 和 多行注释。 单行注释 只能注释一行内容&#xff0c;语法如下…

跟着小土堆学习pytorch(一)——Dataset

文章目录 一、前言二、dataset三、代码展示 一、前言 pytorch也是鸽了很久了&#xff0c;确定了下&#xff0c;还是用小土堆的教程。 kaggle获取数据集 二、dataset dateset&#xff1a;数据集——提供一种方式去获取数据及其标签 如何获取数据及其标签以及总共多少个数据…