《Java 编程入门》7.1 类、字段与方法
回到 library 的领域对象:类把字段(状态)和方法(行为)放在一起,new 创建独立实例,this 指向当前接收者;再分清实例字段与静态字段、默认 toString/equals 的真实行为,以及字段默认值带来的静默错误,为 7.2 的构造器和 7.3 的封装打底。
tag
回到 library 的领域对象:类把字段(状态)和方法(行为)放在一起,new 创建独立实例,this 指向当前接收者;再分清实例字段与静态字段、默认 toString/equals 的真实行为,以及字段默认值带来的静默错误,为 7.2 的构造器和 7.3 的封装打底。
从 LibraryService.borrow 的局部变量讲起,分清作用域与生命周期:花括号决定名字能用到哪里,栈帧决定局部变量活到什么时候,可达性决定对象活到什么时候;再用 javap 的局部变量表、真实调用栈和 StackOverflowError 把这三件事对上。
用 library 的借书、还书和替换对象三个实验,讲清 Java 只有值传递:基本类型复制数值,对象复制引用;方法内重新赋值不影响调用方,通过引用修改对象却会影响。最后说明为什么返回内部 List 会泄漏状态,以及借还逻辑通过引用改 Book 时风险在哪。
从 LibraryApp 越堆越多的职责出发,讲清方法签名的组成、重载解析的三道关(严格匹配、装箱、可变参数),以及可变参数背后的数组语义;最后拆出 LibraryService,用重载的 addBook 和 search 把 CLI 与业务逻辑分开。
从 library 搜索参数的混合类型问题出发,讲清 instanceof 模式变量的流作用域、&& 右侧与提前返回后的作用范围,以及 switch 模式匹配里的 when 守卫和支配规则;最后用 parseValue 与 matches 把 year:2006、after:2006 这类过滤条件安全地落到 Book 字段上。
从 5.1 留下的 if/else 命令链出发,拆开 switch 的冒号写法、箭头写法与表达式写法,讲清 fall-through、yield 的作用域和枚举穷尽性检查;再用 library 的 Command 枚举与 dispatch 方法,把命令分发写成一张编译器能检查的表。
从 library 的 CLI 命令分发出发,讲清 if/else 链、卫语句、for 与 while 各自适合的场景;再用真实运行结果说明循环边界和边遍历边删除,并点出字符串比较中常见的三个坑,最后落到可运行的 LibraryApp 骨架。
从 library 的罚金计算出发,讲清整数除法、取模符号、类型提升、溢出与 Math.addExact 系列方法;再解释 0.1 + 0.2 为什么不等于 0.3、金额为什么用分而不是 double,最后用位运算表示借阅状态标志,并给出可复现的本机输出与边界检查清单。
把 var 还原成编译期类型推断而不是动态类型:哪些位置能用、哪些位置编译失败、什么时候用 var 反而降低可读性;再讲 final 局部变量、static final 常量与「final 引用不等于不可变对象」的区别,并在 library 的 BookLabels 与 LoanPolicy 里落地。
以 Book 的字段设计为线索,讲清八种基本类型的范围与默认值、什么时候该用 int 而不是 Integer、ISBN 为什么必须用 String;再拆开装箱拆箱、Integer 缓存、== 与 equals 的差异,用真实 NPE 和 128 比较结果说明包装类型最容易踩的三个坑。
把 Maven 生命周期还原成一条可执行的流水线:validate、compile、test、package、verify、install、deploy 各自做什么,为什么 mvn package 会顺带跑测试,target 下每个目录从哪来;再用 library 工程实跑 compile、test、package,检查 jar 内容与 No tests to run 的真实输出。
把 library 拆成 com.plume.library 与 com.plume.library.cli 两个包,用 public、包私有、protected、private 四种可见性解释谁能看见谁,并用真实编译错误验证包私有边界;再对比 classpath 与 module path,给出 module-info.java 的 exports/requires 写法与卷一不启用模块的理由。
从零走完 Hello, Library 的完整链路:源码、javac -d、包目录、class 文件、java -cp 逐层拆解,解释 main 签名与 args 的来源;再用 javap 看字节码、用 --release 21 对比 class 文件版本,并给出文件名不匹配、缺少 main、类路径写错三类真实报错。
把 IDE、JShell 与命令行放在同一套工作流里:用 JShell 快速验证表达式和 library 的字符串格式,用 javac/java 理解编译与运行的分工,再说明 IDE 导入 Maven 工程、指定 JDK 25 和避免提交 .idea 的具体做法,最后给出三套工具之间切换的检查清单。
把 library 从单文件 javac 推进到 Maven 工程:解释 groupId、artifactId、version 与标准目录结构,逐项拆开最小 pom.xml 里的 release 与编码配置,再用 mvn compile 验证 target/classes 的产物,并列出目录放错、POM 缺失、编码未设三类常见故障。
从 Temurin 25.0.5 的安装包选择讲起,说明 PATH 与 JAVA_HOME 各自影响哪个环节,如何在 macOS、Linux、Windows 上验证 java 与 javac 指向同一个 JDK;再在 library 工程里写一个 EnvironmentProbe,把版本、java.home 与编码打印出来,避开多 JDK 环境最常见的错配。
把 JDK、JRE、JVM 三个常被混用的概念拆开:JDK 里到底有什么、JRE 为什么从 JDK 11 起不再单独分发、JVM 的类加载器与运行时数据区各管什么;再用 javap、class 文件头和真实报错,把字节码结构、解释执行与 JIT 编译、常见类加载错误串起来。
把 Java 的发布节奏还原成一张可执行的选型表:六个月一个特性版本、两年一个 LTS,版本号每一段代表什么,JDK 21、25、27 各自适合谁;再给出用 --release 锁定目标版本、用 Maven Toolchains 固定构建 JDK、用 jdeps 检查依赖的落地做法。
从 library 项目「换台电脑就跑不起来」的真实问题出发,讲清字节码与 JVM 如何提供跨平台能力,以及这套机制在版本、原生库、编码与时区上的真实边界;再把 Java 的生态、工具链、向后兼容和启动、内存、样板代码的代价放在一起,帮读者判断它是否适合自己的项目。
《Java 编程入门》全书导航页:说明本书定位、读者画像与前置知识,给出零基础、有语言基础、查漏补缺三条学习路径与八周计划,并按六个部分列出 18 章 54 节的完整章节索引,另含序、前言、附录 A–D 与常见问题速查,每一节都配一句话说明,方便按需定位与跳读。