news 2026/8/30 4:59:52

Java SE 基础 · 点1 封装

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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();}}

三、运行结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 4:59:51

驱动盘清理SOP:告别仓库爆满,一套流程搞定绝区零装备管理

玩《绝区零》到了一定阶段&#xff0c;几乎每个人都会遇到同一个尴尬&#xff1a;驱动盘仓库满了&#xff0c;但又不敢随便分解。尤其是刚刷完一批挑战内容&#xff0c;界面上反复弹出“驱动盘已满”的提示时&#xff0c;那种被背包空间卡住体验&#xff0c;确实很影响游戏节奏…

作者头像 李华
网站建设 2026/8/30 4:59:25

STM32C5 ADC交错采样配置实战:从原理到CubeMX与DMA调试

最近在调一颗 STM32C5&#xff0c;项目里要把单通道 ADC 的采样率从五百多 Ksps 干到 1Msps 以上&#xff0c;搜了一圈资料&#xff0c;发现 C5 这颗芯片的 ADC 交错采样&#xff08;interleave mode&#xff09;完整配置流程讲得真的不多&#xff0c;尤其是新版 CubeMX 里应该…

作者头像 李华
网站建设 2026/8/30 4:58:56

低功耗MCU踩坑:STANDBY下SideKick协处理器GPIO误判根因与修复

我先把这次踩坑的完整经过写下来。最近在做一颗带低功耗协处理器的MCU项目&#xff0c;主控在STANDBY模式下待机&#xff0c;由SideKick协处理器负责监控唤醒源。结果在调试唤醒逻辑时发现一个很诡异的现象&#xff1a;SideKick上报的C0引脚电平状态&#xff0c;和外部实际电平…

作者头像 李华
网站建设 2026/8/30 4:56:22

智能体延迟优化指南:从毫秒级推理到工具调用链路

第一次被智能体磨掉耐心&#xff0c;往往不是因为它答错了&#xff0c;而是因为它迟迟不响应。你让它查一个资料、整理一份表格、改一段代码&#xff0c;它在“思考”和“调用工具”之间停了好几秒&#xff0c;偶尔还会出现七八秒的空白。这时候你会觉得&#xff0c;这不是智能…

作者头像 李华
网站建设 2026/8/30 4:54:38

SSM停车场管理系统源码解析:从框架原理到部署实战

简介&#xff1a;本资源是一套完整的基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发的停车场管理系统毕业设计源码&#xff0c;面向Java初学者及本科毕业设计学生&#xff0c;聚焦企业级Web应用开发实践&#xff0c;覆盖用户管理、车场与车位监控、车辆进出登…

作者头像 李华
网站建设 2026/8/30 4:54:28

数据库工程与查询优化案例深度复盘‌

数据库工程与查询优化案例深度复盘‌ 去年我在安徽亳州的一家房地产造价咨询公司做技术支持的时候,遇到了一个让整个技术团队熬了两个通宵的故障:他们的造价核算系统里,全公司20多个造价师同时打开项目造价汇总页面的时候,系统直接卡死,所有用户的操作全部无响应,最后数据…

作者头像 李华