目录
前言
一、创作思路
二、搭建整体逻辑框架
2.1用户类的定义
2.2书籍类和书架的定义
2.3主函数的编写
2.4功能界面实现
2.5功能界面的调用
总结
前言
本文是在Java学习的过程中一次实战的过程,充分的体现了Java中类和对象的关系以及运用继承和多态来解决问题!这篇文章完全可以作为一个小课设,有需要的同学可以自取!文末放上源码!!
一、创作思路
对于一个刚刚开始的项目,肯定要有明确的思路才能够写出这个项目!接下来分析一下我的思路:
1.对于一个图书管理系统,分别会有管理员和用户(这里并未实现数据库,只是对JavaSE做一个小总结)这里就会产生用户类
2.确定使用的人,接下来就是图书的问题,首先需要有一个书籍类来描述一本图书,然后还需要有一个书架类来存放图书
3.上述两个问题都确定好了以后,就差图书管理的问题了,需要定义各种图书管理的类(增加类、删除类、借阅类、归还类等)
这里完全就是以我第一视角写的文章:所有的过程清清楚楚!!!
二、搭建整体逻辑框架
2.1用户类的定义
首先先定义一个用户类
public abstract class User {
protected String username;
public User(String username) {
this.username = username;
}
}
然后分别定义一个管理员类和普通用户类继承用户类(至于为什么要继承后面会说)
普通用户类:
public class NormalUser extends User{
public NormalUser(String username) {
super(username);
}
}
管理员类:
public class AdminUser extends User{
public AdminUser(String username) {
super(username);
}
}
用户类定义好了之后我们开始定义书籍类
2.2书籍类和书架的定义
这里我只定义了书名、作者、价格、类型、是否借出。根据实际的需要可以添加其他的。然后再去生成对应的set和get方法以及toString方法
public class Book {
private String bookName;
private String author;
private double price;
private String type;
private boolean isBorrow;
//boolean初始值是false这里就不将其加入构造方法了
public Book(String bookName, String author, double price, String type) {
this.bookName = bookName;
this.author = author;
this.price = price;
this.type = type;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isBorrow() {
return isBorrow;
}
public void setBorrow(boolean borrow) {
isBorrow = borrow;
}
@Override
public String toString() {
return "Book{" +
"bookName='" + bookName + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +","+
((isBorrow==true)?"已借出":"未借出") +
'}';
}
}
书有了之后,接下来就是放书的书架
public class BookRack {
private Book[] books = new Book[10];//书架最多存放的书,根据实际需求来
private int bookCount;//目前书架的书的数量
//初始化的时候书架就有三本书,根据自己的需求来
public BookRack(){
books[0] = new Book("三国演义","罗贯中",29.9,"小说");
books[1] = new Book("西游记","吴承恩",39.9,"小说");
books[2] = new Book("水浒传","施耐庵",19.9,"小说");
this.bookCount = 3;//将书架的书变为三
}
}
好的写到这里,基本就可以开始写主要的内容了
2.3主函数的编写
写完了大体的框架,接下来就是程序的入口了,首先需要一个登录的方法
public class Main {
public static void login(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = sc.nextLine();
System.out.println("请输入登录身份:1->管理员登录 0->用户登录");
int choice = sc.nextInt();
if(choice == 1){
System.out.println(name + " 管理员,欢迎您登录图书管理系统!");
}else{
System.out.println(name + " 用户,欢迎您登录图书管理系统!");
}
}
public static void main(String[] args) {
login();
}
}
好的写到这里我发现了一个问题,我压根就不知道到底是管理员还是用户登录!!!这里重点来了!!!那是不是我可以用一个对象接收一下?好,问题又来了,我这里会返回两个不同的对象,一个用户的一个管理员的那我到底返回谁呢?当然是返回父类对象了(这就是为什么要继承)!!!用一个向上提升就能完美解决这个问题,说干就干!马上对上面的代码进行修改
public class Main {
public static User login(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = sc.nextLine();
System.out.println("请输入登录身份:1->管理员登录 0->用户登录");
int choice = sc.nextInt();
if(choice == 1){
System.out.println(name + " 管理员,欢迎您登录图书管理系统!");
//选管理员我就返回管理员对象
return new AdminUser(name);
}else{
System.out.println(name + " 用户,欢迎您登录图书管理系统!");
//选用户我就返回用户对象
return new NormalUser(name);
}
}
public static void main(String[] args) {
User user = login();
}
}
通过对代码的修改,现在知道是哪个对象进行登录了,那接下来就是功能界面的实现
2.4功能界面实现
对于不同的用户应该有不同的功能界面这里不多说,根据实际需求来
管理员功能界面:
public class AdminUser extends User{
public AdminUser(String username) {
super(username);
}
@Override
public int menu() {
System.out.println("**************************************");
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 sc = new Scanner(System.in);
//我后面选了什么是不是要做一个记录?这样才能知道我选了哪个操作
int choice = sc.nextInt();
return choice;
}
}
用户功能界面:
public class NormalUser extends User{
public NormalUser(String username) {
super(username);
}
@Override
public int menu() {
System.out.println("**************************************");
System.out.println("*** 请输入您的操作: ***");
System.out.println("*** 1.查找图书 ***");
System.out.println("*** 2.借阅图书 ***");
System.out.println("*** 3.归还图书 ***");
System.out.println("*** 0.退出系统 ***");
System.out.println("**************************************");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
然后就需要通过对象对功能界面的方法进行调用
2.5功能界面的调用
这里通过父类对象去调用子类方法,是不是就是多态的思想!!!
public static void main(String[] args) {
User user = login();
//只要我还没有退出程序我就需要进行操作选择,所以这里需要写一个循环
while (true) {
int choice = user.menu();
}
}
好了写到这里出现问题了(当时我也一脸懵)?猛然发现!woc子类不重写父类方法根本就没法实现多态的条件,我父类竟然没有这个方法(这里不懂的,奖励看一下我主页的多态文章)!!!赶紧加上
public abstract class User {
protected String username;
IOperation[] iOperations;
public User(String username) {
this.username = username;
}
//因为这个方法不需要实现什么内容,直接给他抽象了
public abstract int menu();
}
好的写到这里可算是将整体的框架搭建完了!但是问题又来了!我选择了对应操作的数字,我怎么去调用对应的方法呢(大家可以积极思考一下)?那就涉及到了具体的操作内容了,一篇文章太长肯定是不想看的!欲知后事如何,请听下回分解!!!
总结
本文主要介绍了图书管理系统的前半部分(整体逻辑框架的搭建),以我第一视角来展示整个编程过程,你肯定可以看懂!看不懂你给我来两巴掌!!!