内部类+图书管理系统

内部类+图书管理系统

  • 1. 实例内部类
    • 1.1 实例内部类的结构
    • 1.2 实例内部类的一些问题
      • 1.2.1 如何在main中创建实例内部类对象?
      • 1.2.2 内部类成员变量被static修饰问题?
      • 1.2.3 内部类和外部类变量重名的调用问题?
      • 1.2.4 外部类访问内部类变量的问题
  • 2. 静态内部类
    • 2.1 静态内部类的结构
    • 2.2 静态内部类的一些问题
      • 2.2.1 如何在mian中创建对象?
      • 2.2.2 在静态内部类中访问外部非静态内部类问题?
  • 3. 局部内部类
  • 4. 匿名内部类
  • 5. 图书管理系统的基本功能
  • 6. 图书管理系统的设计逻辑
    • 6.1 Book类
    • 6.2 BookList类
    • 6.3 Operation
    • 6.4 User
    • 6.5 Main进行统一,用来实现整个程序
  • 7. 图书管理系统的细节以及操作方法的实现
    • 7.1 FindOperation
    • 7.2 AddOperation
    • 7.3 ExitOperation
    • 7.4 DelOperation
  • 8. 图书管理系统的总结和改进

在这里插入图片描述


🔥 博客主页: 偷心编程
🎥 系列专栏: 《Java学习》 《C语言学习》
❤️ 感谢大家点赞👍收藏评论✍️

在这里插入图片描述
  内部类主要有以下几种:

  1. 实例内部类
  2. 静态内部类
  3. 局部内部类
  4. 匿名内部类

  为什么会有内部类呢?当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。(就是 整体与部分 的关系)

1. 实例内部类

1.1 实例内部类的结构

  实例内部类就是定义在另一个类里面,并且没有什么其他的修饰符修饰

class OutClass {class InnerClass1{} 
}

  就把内部类当成一个普通的类,也可以定义成员变量和成员方法。

class Out{public int date1=1;public int date2=2;//内部类class Inner{public int date3=3;public static final int date4=4;public int date2=22;public void fun(){System.out.println("Inner::fun");System.out.println(date1);System.out.println(date3);System.out.println(date2);System.out.println(Out.this.date2);}}Inner inner = new Inner();public void fun(){System.out.println("Out::fun");System.out.println(inner.date3);}
}

1.2 实例内部类的一些问题

1.2.1 如何在main中创建实例内部类对象?

  在main中我们并不能直接创建一个内部类对象,必须先创建一个外部类对象,再利用外部类创建内部类对象。

public class Test {public static void main(String[] args) {Out out = new Out();Out.Inner inner = out.new Inner();}
}

1.2.2 内部类成员变量被static修饰问题?

  如果内部类的成员变量被static修饰,那么同时也要被final修饰。

class Out{class Inner{//同时被static和final修饰public static final int date4=4;}
}

1.2.3 内部类和外部类变量重名的调用问题?

  在内部类中,肯定是“就近原则”,首先看自己有没有这个名字的变量,再看外部类有没有,若都没有就报错。(简而言之——“就近原则”
  若是非要调用外部类的重名变量,就用 外部类名称.this.同名成员 来访问
  实例内部类的非静态方法中包含了一个指向外部类对象的引用

class Out{public int date1=1;public int date2=2;class Inner{public int date3=3;public static final int date4=4;public int date2=22;public void fun(){System.out.println("Inner::fun");System.out.println(date1);System.out.println(date3);//这个date2是调用内部类的System.out.println(date2);//这个date2是调用外部类的System.out.println(Out.this.date2);}}Inner inner = new Inner();public void fun(){System.out.println("Out::fun");System.out.println(inner.date3);}
}

1.2.4 外部类访问内部类变量的问题

  外部类不能直接访问内部类的普通成员变量以及成员方法,必须现在外部类中实例化一个内部类对象,才能进行访问。

class Out{class Inner{public int date3=3;}//先要实例化一个内部类对象Inner inner = new Inner();public void fun(){System.out.println("Out::fun");//通过内部类对象进行访问System.out.println(inner.date3);}
}

2. 静态内部类

2.1 静态内部类的结构

  静态内部类和实例内部类的结构没什么不一样,就是多了一个 “stastc” 访问修饰限定符。

class OutClass {class static InnerClass1{} 
}

2.2 静态内部类的一些问题

2.2.1 如何在mian中创建对象?

  这个时候已经不需要先创建一个外部类的对象,再创建内部类对象,我们可以直接创建内部类的对象(不依赖与外部类)

public class Test {public static void main(String[] args) {//是需要用到外部类名,但是不需要外部类对象了Out.Inner inner = new Out.Inner();}
}

2.2.2 在静态内部类中访问外部非静态内部类问题?

  静态内部类的方法中只能够访问外部类中静态的成员变量,不能够访问普通的成员变量。

class Out{public int date1=1;public static int date5=2;static class Inner{public int date3=3;//对于静态内部类,static不再需要配合final使用public static int date4=4;public void fun(){System.out.println("Inner::fun");//这个时候会报错,因为date1是普通的成员变量System.out.println(date1);System.out.println(date3);//date5不会报错,因为是静态变量System.out.println(date5);}}
}

3. 局部内部类

  局部内部类就是在方法中定义一个类,并且只能够在这个方法中使用,语法什么的没有什么特别之处,并且很少使用,因此就不多做讲解。

4. 匿名内部类

  我们都知道,接口是不可以实例化的,但是我们可以通过内部类让它间接实例化。

interface Run{void test();
}
public class Test {public static void main(String[] args) {//间接实例化Run run=new Run() {@Overridepublic void test() {}};}
}

  其实按道理接口是不可以实例化的,上面这一串代码之所以可以是因为其等价于:有一个类实现了这个接口,并且在main方法里面创建了这个类的对象(发生了向上转型),因为这个类并没有具体实现的代码,因此说是匿名内部类。

5. 图书管理系统的基本功能

  首先,这个图书管理系统有 管理员普通用户 ,不同的身份所能使用的功能不同。

  管理员:

在这里插入图片描述
  普通用户:
在这里插入图片描述
  然后可以使用自己对应的功能,以“管理员”-“显示图书”为例:

在这里插入图片描述

6. 图书管理系统的设计逻辑

  用java设计一个基本的东西,我们要遵循 “找对象”“创建对象”“使用对象”
  对于图书管理系统,我们有 ①与书相关的:书、书架;②操作类:所有的功能(查找图书、添加图书等);③管理者和普通用户这个User类;

6.1 Book类

  成员变量有:名字、作者、价格、类型、是否借出;(为了体现封装的特性,我们所有的变量都用 private 修饰)

在这里插入图片描述


  然后基本的成员方法,必须得到这些变量和设置这些变量(get and set)

在这里插入图片描述
在这里插入图片描述


  我们还需要打印一本书的相关信息(toString)

  注:我们可以对打印的形式进行改写,比如我就是通过使用三目运算符,改变了“是否借出”的打印

在这里插入图片描述


  然后我们还要定义一个构造方法

  注:isBorrowed 默认就是false,因此不需要在构造方法里面初始化

在这里插入图片描述


6.2 BookList类

  成员变量就只有两个: ①Book数组;②当前书架书的数量

  注:这里用 DEFAULT_CAPACITY 记录数组的长度,是为了方便修改;在书架上先放了三本书;

在这里插入图片描述


  成员方法也有最基本的 get、set

  注:这里的setBook 和 getBook 需要我们自己去写

在这里插入图片描述

6.3 Operation

  我们把每一个操作都写为一个类,由于每个操作都是对书架进行操作,因此我们可以定义一个接口,然后每个操作都继承这个接口

  注:继承接口这一步非常重要,因为这样可以统一所有的操作,然后还可以把所有的或者几个操作放到一个数组里面,实现多态

在这里插入图片描述


  接口IOperation

在这里插入图片描述

6.4 User

  我们有“管理员”和“普通用户”两种身份,然后他们又都是用户,因此我们可以用一个父类User来抽取他们共有的属性

  注:使用父类也可以实现“管理员”和“普通用户”的统一,也能够实现多态;并且从这里也可以看出“父类”与“接口”的区别

在这里插入图片描述


  父类User

在这里插入图片描述


  管理员AdminUser

  注:不同的身份,所能够执行的功能不同,也就是“菜单”不同,因此我们要把菜单写上,并且这个菜单还要让我们进行选择

在这里插入图片描述


  普通用户NormalUser

  注:无论是管理员还是普通用户,都要有构造方法,并且先对父类进行构造,然后根据自己的功能声明IOperation数组的内容

在这里插入图片描述

6.5 Main进行统一,用来实现整个程序

  在这一步中,巧妙地使用了 login() 这个方法,完成了身份的选择以及第一步向上转型

在这里插入图片描述
  然后通过while循环,使得我们能够多次选择

7. 图书管理系统的细节以及操作方法的实现

7.1 FindOperation

在这里插入图片描述

注:1. 一般来说都需要用 currentSize 用来接收当前书架上的书的数量,基本上每个操作都需要用到
注:2. 然后注意获得书架上某一本书的信息的方法: Book book = bookList.getBook(i) ;
注:3. 最后是如何判断是否找到了这本书:book.getName().equals(name);

7.2 AddOperation

在这里插入图片描述

注:1. 我们有两个检验,检验是否书架满了,检验要添加的书书架上是否存在
注:2. 学习这里的方法,如何添加一本书,要先给出添加书籍的基本的信息,然后利用 bookList.setBook这个方法进行添加,并且还要修改书架上书的数量

7.3 ExitOperation

在这里插入图片描述

注:1. 这里只需要学习退出系统的方法即可

7.4 DelOperation

在这里插入图片描述

注:1. 这里我们同样需要检验,判断书架上时候有书籍,然后还需要检验你要删除的书籍书架上是否存在
注:2. 这里删除书籍有一个小的算法,就是用后一项代替前一项,然后最后一项设置为null,也就是图中圈起来的部分,但是我们这里要改变bookList里面books数组里面的内容,必须使用bookList.setBook(j,book1)这个方法,不能像下面的图一样,这样不能够完成修改
在这里插入图片描述
在这里插入图片描述

8. 图书管理系统的总结和改进

  总的来说,这个图书管理系统让我初步将多态、父类、接口、数组、类和对象等所有基本的知识混合在一起,并且使用。我在这个过程中也是初步体会到了java程序封装的特性以及面向对象开发的特点。

  但是我们的图书管理系统还有许多可以改进的地方,比如持久化存储、网页交互+各种框架等等

  图书管理系统的一些重点:

  1. get set
  2. toString改写
  3. login登录进行串联
  4. menu返回int
  5. 判断找到图书的方法
  6. 退出系统的方法
  7. 要改变目标数组内容的方法

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

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

相关文章

浅谈C嘎嘎入门基础

看到这篇文章的童鞋或许会有疑惑,这不是之前 已经出过了吗,是的但是之前那篇文章可能不太好理解,因此我再写一篇便于大家理解的文章 那么上一篇文章已经帮大家过渡到C嘎嘎了,那么这篇文章我们继续讲解C嘎嘎的知识点。 C嘎嘎中的引…

【面试题】数据结构:堆排序的排序思想?

堆排序的排序思想? 堆排序是一种高效的排序算法,其基本思想是利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树,通常用数组来表示。堆排序的基本步骤如下: 1. 构建初始堆: 将待排序的数组转换成一个最大堆&a…

在RK3568上如何烧录MAC?

这里我们用RKDevInfoWriteTool 1.1.4版本 下载地址:https://pan.baidu.com/s/1Y5uNhkyn7D_CjdT98GrlWA?pwdhm30 提 取 码:hm30 烧录过程: 1. 解压RKDevInfoWriteTool_Setup_V1.4_210527.7z 进入解压目录,双击运行RKDevInfo…

Java案例斗地主游戏

目录 一案例要求: 二具体代码: 一案例要求: (由于暂时没有学到通信知识,所以只会发牌,不会设计打牌游戏) 二具体代码: Ⅰ:主函数 package three;public class test {…

【BUG】已解决:zipfile.BadZipFile: File is not a zip file

已解决:zipfile.BadZipFile: File is not a zip file 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发…

如何在项目中使用线程池自定义拒绝策略

首先呢&#xff0c;我设计了一个图表在我的项目里面&#xff0c;为了方便展示&#xff0c;我只修改一个字段&#xff0c;线程池设置参数 (2,4,30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(4),new RJ()); 然后通过循环持续的进行增加任务&#xff0c;目的修改数据库的…

机器人开源调度系统OpenTCS-6最新版本地源码运行

OpenTCS 项目使用 Gradle 而不是 Maven&#xff0c;那么需要使用 Gradle 来导入和构建项目。在 IntelliJ IDEA 中导入和运行使用 Gradle 的项目&#xff0c;可以按照以下步骤进行操作&#xff1a; 克隆 OpenTCS 源码 首先&#xff0c;克隆 OpenTCS 的源码到本地。您可以使用以…

Jenkins-zookeeper-docker-xxljob-rancher

文章目录 Jenkins实战1 新建任务需要的配置pipeline Zookeeper基础 Docker基础实操windows11 docker mysql DockerhouseDockerhubxxl-Job基础实战 Rancher基础思考 实战1 Rancher的某个namespace的scale为0 Jenkins 实战 1 新建任务需要的配置pipeline 该代码是Jenkinsfile&…

腾讯元宝上线“3D角色梦工厂”:快速生成专属3D角色!

7月16日&#xff0c;腾讯旗下大模型应用“腾讯元宝”上线“3D角色梦工厂”&#xff0c;允许用户通过上传一张五官清晰的正面头像&#xff0c;并选择不同的角色模板&#xff0c;迅速生成个人3D角色&#xff01; 技术特点 “3D角色梦工厂”将大模型生成技术与3D应用相结合&#…

Java跨平台的原理是什么?JDK,JRE,JVM三者的作用和区别?xxx.java和xxx.class有什么区别?看这一篇就够了

目录 1. Java跨平台相关问题 1.1 什么是跨平台(平台无关性)&#xff1f; 1.2 跨平台(平台无关性)的好处&#xff1f; 1.3 编译原理基础&#xff08;Java程序编译过程&#xff09; 1.4Java跨平台的是实现原理&#xff1f; 1.4.1 JVM(Java虚拟机) 1.4.2 Class文件 1.4.3 …

阿尔泰科技工业电脑IPC-8363工控机

概述&#xff1a; IPC-8363是一款支持 LGA 1200 Intel 10th/11th Generation Core™ i9/i7/i5/i3, Celeron and Pentium processor 的工业电脑。配置2组独立 SO-DIMM DDR4 2666/2933MHz内存&#xff0c;最大可扩展至128GB。 主要技术指标&#xff1a; 产品图示&#xff1a; 系…

PyTorch 深度学习实践-循环神经网络(高级篇)

视频指路 参考博客笔记 参考笔记二 文章目录 上课笔记总代码练习 上课笔记 个人能力有限&#xff0c;重看几遍吧&#xff0c;第一遍基本看不懂 名字的每个字母都是一个特征x1,x2,x3…&#xff0c;一个名字是一个序列 rnn用GRU 用ASCII表作为词典&#xff0c;长度为128&#x…

加密传输及相关安全验证:

1.1. 加密&#xff1a; 1.1.1. 对称加密&#xff1a; 特点&#xff1a;加解密用一个密钥&#xff0c;加解密效率高&#xff0c;速度快&#xff0c;有密钥交互的问题问题&#xff1a;双方如何交互对称密钥的问题&#xff0c;用非对称密钥的公钥加密对称密钥的混合加密方式常用…

开源安全态势感知平台Security Onion

简介 Security Onion是一款由安全防御人员为安全防御人员构建的免费开放平台。它包括网络可见性、主机可见性、入侵检测蜜罐、日志管理和案例管理等功能。详细信息可以查看官网Security Onion Solutions 在网络可见性方面&#xff0c;Security Onion提供了基于签名的检测&…

【JS逆向课件:第一课:requests基础】

爬虫初始 爬虫相关介绍 什么是爬虫 就是编写程序&#xff0c;模拟浏览器上网&#xff0c;让其去互联网中抓取数据的过程 模拟&#xff1a; 浏览器本身就是一个纯天然的爬虫工具&#xff0c;爬虫相关的模块都是基于浏览器为基础开发出来的。注意&#xff1a;日后只要是你的爬虫…

【开发踩坑】使用PageHelper工具正常sql后面多无关语句

背景 SQL日志打印出现了脏东西&#xff1a; 本来结束的 where muc.code ?;后面凭空多出了一个 LIMIT语句 ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your …

使用 Flask 3 搭建问答平台(三):注册页面模板渲染

前言 前端文件下载 链接https://pan.baidu.com/s/1Ju5hhhhy5pcUMM7VS3S5YA?pwd6666%C2%A0 知识点 1. 在路由中渲染前端页面 2. 使用 JinJa 2 模板实现前端代码复用 一、auth.py from flask import render_templatebp.route(/register, methods[GET]) def register():re…

汇编教程2

本教程主要教大家如何安装32位Linux虚拟机&#xff0c;为后续实验拆炸弹做准备 下载系统映像文件 以Ubuntu14.04.6系统为例 官方网站&#xff1a;下载地址 点击下载图中32位系统 如果官网进不去可以使用镜像网站 清华镜像网站&#xff1a;下载地址 进入之后找到下图中链接…

Android C++系列:Linux线程(四)线程同步

多个线程同时访问共享数据时可能会冲突,这跟我们前面信号文章所说的可重入性是同样的问题。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 从内存读变量值到寄存器;寄存器的值加1;将寄存器的值写回内存假设两个线程在多处理器平台上同时执行这三…

13. C++继承 | 详解 | 虚拟继承及底层实现

目录 1.定义 1.1继承的概念 1.2 继承的定义 2. 对象赋值转换 3. 继承中的作用域 a. 隐藏/重定义 (Hiding/Redefinition) b. 重载 (Overloading) c. 重写/覆盖 (Overriding) d. 编译报错 (Compilation Error) 4. 派生类的默认成员函数 构造 拷贝构造 运算符重载 析…