Java 常用语法极简通关(六):方法重载、访问修饰符与封装 开篇先制造一个事故第五章的 Worker 类有个敞开的后门——字段全是默认权限谁都能直接改。看这个事故Worker w new Worker(张伟, 85, 综采一队); w.score -999; // 编译通过负数成绩入库了 w.score 10086; // 也行超满分了编译器不拦、运行不报错但数据已经脏了。真实项目里这种脏数据会顺着报表一路污染下去查都查不出来源。这一章就把这个后门焊死顺便讲透两个高频语法访问修饰符和方法重载。先看改造后的完整代码public class Worker { // 1. 字段全部 private外面谁也摸不到 private String name; private int score; private String team; // 2. 构造方法重载三个参数的和两个参数的都能用 Worker(String name, int score, String team) { this.name name; this.setScore(score); // 构造也走校验通道 this.team team; } Worker(String name, String team) { this.name name; this.score 0; // 默认 0 分 this.team team; } // 3. getter/setter对外唯一的读写通道 public String getName() { return name; } public int getScore() { return score; } public void setScore(int score) { if (score 0 || score 100) { System.out.println(非法成绩 score 本次赋值被忽略); return; } this.score score; } public String getTeam() { return team; } public void setTeam(String team) { this.team team; } // 4. 打印方法也做重载默认一行输出也能带标题 void printInfo() { System.out.println(team | name | score 分); } void printInfo(String title) { System.out.println(【 title 】); printInfo(); // 复用上面的逻辑 } }用起来public class WorkerApp { public static void main(String[] args) { Worker w1 new Worker(张伟, 85, 综采一队); Worker w2 new Worker(李强, 掘进三队); // 两参构造 w1.setScore(-999); // 非法成绩-999本次赋值被忽略 w1.setScore(92); // 合法通过 // w1.score -999; // 编译报错字段已 private直改无路 w1.printInfo(复核后的成绩); w2.printInfo(); } }输出非法成绩-999本次赋值被忽略 【复核后的成绩】 综采一队 | 张伟 | 92 分 掘进三队 | 李强 | 0 分这段代码里有本章的全部主角private、public、getter/setter、两组方法重载。逐个讲。第一部分访问修饰符——给成员划可见范围Java 用修饰符控制谁能访问这个成员。日常开发真正常用的就两个半修饰符含义日常用法private仅本类内部可见字段的标配public任何人可见方法对外的服务的标配不写默认同包内可见偶尔用认识即可protected同包 子类可见继承场景用第七章再细说用法上记住一句主流实践字段 private方法 public。字段是对象的内脏private 锁起来方法是对象提供的服务窗口public 敞开。外部想读写字段只能通过方法这个窗口而方法里可以设卡——比如 setScore 里的范围校验。这就是封装数据和对数据的保护绑在一起把能改变成按规矩改。注意一个细节private 锁的是类外同类内部随便访问。所以构造方法里this.setScore(score)调用自己的私有逻辑畅通无阻构造也走了校验通道——这是个好习惯校验逻辑只写一处所有赋值路径共用。第二部分getter/setter——Java 世界的标准窗口字段 private 之后对外的读写通道就是这对命名规范的方法public int getScore() { // getter读 return score; } public void setScore(int score) { // setter写 if (score 0 || score 100) { return; // 校验不过直接挡回 } this.score score; }命名是铁打的习惯字段score→ 方法getScore/setScore首字母大写接在后面。boolean 字段的 getter 习惯用is开头如isNeedRepair()。别嫌这套东西啰嗦——它是 Java 生态的通用货币Spring、MyBatis、JSON 序列化库全都默认按 getter/setter 的名字来读写你的对象。一个只有 private 字段、没有 getter 的类JSON 库序列化出来就是空对象。所以这不是风格问题是能不能和框架协作的问题。灵活度也在你手里只给 getter 不给 setter →只读字段比如工号创建后不许改setter 里加校验 →受控写入本章案例;不写 getter/setter提供业务方法代替 → 比如只暴露addScore(int delta)加分不让人直接设分业务语义更强。第三部分方法重载Overload——同名不同参案例里有两组重载// 构造方法重载 Worker(String name, int score, String team) { ... } Worker(String name, String team) { ... } // 打印方法重载 void printInfo() { ... } void printInfo(String title) { ... }重载 同一个类里方法名相同、参数列表不同个数或类型不同的一组方法。调用时编译器按你传的实参自动对号入座new Worker(李强, 掘进三队)匹配两参版本printInfo(标题)匹配带 String 的版本。重载的价值是用同一个名字表达同一类操作打印都叫 printInfo建对象都叫 new Worker使用者不用记一堆printInfoWithTitle、printInfoSimple之类的名字。Java 类库里重载随处可见——System.out.println()能打印 int、double、String、对象背后就是一连串重载。三个关键规则软考常考看的是参数列表不看返回值。下面这种重载编译报错int add(int a, int b) { ... } double add(int a, int b) { ... } // 报错参数列表相同仅返回值不同不算重载道理很简单调用add(1, 2)时编译器根本不知道你想要哪个返回值无法区分。参数名不同也不算重载看的是参数类型序列add(int x, int y)和add(int a, int b)是同一个方法重复定义报错。重载发生在同一个类里。子类和父类之间的同名方法是另一个概念——重写Override第七章的主角到时候对比着记。重载方法之间互相复用也是常见手法案例里printInfo(String title)内部直接调用了无参的printInfo()逻辑不重复写。常踩的坑排雷清单字段忘了 private写完类先扫一眼字段——裸奔的字段就是埋雷IDE 生成 getter/setter 是几秒钟的事。以为返回值不同就是重载不是。重载只认参数列表这是考试最爱挖的坑。setter 里不校验setter 形同虚设、直给直取等于把 private 的保护又拆了。至少对明显有合法范围的字段分数、年龄、数量设卡。构造方法绕过 setter在构造里直接this.score score校验就被架空了。案例的做法——构造也调 setScore——值得抄走。boolean 字段的 getter 叫错isNeedRepair()是习惯命名写成getNeedRepair()有些框架识别不了。重载和重写混淆重载同类、同方法名、参数不同、编译期定重写父子类、同签名、运行时定。第七章讲完重写后回来对比一次彻底分清。本章小结访问修饰符日常就记两个半字段 private方法 public默认不写认识即可。封装 private 字段 getter/setter 通道 setter 里设卡校验这套命名规范是整个 Java 框架生态的通用货币。重载同类中同名方法靠参数列表区分与返回值无关构造方法和普通方法都能重载重载间互相调用可避免重复逻辑。到这里一个 Worker 类已经五脏俱全私有字段、受控通道、多组构造。但现实的业务不止一种人——班长比普通工人多了班组管理职责安全员多了一票否决权。难道每类人都从零写一遍下一章继承、方法重写、抽象类与接口——面向对象最精彩的一章也是软考设计模式题的地基。