java基础的综合运用

news2024/12/27 10:40:08

文章目录

  • 前言
  • 一.类的设计
    • 书籍类
    • 书架类
    • 用户类
  • 二.行为的规范
    • 2.1 增加书籍
    • 2.2展示所有书籍
    • 2.3查找书籍
    • 2.4 删除书籍
    • 2.5 归还书籍
    • 2.6 借阅书籍
    • 2.7 退出系统
  • 三.测试类的方法
  • 四.项目的目录


前言

在我们学习完面向对象的知识之后,我们就要运用相关知识去实现一个图书管理系统,不要紧张,这个东西还是很简单的,我们一定要用面向对象的观点,去思考问题。其他的就没什么注意的了。


一.类的设计

书籍类

在这里插入图片描述

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;
    }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
//                ", isBorrowed=" + isBorrowed +
                (isBorrowed ?  "已经被借出" : "未被借出")+
                '}';
    }
}


书架类

在这里插入图片描述

package book;
//我们把书架看做一个对象,我们针对书架所看到的内容,我们会有对书架上的书有拿出来的操作和放回去的操作。
public class BookList {
    private  static final int DEFAULT_SIZE=10;
    private  Book[] books=new Book[DEFAULT_SIZE];//书架上默认可放书的数量
    private int usedSize;//记录当前的books数组有几本书
    //声明一个构造方法,在启动图书管理之前,我们就去初始化系统,初始化图书馆里系统后,里面就有几本书。
    public BookList(){
        books[0] = new Book("三国演义","罗贯中",89,"小说");
        books[1] = new Book("西游记","吴承恩",78,"小说");
        books[2] = new Book("红楼梦","曹雪芹",49,"小说");
        books[3]=new Book("七龙珠","鸟山明",89,"漫画");
        this.usedSize=4;
    }
    //下面就是我们针对书架的书的取操作和存操作
    public Book getBook(int pos){
        return this.books[pos];
    }
    public void setBook(Book book){
        this.books[usedSize]=book;
    }
    public void setBook(int pos,Book book){
        this.books[pos]=book;
    }
    public int getUsedSize() {

        return usedSize;
    }

用户类

在这里插入图片描述

package user;

import book.BookList;
import opera.IOPeration;

/*
针对用户来说,我们有不同的用户对象,也有不同的用户对象,也对应了不同的操作。
我们在接受到不同的用户对象的时候,我们就要去实现不同用户对象的动作。
因此我们就要存储不同用户对象的操作。
再根据不同用户的操作,进行不同的功能。
 */
public abstract class User {
    protected String name;
    protected IOPeration[] ioPerations;

    public User(String name) {
        this.name = name;
    }
    //用户类的打印菜单功能
    public  abstract  int menu();
    //根据不同的对象去调用不同的动作
    public void dowork(int choice, BookList bookList){
        this.ioPerations[choice].work(bookList);
    }

}
package user;

import opera.*;

import java.util.Scanner;
//我们在进入方法之前,用构造方法初始化。
public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        this.ioPerations=new IOPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation(),
        };
    }

    @Override
    public int menu() {
        System.out.println("****************************");
        System.out.println("hello "+name+" 欢迎来到图书小练习");
        System.out.println("1.查找图书!");
        System.out.println("2.新增图书!");
        System.out.println("3.删除图书!");
        System.out.println("4.显示图书!");
        System.out.println("0.退出系统!");
        System.out.println("****************************");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

package user;

import opera.*;

import java.util.Scanner;

public class NormalUser extends User {
        public  NormalUser(String name){
            super(name);
            this.ioPerations = new IOPeration[] {
                    new ExitOperation(),
                    new FindOperation(),
                    new BrrowOperation(),
                    new ReturnOperation(),
            };
        }
    @Override
    public int menu() {
        System.out.println("****************************");
        System.out.println("hello "+name+" 欢迎来到图书小练习");
        System.out.println("1.查找图书!");
        System.out.println("2.借阅图书!");
        System.out.println("3.归还图书!");
        System.out.println("0.退出系统!");
        System.out.println("****************************");
        System.out.println("请输入你的操作:");

        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

我来解释一下为什么要设计这几个类,我们设计Book这里就是用来表示一本书应该有的属性。设计一个书架类,书架可以放书,也有书架的操作,取书,存书,所以我们设计了一个类。
用户类的话,既然是一个系统就有普通用户身份和管理员身份。当然也有管理员身份的相关操作。

二.行为的规范

行为的规范,大家自然而然就想到的是接口,因为我们不同的管理员要做不同的操作,那么我们就要定好相应的规范,用一个接口去表明,让类去实现。
在这里插入图片描述
IOperation接口代码:

//对书架进行操作
public interface IOPeration {
    void work(BookList bookList);
}

我们进行下面所有的的操作,都是在实现IOperation的基础上进行的。你在进行以下的功能实现中,你只需要注意怎么去实现这个功能,不必在意其他的类是怎么写的,牢记面向对象的思想。


2.1 增加书籍

增加书籍,顾名思义我们是要往书架上放东西,在定义书架的时候,我们已经有了操作相关书架的方法,这个时候我们就要调用书架的相关方法去实现我们增加书籍的功能。
怎么去增加书籍呢?
1.首先遍历这个书架
2.判断书籍是否存在
3.如果不存在放入书籍
代码如下:

public class AddOperation implements IOPeration{
    public void work(BookList bookList) {
        System.out.println("新增图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入书名:");
        String name = scanner.nextLine();
        System.out.println("输入作者:");
        String author = scanner.nextLine();
        System.out.println("输入类型:");
        String type = scanner.nextLine();
        System.out.println("输入价格:");
        int price = scanner.nextInt();
        Book book = new Book(name,author,price,type);
        int currentSize=bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book tmp=bookList.getBook(i);
            if (tmp.getName().equals(name)) {
                System.out.println("书已经存在了,不能再放入了!");
                return;
            }
        }
        //书架的相关操作,放入书籍即可
        bookList.setBook(book);
        bookList.setUsedSize(currentSize+1);

    }

}

2.2展示所有书籍

这个东西也别想的太复杂,就跟遍历数组一样,遍历完结果,逐个打印出来即可。

public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBook(i);
            System.out.println(book);
        }
        System.out.println("打印所有图书!");
    }
}

2.3查找书籍

查找书籍,自然就是根据名字查找,当然这也别想的太复杂,具体的步骤如下:
1.遍历数据
2.逐个比对
3.查找成功

public class FindOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!");
        System.out.println("请输入书名!");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        //获取当前书的数量
        int currentSize=bookList.getUsedSize();
        //因为book数据是由private属性修饰的,因此我们要调用booklist里面要用的get和set方法
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(name)){
                System.out.println("找到了这本书!");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有这本书!");
    }
}

2.4 删除书籍

删除书籍,大家可能觉得有些麻烦,但是我说一句话你就明白了,好比我把书架上的书比作我们正在排队,突然你中间有一个人走了,你跟你后面的人都要向前挪动一步。换到这儿就是数组的删除,把后面的值赋值给前面,依次进行,当然还是少不了循环遍历。

public class DelOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {

        System.out.println("删除图书!");
        System.out.println("请输入你要删除图书的名字:");
        Scanner scanner =new Scanner(System.in);
        String name=scanner.nextLine();
        int currentSize=bookList.getUsedSize();
        int index=-1;
        for (int i = 0; i < currentSize; i++) {
            Book tmp=bookList.getBook(i);
                index=i;
                break;
        }
        //挪动数据
        for (int j = index; j < currentSize-1; j++) {
            Book book=bookList.getBook(j+1);
            bookList.setBook(j,book);
        }
        //修改size的值
        bookList.setUsedSize(currentSize-1);
        //因为删除的是对象,要把最后一个置为null
        bookList.setBook(currentSize-1,null);
        System.out.println("删除成功!");
    }
}

2.5 归还书籍

归还书籍,是个很简单操作,我们Book类的属性里面有一个借阅标志属性,所谓的归还,就是给书打上归还的标记。

public class ReturnOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书!");
        System.out.println("输入你要归还的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name) &&
                    book.isBorrowed()) {
                book.setBorrowed(false);
                System.out.println("归还成功");
                return;
            }
        }

    }

}

2.6 借阅书籍

借阅与归还很相似。

public class BrrowOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!");
        System.out.println("请输入你要借阅的图书");
        Scanner scanner =new Scanner(System.in);
        String name=scanner.nextLine();
        int currentSize=bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(name)
            && !book.isBorrowed()) {
                book.setBorrowed(true);
                System.out.println("借阅成功!");
                return;
            }

        }
    }
}

2.7 退出系统

我们这里退出系统就是退出控制台。

public class ExitOperation implements IOPeration{

    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统操作!");
        System.exit(0);
    }
}

三.测试类的方法

public class Main {
    //函数主入口
    public static User login(){
        System.out.println("请输入你的姓名");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        System.out.println("请输入你的身份:1 管理员 ,2 普通用户");
        int choice=scanner.nextInt();
        if(choice == 1) {
            return new AdminUser(name);
        }else {
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
        BookList bookList=new BookList();
        //向上转型
        User user=login();
        while (true) {
            int choice = user.menu();
            //根据 choice 和   user 来确定 我到底 调用哪个对象的哪个操作?
            user.dowork(choice, bookList);
        }
    }
        //根据 choice 和   user 来确定 我到底 调用哪个对象的哪个操作?

    }

四.项目的目录

我给大家看看我项目的目录,大家运用我的代码,也会更清晰一点。
在这里插入图片描述

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

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

相关文章

十六进制转Ascii脚本(包含\x处理)

目录 1.前言 2.十六进制转换脚本(包含处理\x) 1.前言 在以前玩CTF的时候,会遇到十六进制编码,特别是带\x的那种,网上虽然也有在线解密网站,但是对于\x解码不是特别友好。 2.十六进制转换脚本(包含处理\x&#

【Flink实时数仓】数据仓库项目实战 《四》日志数据分流 【DWD】

文章目录【Flink实时数仓】数据仓库项目实战 《四》日志数据分流-流量域 【DWD】1.流量域未经加工的事务事实表1.1主要任务1.1.1数据清洗&#xff08;ETL&#xff09;1.1.2新老访客状态标记修复1.1.3新老访客状态标记修复1.2图解1.3代码1.4数据测试1.4.1 测试脏数据1.4.2 测试e…

论文写作神器,SCI 写作必备

一、论文写作建议与英文句型积累/引用 1. Academic Phrasebank 网址&#xff1a; https://www.phrasebank.manchester.ac.uk/ Academic Phrasebank&#xff1a;从引言工作到结论提出了论文写作的详细建议&#xff0c;并在每个小点给出了海量的英语表达以供参考。是 SCI 新手…

linux red hat 8.0 搭建DNS服务

DNS简介&#xff1a; 简单的来说&#xff0c;DNS就是把域名和IP地址联系在一起的服务&#xff0c;有了DNS服务器&#xff0c;你就不用输入IP地址来访问一个网站&#xff0c;可以通过输入网址访问。 可以把DNS服务理解成网易有道词典&#xff0c;你去搜索一个英语单词&#xff0…

【MindStudio训练营第一期】【昇腾AI训练营新手班学习笔记】大作业

介绍 大作业&#xff1a;使用MindStudio成功复现昇腾社区中的MindX SDK应用案例 选题&#xff1a;黑白图像上色 https://www.hiascend.com/zh/developer/mindx-sdk/case-studies/d0c56d6f-a6f9-4b77-8587-db8272f22f3b 步骤 运行 使用MindStudio打开下载到的工程文件 创建d…

jsp+ssm计算机毕业设计大学新生军训管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

笔试强训(四十八)

目录一、选择题二、编程题2.1 左右最值最大差2.1.1 题目2.1.2 题解一、选择题 &#xff08;1&#xff09;常见的http错误描述原因错误的是&#xff08;D&#xff09; A.404-Not found B.302-临时重定向 C.500-内部服务错误 D.403-IP address rejected 403 Forbidden&#xff1…

Unity Animancer插件(三)运动

一、根运动 Animancer的根运动系统与原生的工作原理完全相同&#xff0c;但我们可以通过继承Transition类型或实现ITransition接口&#xff0c;来将额外的数据与动画绑定&#xff0c;从而更方便地控制根运动。 在下面这个示例中&#xff0c;我们通过自定义的Transition类实现…

jsp+ssm计算机毕业设计订单管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

Linux操作系统~信号处理的底层原理

目录 1.信号在内核中的表示 信号处理的方法 2.信号的递达&#xff0c;未决&#xff0c;阻塞 3.信号集操作函数 &#xff08;1&#xff09;.sigset_t&#xff08;信号集类型&#xff09; &#xff08;2&#xff09;.信号集函数 &#xff08;3&#xff09;.sigprocmask函数…

基于asp.net194校园火车票预订系统-计算机毕业设计

项目介绍 asp.net版火车票查询系统主要有用户注册&#xff0c;在线查询&#xff0c;在线订票&#xff0c;后台管理等功能。用户只有先注册才能登录火车票查询系统的首界面&#xff0c;然后可以进行在线查询、车票订购的功能。可对车次信息的查询和客户对已定车票信息的查询&am…

【云原生进阶之容器】第一章Docker核心技术1.6节——UnionFS

1 UnionFS综述 1.1 什么是 UnionFS 联合文件系统(Union File System),2004年由纽约州立大学开发,它可以把多个目录内容联合挂载到同一个目录下,而目录的物理位置是分开的。UnionFS可以把只读和可读写文件系统合并在一起,具有写时复制功能,允许只读文件系统的修改可以保…

二叉排序树详解及实现

二叉排序树详解及实现1.什么是二叉排序树2.二叉排序树的数据结构2.1二叉排序树的节点类型2.2二叉排序树中插入某个元素2.3 二叉排序树中按值查找元素2.4 找排序二叉树中的最小值2.5返回排序二叉树中ptr中序遍历的后续节点2.6 寻找排序二叉树中的最大值2.7 寻找二叉树中中序遍历…

《痞子衡嵌入式半月刊》 第 68 期

痞子衡嵌入式半月刊: 第 68 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :…

【分布式事务之spring实践】分布式事务选型实战

Spring中使用事务 Spring是一个伟大的框架&#xff0c;从一开始只是一个容器框架&#xff0c;到现在已经发展成为了一个包含企业开发中的方方面面的很多框架的总称。它不但从复杂度上&#xff0c;发展出了用于各个方面的子框架。它还从易用性出发&#xff0c;推出了像Spring-B…

多旅行商问题:世界杯优化算法(World Cup Optimization,WCO)求解多仓库多旅行商问题(提供Matlab代码)

一、世界杯优化算法 世界杯优化算法&#xff08;World Cup Optimization&#xff0c;WCO)由Navid Razmjooy等人于2016年提出&#xff0c;该算法模拟了国际足联世界杯比赛&#xff0c;思路新颖&#xff0c;收敛速度快&#xff0c;全局寻优能力强。 算法原理参考&#xff1a;智…

[附源码]Node.js计算机毕业设计河南美丽乡村旅游信息网Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

[附源码]Nodejs计算机毕业设计基于远程协作的汽车故障诊断系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

DevOps实战系列【第十四章-完结篇】:Jenkins Pipeline最佳实践案例

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 我们将之前的案例&#xff0c;使用流水线构建一下 搭建一个Jenkinsfile模型 pipeline {agent anystages {stage(拉取gitlab项目代码) {steps {echo "拉取git代码"}}stage(构建代码) {…

FRP进阶篇之解决方案

目录 一、前言 二、多客户端使用 1、场景 2、解决方案 3、使用 3.1、服务端配置 3.2、客户端配置 3.3、结果验证 三、dashboard 仪表盘使用 1、场景 2、解决方案 3、使用 4、验证 5、使用Java调用API接口获取设备列表 5.1、样例代码 5.2、结果验证 一、前言 通…