当前位置: 首页 > news >正文

Java SE 基础 · 点1 封装

封装学习

学习计划:Java SE 基础 · 1 封装

一、总结

1. 实体类封装

  • 编写Book实体类,将bookIdbookNamebookPricebookNumbookstatus封装到Book实体类。
  • 编写Reader实体类,将readerIdreaderNameborrowedBooks封装到Reader实体类。
  • 编写Librarian实体类,将staffIdstaffNamedepartment封装到Librarian实体类。

2. 构造方法

  • 构造方法分为有参构造与无参构造,无参和有参的方法名一致。
  • 有参构造中,需要在括号内添加实体类声明的参数,例如Book(Integer bookId),可选全量构造与部分参数构造。当实体类参数过多时,不推荐全量构建,构造主要业务中的参数即可。
  • 无参构造用于构造实体类参数默认值,括号内不能有任何声明参数,通过该构造方法设置参数默认值,例如this.bookName = "unknown"

3. setter/getter 方法

  • 编写 setter,方法为void类型,无返回值,参数为实体类中对应参数,使用this来设置当前实体类对象中对应参数值,例如setBookId(Integer bookId) {},内容通常为this.bookId = bookId
  • 编写 getter,方法为实体类中参数对应的类型,直接用return返回参数值,例如Integer getBookId() {},内容通常为return bookId
  • 注意:boolean类型参数的 setter 方法,通常为isXXX,而非setXXX

4. 借书逻辑

  • Main类中,先初始化一个Reader实体类对象c,创建Book实体类类型的集合,再通过add将图书添加到集合,通过c.setBorrowedBooks()方法,添加到Reader实体类对象封装中的List<Book> borrowedBooks
  • 在编写借书方法中,通过getBookNum()获取剩余书并记录下来,减一后,再通过setBookNum()重新设置当前对象中封装的图书剩余数量,实现"借一本图书"的逻辑。
  • 在实际过程中,应当创建图书馆实体类来封装图书,并且借书和还书还需要排除书不存在、书信息为空的情况,以及解决并发过程中数据库内数据变化预期结果和实际结果不一致的情况。

5. 全量构造方法说明

  • Reader实体类的全量构造方法中,this.borrowedBooks = new ArrayList<>(initialList)里的new ArrayList<>(initialList),是为了在新建Reader对象时,事先写好borrowedBooks内容,再通过全量构造自动拷贝到实体类中的borrowedBooks,实现新建Reader对象时borrowedBooks就拥有initialList内容。
  • 但在编写过程中,是在Main类中先新建Reader对象,再通过Reader实体类中的 setter 方法来设置borrowedBooks,因此并没有体现出该作用。

二、代码

1. Book.java —— Book 实体类

importjava.util.*;//Book实体类publicclassBook{privateIntegerbookId;privateStringbookName;privatedoublebookPrice;privateintbookNum;//剩余图书数privatebooleanbookstatus;//表示是否停卖,true表示 停卖privatestaticfinalRandomrandom=newRandom();//无参应对未知情况(未知不可为空)publicBook(){this.bookId=random.nextInt(1000);this.bookName="Book_Unknown_"+random.nextInt(1000);this.bookPrice=0;this.bookNum=0;this.bookstatus=true;}//有参应对新增全量图书(不可为空)publicBook(IntegerbookId,StringbookName,doublebookPrice,intbookNum,booleanbookstatus){//默认停卖this.bookId=bookId;this.bookName=bookName;this.bookPrice=bookPrice;this.bookNum=bookNum;this.bookstatus=bookstatus;}//有参应对新增全量图书(不可为空),并且默认停卖publicBook(IntegerbookId,StringbookName,doublebookPrice,intbookNum){this(bookId,bookName,bookPrice,bookNum,true);//调用全参构造,传入默认值 false}//有参构造(重载),设置主要参数publicBook(IntegerbookId,StringbookName){this.bookId=bookId;this.bookName=bookName;}//setterpublicvoidsetBookId(IntegerbookId){this.bookId=bookId;}publicvoidsetBookName(StringbookName){this.bookName=bookName;}publicvoidsetBookPrice(doublebookPrice){this.bookPrice=bookPrice;}publicvoidsetBookNum(intbookNum){this.bookNum=bookNum;}publicvoidsetBookstatus(booleanbookstatus){this.bookstatus=bookstatus;}//getterpublicIntegergetBookId(){returnbookId;}publicStringgetBookName(){returnbookName;}publicdoublegetBookPrice(){returnbookPrice;}publicintgetBookNum(){returnbookNum;}publicbooleanisBookstatus(){//(布尔类型 通常为"is"而不是"get")returnbookstatus;}@OverridepublicStringtoString(){return"Book{bookId='"+bookId+"',bookName='"+bookName+"',bookPrice='"+bookPrice+"',bookNum='"+bookNum+"',bookstatus='"+bookstatus+"'}";}}

2. Reader.java —— Reader 实体类

importjava.util.*;//Reader实体类publicclassReader{privateIntegerreaderId;privateStringreaderName;privateList<Book>borrowedBooks;//无参应对未知情况(未知不可为空)publicReader(){this.readerName="Unknown";this.borrowedBooks=newArrayList<>();}//有参应对新增全量读者信息(不可为空)publicReader(IntegerreaderId,StringreaderName,List<Book>initialList){//初始化列表+复制"initialList"this.readerId=readerId;this.readerName=readerName;this.borrowedBooks=newArrayList<>(initialList);}//有参构造(重载),设置主要参数publicReader(IntegerreaderId,StringreaderName){this.readerId=readerId;this.readerName=readerName;this.borrowedBooks=newArrayList<>();}//setterpublicvoidsetReaderId(IntegerreaderId){this.readerId=readerId;}publicvoidsetReaderName(StringreaderName){this.readerName=readerName;}publicvoidsetBorrowedBooks(List<Book>borrowedBooks){this.borrowedBooks=borrowedBooks;}//getterpublicIntegergetReaderId(){returnreaderId;}publicStringgetReaderName(){returnreaderName;}publicList<Book>getBorrowedBooks(){returnborrowedBooks;}//借书publicbooleanborrowBooks(List<Book>BorrowBooks,intn){for(Bookbook:BorrowBooks){if(n==0)returntrue;if(book.getBookNum()==0){book.setBookstatus(false);returntrue;}if(book!=null){intcurrent=book.getBookNum();current--;book.setBookNum(current);}n--;}returntrue;}//还书publicbooleanbackBooks(List<Book>BorrowBooks){for(Bookbook:BorrowBooks){if(book!=null){intcurrent=book.getBookNum();current++;book.setBookNum(current);}}returntrue;}@OverridepublicStringtoString(){return"Reader{readerId='"+readerId+"',readerName='"+readerName+"',borrowedBooks='"+borrowedBooks+"'}";}}

3. Librarian.java —— Librarian 实体类

//Librarian实体类publicclassLibrarian{privateIntegerstaffId;privateStringstaffName;privateStringdepartment;String[]departments={"Science","Fiction"};//无参应对未知情况(未知不可为空)publicLibrarian(){this.staffName="Unknown";}//有参应对新增全量读者信息(不可为空)publicLibrarian(IntegerstaffId,StringstaffName,Stringdepartment){this.staffId=staffId;this.staffName=staffName;this.department=department;}//有参构造(重载),设置主要参数publicLibrarian(IntegerstaffId,StringstaffName){this.staffId=staffId;this.staffName=staffName;}//setterpublicvoidsetstaffId(IntegerstaffId){this.staffId=staffId;}publicvoidsetstaffName(StringstaffName){this.staffName=staffName;}publicvoidsetdepartment(Stringdepartment){//在选择中,只能是departments中的元素try{if(department.equals(departments[0])||department.equals(departments[1])){this.department=department;}else{thrownewIllegalArgumentException("无效的部门名称: "+department);}}catch(IllegalArgumentExceptione){System.err.println("参数错误: "+e.getMessage());}}//getterpublicIntegergetstaffId(){returnstaffId;}publicStringgetstaffName(){returnstaffName;}publicStringgetdepartment(){returndepartment;}@OverridepublicStringtoString(){return"Librarian{staffId='"+staffId+"',staffName='"+staffName+"',department='"+department+"'}";}}

4. Main.java —— 测试主类

importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Booka=newBook();System.out.println("------无参构造Book,id随机,name随机,停卖------");System.out.println(a.toString());System.out.println();Bookb=newBook(29901001,"我肯定是第一本书",25.8,100,false);//false表示未停卖System.out.println("------有参构造Book(29901001,\"我肯定是第一本书\",25.8,100,false)------");System.out.println(b.toString());System.out.println();b.setBookstatus(true);//将b书停卖System.out.println("------b书停卖了吗?状态应为true------");System.out.println(b.toString());System.out.println();Readerc=newReader();//无参构造Reader,此时name为unknown,其余参数为空System.out.println("------无参构造Reader,此时name为unknown,其余参数为空------");System.out.println(c.toString());System.out.println();c.setReaderName("我原来有名字");//调用setter,为reader重命名,对比之前的nameSystem.out.println("------调用setter,为reader重命名,对比之前的name------");System.out.println(c.toString());System.out.println();List<Book>initialList=newArrayList<>();//一共图书initialList.add(newBook(1001001,"AAA",100.0,501));initialList.add(newBook(1001002,"BBB",200.0,601));initialList.add(newBook(1001003,"CCC",300.0,701));c.setBorrowedBooks(initialList);//存入图书馆System.out.println("------将initialList中包含的三本图书存入图书馆------");System.out.println(c.toString());System.out.println();c.borrowBooks(initialList,1);//借一本AAA图书System.out.println("------借一本AAA图书,num应为500------");System.out.println(c.toString());System.out.println();Librariand=newLibrarian(20050505,"Jack");//有参构造员工id和named.setdepartment("Science");//单独set员工所属部门System.out.println("------有参全量构建员工(20050505,\"Jack\"),查看department是否为\"Science\"------");System.out.println(d.toString());System.out.println();}}

三、运行结果

http://www.cnnetsun.cn/news/4299634.html

相关文章:

  • 驱动盘清理SOP:告别仓库爆满,一套流程搞定绝区零装备管理
  • STM32C5 ADC交错采样配置实战:从原理到CubeMX与DMA调试
  • 低功耗MCU踩坑:STANDBY下SideKick协处理器GPIO误判根因与修复
  • 智能体延迟优化指南:从毫秒级推理到工具调用链路
  • SSM停车场管理系统源码解析:从框架原理到部署实战
  • 数据库工程与查询优化案例深度复盘‌
  • 工厂数字孪生平台选型指南:从车间透明化到能源可视化
  • 2013年Google笔试题精讲:从算法内核到面试实战的修炼指南
  • PDF流式编辑实现文字修改自动重排版:原理、实践与工具
  • 雌激素雄性化神经通路的Python模拟:从机制到代码
  • 从0.3%到10%:DeepSeek V4-Pro与Claude Code的真实工程差距与接入实践
  • 科普:Python中的生成器——带`yield`的函数
  • Tiny JPEG在Chrome中发灰?一文讲透色度子采样与浏览器渲染的真相
  • AI失控风险与可控性实践:从赫拉利警示到本地大模型安全部署
  • 2026 时序基础模型:大模型不只聊天,还能预测设备何时会坏(MonkeyCode 云端实战)
  • Vibe Coding 实战:用自然语言打造有设计感的个人网站
  • 当技术教程遇到法律边界:内容策划的合规之道
  • Jmeter接口测试与性能测试实战:从环境搭建到结果分析
  • 102个Python实战项目合集:从基础语法到框架开发的完整学习路线
  • HAMP-LIC:基于Hessian的混合精度训练后量化,破解图像压缩模型部署难题
  • Java八股文天花板典藏版开源:大厂面试考点全解析与备战指南
  • 确定性、可计算性与预测边界:从混沌系统到停机问题的工程启示
  • 网易2019实习生招聘编程题全解析:考点、代码与考场策略
  • 椒盐音乐+音乐标签:本地音乐曲库整理与批量修改实践指南
  • 机器人自动分拣项目实战:从ROS、OpenCV到机械臂控制的完整开发复盘
  • Mermaid流程图代码化:从手绘到Git管理的工程实践
  • Codex CLI实战:从零生成服装品牌官网与常见报错排查
  • Java面试100题精讲:从八股文到底层原理的进阶指南
  • 阵列型SiPM探测器连接器线缆选型与管脚设计优化技术规范
  • 从混凝土箭头到GPS:跨大陆信标航线的导航革命