Java小练习——图书管理系统

2023-11-13

目录

一、图书管理系统应具备的功能

二、简单分析如何实现该系统

三、框架图

​四、代码实现过程及简析

1、Book类

简析:

2、BookShelf类

简析:

3、IOperation接口

3.1  AddOperation类

3.2  BorrowOperation类

3.3  DeleteOperation类

3.4  DisplayOperation类

3.5  ExitOperation类

3.6  ReturnOperation类

3.7  SearchOperation类

4、User类

简析:

5、AdminUser类

简析:

6、NormalUser类

简析:

7、Main类

简析:


一、图书管理系统应具备的功能

1、图书管理系统有两种用户:管理员普通用户

2、两种用户所具有的功能列表不一样:

管理员的功能:查找图书、新增图书、删除图书、显示图书、退出系统。

普通用户的功能:查找图书、借阅图书、归还图书、退出系统。

二、简单分析如何实现该系统

1、图书肯定有很多种,而每种图书都有书名、作者、类型等属性,那么我们就可以把图书抽象为一个类——Book

2、我们可以创建一个Book类类型的数组,用于存放系统中的每一种图书;

3、上面创建的数组我们可以把它存放在一个书架类——BookShelf中,并且在BookShelf类中实现一些对数组进行基本操作的方法,比如获取数组中的某个元素,设置数组中的某个元素等等;

4、系统有两种用户,而两种用户的功能不同,我们可以把它们分别抽象为一个类,因为每种用户的功能不一样,那么我们可以再给它们创造一个共同的父类——User类,通过重写父类的方法和向上转型,就可以为两种用户提供不同的功能;

5、每种功能如何具体实现呢?我们可以创建一个接口——Operation,接口中写一个work()方法,而每种功能可以抽象为一个类,这些类只要实现了这个接口并重写其中的work()方法,那么在之后调用时就会很方便。

6、最后在main()函数中写一个登录方法——login(),并把相关操作放入到一个while循环中即可。

三、框架图

四、代码实现过程及简析

1、Book

package Book;
public class Book {
    private String bookName;   //书名
    private String authorName; //作者
    private String type;       //类型
    private int quantity;      //数量

    //构造方法
    public Book(String bookName, String authorName, String type, int quantity) {
        this.bookName = bookName;
        this.authorName = authorName;
        this.type = type;
        this.quantity = quantity;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthorName() {
        return authorName;
    }

    public void setAuthorName(String authorName) {
        this.authorName = authorName;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    @Override
    public String toString() {
        return "Book{" +
                "书名《" + bookName + "》" +
                "作者:" + authorName +
                ", 类型:" + type +
                ", 图书数量:" + quantity +
                ", 是否可借阅:" + ((quantity > 0)?
                ("可以借阅"):("图书数量不足,无法借阅")) +
                '}';
    }
}

简析:

Book类中有图书的书名、作者、类型、数量这些基本属性和相对应的get、set方法,以及Book类的构造方法toString方法,构造方法用于实现之后的新增图书功能,toString方法用于实现之后的显示图书信息和查找图书功能

2、BookShelf

package Book;
public class BookShelf {
    private Book[] books = new Book[10];
    private int kindOfBooks ;//当前书架中图书的种类

    public BookShelf(){
        books[0] = new Book("西游记","吴承恩","小说",2);
        books[1] = new Book("红楼梦","曹雪芹","小说",5);
        books[2] = new Book("水浒传","施耐庵","小说",1);
        books[3] = new Book("三国演义","罗贯中","小说",10);
        kindOfBooks = 4;
    }

    //获取当前图书种类
    public int getKindOfBooks() {
        return kindOfBooks;
    }
    //设置当前图数种类
    public void setKindOfBooks(int kindOfBooks) {
        this.kindOfBooks = kindOfBooks;
    }

    //获取当前位置的图书
    public Book getBook(int local){
        return books[local];
    }

    //设置当前位置的图书
    public void setBook(int local, Book book){
        books[local] = book;
    }

    //删除当前位置的图书
    public void delBook(int ret) {
        books[ret] = books[ret + 1];
    }
}

简析:

BookShelf类中我们给了两个成员变量,一个是book类类型的数组,用于存储每一种图书,另一个是获取当前图书种类的一个int类型变量,并给出了相应的get、set方法(一些方法稍作修改)和一个无参的构造方法,在这个构造方法中我们给数组初始化了4个元素,只要实例化一个BookShelf类的对象,我们的书架中就会有这四本书。

3、IOperation接口

package Operation;

import Book.BookShelf;

public interface IOperation {
    void work(BookShelf bookShelf);
}

简析:接口中只有一个抽象方法work(),它的参数是一个Bookshelf类的对象。

3.1  AddOperation类

package Operation;

import Book.Book;
import Book.BookShelf;

import java.util.Scanner;

public class AddOperation implements IOperation{
    @Override
    public void work(BookShelf bookShelf) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要新增的图书名:");
        String newBookName = scanner.nextLine();
        System.out.println("请输入图书的作者:");
        String authorName = scanner.nextLine();
        System.out.println("请输入图书类型");
        String bookType = scanner.nextLine();
        System.out.println("请输入新增图书数量");
        int bookQuantity = scanner.nextInt();

        //如果新增的图书是系统中已有的图书,那么只需增加图书数量即可
        int ret = bookShelf.getKindOfBooks();//获取当前图书种类
        for (int i = 0; i < ret ; i++) {     //遍历书架中的图书
            String str = bookShelf.getBook(i).getBookName();//获取当前图书的书名
            if(str.equals(newBookName)){
                int quantity = bookShelf.getBook(i).getQuantity();//获取当前图书的数量
                bookShelf.getBook(i).setQuantity(quantity+bookQuantity);//更新当前图书的数量
                System.out.println("新增图书成功");
                return;
            }
        }

        //如果新增的图书是系统中没有的图书:
        bookShelf.setBook(ret,new Book(newBookName,authorName,bookType,bookQuantity));
        bookShelf.setKindOfBooks(ret+1);//不要忘记更新图书种类
        System.out.println("新增图书成功");
    }
}

3.2  BorrowOperation

package Operation;

import Book.BookShelf;

import java.util.Scanner;

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookShelf bookShelf) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要借阅的图书名:");
        String name = scanner.nextLine();
        
        int ret = bookShelf.getKindOfBooks();//获取当前图书种类
        for (int i = 0; i < ret ; i++) {     //遍历书架中的图书
            String str = bookShelf.getBook(i).getBookName();  //获取当前图书的书名
            int quantity = bookShelf.getBook(i).getQuantity();//获取当前图书的数量
            if(str.equals(name) && quantity > 0){             //书名相同,并且数量足够才可以借阅
                bookShelf.getBook(i).setQuantity(quantity - 1);//更新当前图书的数量
                System.out.println("借阅图书成功");
                return;
            }
            if(quantity <= 0) {
                System.out.println("图书数量不足,借阅失败");
                return;
            }
        }
        System.out.println("找不到这本书,借阅失败");
    }
}

3.3  DeleteOperation

package Operation;

import Book.Book;
import Book.BookShelf;

import java.util.Scanner;
public class DeleteOperation implements IOperation {
    @Override
    public void work(BookShelf bookShelf) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要删除的图书名:");
        String newBookName = scanner.nextLine();

        int ret = bookShelf.getKindOfBooks();//获取当前图书种类
        for (int i = 0; i < ret ; i++) {     //遍历书架中的图书
            String str = bookShelf.getBook(i).getBookName();//获取当前图书的书名
            if(str.equals(newBookName)){
                for (int j = i; j < ret; j++) {
                    bookShelf.delBook(j);
                }
                bookShelf.setKindOfBooks(ret-1);//不要忘记更新图书种类
                System.out.println("删除图书成功");
                return;
            }
        }
        System.out.println("系统中没有这本书,删除图书失败");
    }
}

3.4  DisplayOperation

package Operation;

import Book.Book;
import Book.BookShelf;

public class DisplayOperation implements IOperation{
    @Override
    public void work(BookShelf bookShelf) {
        System.out.println("当前系统中图书信息如下:");
        int ret = bookShelf.getKindOfBooks();//获取当前图书种类
        for (int i = 0; i < ret ; i++) {     //遍历书架中的图书
            System.out.println(bookShelf.getBook(i).toString());//打印图书信息
        }
    }
}

3.5  ExitOperation

package Operation;

import Book.BookShelf;

public class ExitOperation implements IOperation{
    @Override
    public void work(BookShelf bookShelf) {
        System.out.println("退出系统");
        System.exit(0);//给个参数0,表示程序正常结束
    }
}

3.6  ReturnOperation

package Operation;

import Book.BookShelf;

import java.util.Scanner;

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookShelf bookShelf) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要归还的图书名:");
        String newBookName = scanner.nextLine();

        int ret = bookShelf.getKindOfBooks();//获取当前图书种类
        for (int i = 0; i < ret ; i++) {     //遍历书架中的图书
            String str = bookShelf.getBook(i).getBookName();//获取当前图书的书名
            if(str.equals(newBookName)){
                int quantity = bookShelf.getBook(i).getQuantity();//获取当前图书的数量
                bookShelf.getBook(i).setQuantity(quantity + 1);//更新当前图书的数量
                System.out.println("归还图书成功");
                return;
            }
        }
        System.out.println("系统中没有这本书,归还失败");
    }
}

3.7  SearchOperation

package Operation;

import Book.Book;
import Book.BookShelf;

import java.util.Scanner;

public class SearchOperation implements IOperation{
    @Override
    public void work(BookShelf bookShelf) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的图书名:");
        String newBookName = scanner.nextLine();

        int ret = bookShelf.getKindOfBooks();//获取当前图书种类
        for (int i = 0; i < ret ; i++) {     //遍历书架中的图书
            String str = bookShelf.getBook(i).getBookName();//获取当前图书的书名
            if(str.equals(newBookName)){
                System.out.println("图书信息如下:");
                System.out.println(bookShelf.getBook(i).toString());
                return;
            }
        }
        System.out.println("系统中没有这本书,查找失败");
    }
}

重写这几个类中的work方法时,终于感受到了面向对象思想的强大!

4、User

package User;

import Book.BookShelf;
import Operation.IOperation;

public abstract class User {
    protected String userName;
    protected IOperation[] iOperations;
    public User(String userName) {
        this.userName = userName;
    }
    public abstract int menu();
    public void doOperation(int choice, BookShelf bookShelf){
        this.iOperations[choice].work(bookShelf);
    }
}

简析:

抽象父类User中,我们给了一个用户名和初始化它的构造方法;还有一个Operation引用类型的数组,这个数组在子类中会用到;一个抽象方法menu(),用来让子类重写自己的功能菜单;还有一个doOperation()方法,用来实现子类所对应的图书管理功能。

5、AdminUser

package User;

import Operation.*;

import java.util.Scanner;

public class AdminUser extends User{
    public AdminUser(String userName) {
        super(userName);
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new SearchOperation(),
                new AddOperation(),
                new DeleteOperation(),
                new DisplayOperation()
        };
    }

    @Override
    public int menu(){
        System.out.println("Hello,管理员"+this.userName+",欢迎进入图书管理系统");
        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);
        int choice = 0;
        while(true) {
            choice = scanner.nextInt();
            if (choice < 0 || choice > 4) {
                System.out.println("请选择正确的操作");
            }
            else {
                break;
            }
        }
        return choice;
    }
}

简析:

在子类AdminUser中,我们给了一个构造方法来初始化父类中的用户名,同时给IOperation引用类型的这个数组进行了初始化,数组中的元素下标与功能菜单中的选项数字相对应;然后重写了父类中的menu()方法,给出了相应的功能菜单。

6、NormalUser

package User;

import Operation.*;

import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(String userName) {
        super(userName);
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new SearchOperation(),
                new BorrowOperation(),
                new ReturnOperation()
        };
    }
    @Override
    public int menu(){
        System.out.println("Hello,"+this.userName+",欢迎来到图书馆");
        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);
        int choice = 0;
        while(true) {
            choice = scanner.nextInt();
            if (choice < 0 || choice > 3) {
                System.out.println("请选择正确的操作");
            }
            else {
                break;
            }
        }
        return choice;
    }
}

简析:

AdminUser类一样,在NormalUser子类中,我们给出了初始化父类的构造方法,并同时初始化了数组内容,数组元素下标与菜单功能中的选项数字相同,也重写了menu()方法,给出了相应的功能菜单。

7、Main

package User;

import Book.BookShelf;

import java.util.Scanner;

public class Main {
    public static User login(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String name = scanner.nextLine();
        System.out.println("请选择你的身份:1.管理员  0.普通用户");
        int choice = 0;
        while(true) {
            choice = scanner.nextInt();
            if(choice == 0){
                return new NormalUser(name);
            }else if(choice == 1){
                return new AdminUser(name);
            }else{
                System.out.println("请选择正确的操作");
            }
        }
    }
    public static void main(String[] args) {
        User user = login();
        BookShelf bookShelf = new BookShelf();
        while (true){
            int choice = user.menu();
            user.doOperation(choice,bookShelf);
        }
    }
}

简析:

在Main类中,写了整个系统的main方法,进入main方法,首先调用login方法来登录,根据用户的选择来确定对应的身份。

(注意,login方法的返回值类型是父类User,而返回的确是子类的对象,所以在这个过程中发生了向上转型)

然后实例化一个BookShelf对象,在一个死循环中,通过返回的user来调用子类的menu方法,根据menu方法的返回值和BookShel对象,调用父类的doOperation方法即可调用功能菜单中相应的功能。

思维导图:

谢谢大佬的阅读~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java小练习——图书管理系统 的相关文章

  • 如何将 .cer 证书导入 java 密钥库?

    在开发 Java Web 服务客户端期间 我遇到了一个问题 Web 服务的身份验证使用客户端证书 用户名和密码 我从网络服务背后的公司收到的客户端证书位于 cer格式 当我使用文本编辑器检查该文件时 它具有以下内容 BEGIN CERTIF
  • Java,将 null 分配给对象和仅声明之间有什么区别

    之间有什么区别 Object o null and Object o 仅声明 有人可以回答我吗 这取决于您声明变量的范围 例如 局部变量没有default values在这种情况下你将不得不分配null手动 在这种情况下实例变量分配 nul
  • Eclipse 自动完成更改变量名称

    只是一个愚蠢的问题 但很难搜索 因为有很多关于 Eclipse 自动完成的主题 而且很难找到与我的问题匹配的内容 所以问题是 如果我写 MyClass MyVarName 然后按空格键 添加 new MyClass Eclipse 自动添加
  • Java byte[] 与 String 之间的转换

    为什么这个junit测试失败了 import org junit Assert import org junit Test import java io UnsupportedEncodingException public class T
  • 获取TextView的高度

    我有一些文字将被放入TextView 我这样做是使用setText 现在我需要找到文本在文本中占据的行数或高度TextView 我尝试使用getHeight 但它总是返回 0 无论如何 有没有办法获得文本中存在的文本的高度TextView
  • DateTimeFormatter.parseLocalDate 抛出 UnsupportedOperationException

    该API用于解析本地日期 http joda time sourceforge net apidocs org joda time format DateTimeFormatter html parseLocalDate 28java la
  • java.lang.UnsupportedOperationException:无法解析索引 13 处的属性:TypedValue{t=0x2/d=0x7f010046 a=-1}

    我在 android attrs xml 文件中添加了一个用于不同色调的属性 在 styles xml 文件中 我为这些属性指定了颜色 因此每种样式的它们都不同 Attrs xml
  • 在java中是否可以使用反射创建没有无参数构造函数的“空白”类实例?

    我有一个没有默认构造函数的类 我需要一种方法来获取此类的 空白 实例 空白 意味着实例化后所有类字段都应具有默认值 如 null 0 等 我问这个问题是因为我需要能够序列化 反序列化大对象树 而且我无法访问该对象类的源 并且类既没有默认构造
  • 我们必须将 .class 文件放在 Tomcat 目录中的位置

    我必须把我的 class文件在 Tomcat 目录中 在我的 Java Complete Reference 书中 他们告诉将其放入C Program Files Apache Tomcat 4 0 webapps examples WEB
  • Java 7 中 Object 和 int 的比较

    最近我偶然发现了一个问题 让我停下来思考 对我来说 下面的代码应该总是会触发错误 但是当我的一位同事问我为什么 Eclipse 没有显示错误时 我无法回答任何问题 class A public static void main String
  • 使用 Java 通过 HTTP 下载未知长度的文件

    我想用java下载一个HTTP查询 但是我下载的文件在下载时有一个未确定的长度 我认为这将是相当标准的 所以我搜索并找到了它的代码片段 http snipplr com view 33805 http snipplr com view 33
  • Akka 和 spring 配置

    我正在尝试将 akka 与 spring 结合起来 但没有成功 基本上 我的应用程序似乎不习惯读取 akka 模式 具有架构的 service context xml 的一部分
  • 设置 JAVA_HOME 变量时出现问题

    所以我刚刚下载了 Android Studio 并尝试设置 JAVA HOME 变量以便我可以运行它 我使用的是 Windows 8 并按照我找到的所有说明进行操作 但无济于事 转到高级系统设置 gt 环境变量 然后使用包含我的 jre7
  • 链表中的虚拟节点

    问 什么时候使用它们 作业问题 列表中的第一个和最后一个节点 有时用作列表中的第一个和最后一个节点 从未用作列表中的第一个和最后一个节点 维基百科说 哨兵节点是与链接一起使用的专门指定的节点 列表和树作为遍历路径终止符 哨兵节点的作用是 不
  • Apache Kafka 是否提供异步订阅回调 API?

    我的项目正在将 Apache Kafka 视为老化的基于 JMS 的消息传递方法的潜在替代品 为了让这个过渡尽可能的顺利 如果替代的排队系统 Kafka 有一个异步订阅机制那就更理想了 类似于我们当前项目使用的JMS机制MessageLis
  • 如何配置嵌入式 MongoDB 以在 Spring Boot 应用程序中进行集成测试?

    我有一个相当简单的 Spring Boot 应用程序 它公开一个小型 REST API 并从 MongoDB 实例检索数据 对 MongoDB 实例的查询通过基于 Spring Data 的存储库 下面的一些关键代码 Main applic
  • Python 可以替代 Java 小程序吗?

    除了制作用于物理模拟 如抛射运动 重力等 的教育性 Java 小程序之外 还有其他选择吗 如果你想让它在浏览器中运行 你可以使用PyJamas http pyjs org 这是一个 Python 到 Javascript 的编译器和工具集
  • JSP 和 scriptlet

    我知道现在使用 scriptlet 被认为是禁忌 没关系 我会同意Top Star的话 因为我目前只是Java新手 到目前为止我听到的是 它是为了让设计师的生活更轻松 但我想知道 这是否与JSP页面的性能有关 另一方面 如果只是为了 让设计
  • 如何隐藏或删除 Android HoneyComb 中的状态栏?

    如何隐藏或删除 Android HoneyComb 中的状态栏 每次运行应用程序时 我都会发现某些内容必须被状态栏覆盖 我尝试改变AndroidManifest xml 但没有任何改变 你不知道 它被认为是永久的屏幕装饰 就像电容式主页 菜
  • 如何在 Servlet 中打开弹出窗口,然后重定向页面

    我想在调用 servlet 时打开一个弹出窗口 然后想将 servlet 重定向到某个 jsp page 这就是我所做的 protected void doGet HttpServletRequest request HttpServlet

随机推荐

  • python 在Excel中新增一列

    1 在Excel中定义新列 定义新列需要用到columns tolist 函数 具体代码如下 col name df columns tolist col name insert 新列位置 新列名称 wb df reindex column
  • Log4j2源码分析系列:(一)配置加载

    在实际开发项目中 日志永远是一个绕不开的话题 本系列文章试图以slf4j和log4j2日志体系为例 从源码角度分析日志工作原理 学习日志框架 首先要熟悉各类日志框架 这里推荐两篇文章 就不再赘述了 https www cnblogs com
  • C——选择结构

    选择结构 1 关系运算与逻辑运算 1 1 关系运算 1 2 逻辑运算 2 if语句 2 1 单分支的if语句 2 2 双分支的if语句 3 条件运算符 4 switch语句 1 关系运算与逻辑运算 C语言中的逻辑值 C语言将 非0 值当做值
  • buuCTF [ISITDTU 2019]EasyPHP 1

    buuCTF ISITDTU 2019 EasyPHP 1 直接代码审计 第一个if 过preg match 一般有三种方法 取反绕过 异或绕过 转义绕过 这里用取反绕过 第二个if的意思是输入的字符串不重复的字符长度不超过0xd即13 如
  • select 模型解释

    套接字模式 阻塞套接字和非阻塞套接字 或者叫同步套接字和异步套接字 套接字模型 描述如何对套接字的I O行为进行管理 Winsock提供的I O模型一共有五种 select WSAAsyncSelect WSAEventSelect Ove
  • mybatis plus分页total=0、不计算总数的终极解决方案!!!

    当你在加入分页配置 如下 Configuration public class MybatisPlusConfig mybatis plus分页插件 Bean public PaginationInterceptor paginationI
  • 爬虫字体反爬的解决(一)

    爬虫字体反爬的解决 一 学习了前边的爬虫知识 大家一定爬取过很多的网站了 也一定被很多网站的各式各样的反爬机制劝退过 那么这些反爬机制如何来破解 大家也一定想破了头 本节课 我们来搞点不同寻常的有深度的事情 破解字体反爬 大家看目录 发现我
  • 【待解决】[LeetCode-101]-Symmetric Tree(判断两颗二叉树是否对称)

    文章目录 0 题目相关 1 Solution 0 题目相关 题目解读 给定两颗二叉树 对这两颗二叉树进行比较 判断这两棵二叉树是否对称 原题描述 原题链接 Given a binary tree check whether it is a
  • LeetCode题——最长无重复子串

    题目 给定一个字符串 请你找出其中不含有重复字符的 最长子串 的长度 如 输入 abcbabcd 输出 4 解释 因为无重复字符的最长子串是 abcd 所以其长度为 4 思路 一开始容易往暴力遍历的方向想 但是实际上运用窗口的思想就很容易解
  • [Unity2D/3D]实用的血条制作(第二期)

    Unity2D 3D 实用的血条制作 第二期 前言 第一期我为大家介绍了一种我自己摸索出来的血条制作方法 不是很常规 在这里我为大家介绍一种比较常用的血条制作方法 利用Mask组件来制作 让我们一起来看看叭 效果如图 1 首先我们把制作血条
  • Linux网络:数据链路层

    文章目录 数据链路层 和 网络层 认识以太网 以太网帧格式 认识MAC地址 认识MTU MTU对IP UDP TCP协议的影响 ARP协议 ARP数据报的格式 DNS Domain Name System 简介 域名简介 ICMP协议 pi
  • 【Linux】文件权限

    权限分为 r 读 w 写 x 执行 文件可以属于某个人也可以属于某个群体 由此可划分出三种 文件所有者 所属用户组 其他人 其他人指的是 既不是文件所有者且也不所属用户组中的用户 liuquan localhost ls l 总用量 0 r
  • CH8-HarmonyOS流转架构解析

    文章目录 前言 目标 核心概念 流转架构特性 Ability的调度 流转应用场景 流转架构 核心模块 跨端迁移关键流程 多端协同关键流程 分布式任务调度 连接远程PA 启动远程FA PA 迁移FA 接口IAbilityContinuatio
  • Android强大的图表开源——MPAndroidChart

    介绍 在APP开发中遇到图表的样式 一般我们要先查询GitHub上比较火的开源框架 这种图标应用广泛 统计 游戏统计 人际关系图等等 用到今天的这个框架MPAndroidChart 点击查看GitHub 一个可以拖动缩放的图表库 包含曲线图
  • 求整数的位数及各位数字之和 (15 分)

    7 5 求整数的位数及各位数字之和 15 分 对于给定的正整数N 求它的位数及其各位数字之和 输入格式 输入在一行中给出一个不超过10 9 的正整数N 输出格式 在一行中输出N的位数及其各位数字之和 中间用一个空格隔开 输入样例 321 输
  • 【Docker】Docker API的使用

    1 通过实训平台进入到操作系统界面 在 后输入vi usr lib systemd system docker service命令 进入编译模式 然后按i 小写 键 修改代码 usr bin dockerd current H tcp 0
  • 创建一维数组,长度为20,元素索引值为索引的二倍,奇数为负偶数为正,然后对数组排序

    import java util Arrays public class ArrayCreate public static void main String args int a new int 20 for int i 0 i lt 2
  • 单屏播放asf和vga文件的教学视频

    在自己的电脑上播放三分屏教学视频时 总觉得左边那两个小屏幕太占位置 还有右上方的小屏幕的播放进度条太短而无法精确拖放 虽然不是很懂HTML 但修改一下代码 还是单屏能播放的 下面是单屏播放asf和vga文件的设置 1 文件夹结构 index
  • CSS 实现七彩圆环loading动画

    前言 CSS 实现七彩圆环loading动画 速速来Get吧 1 实现效果 2 实现步骤 定义父容器宽度为 w 每个圆环之间的gap间距为 gap 圆环的border边框宽为 border root border 5px gap 30px
  • Java小练习——图书管理系统

    目录 一 图书管理系统应具备的功能 二 简单分析如何实现该系统 三 框架图 四 代码实现过程及简析 1 Book类 简析 2 BookShelf类 简析 3 IOperation接口 3 1 AddOperation类 3 2 Borrow