
java 中私有方法(private)仅限本类内部访问,无法被其他类(包括组合关系的 customer)直接调用;若需跨类使用,应将其改为 public 或提供 public 的封装接口。
java 中私有方法(private)仅限本类内部访问,无法被其他类(包括组合关系的 customer)直接调用;若需跨类使用,应将其改为 public 或提供 public 的封装接口。
在您提供的代码中,BasicInfo 类定义了两个私有方法:fullName() 和 alsoKnownAs()。虽然 Customer 类通过组合持有了 BasicInfo 实例(private BasicInfo bi;),但直接调用 bi.fullName() 或 bi.alsoKnownAs() 会导致编译错误——因为 private 修饰符严格限制了访问范围,即使调用方与目标类存在“拥有”关系(has-a),也不构成访问权限豁免。
✅ 正确做法是:将需要对外暴露的行为设计为 public 方法。例如:
class BasicInfo {
// ... 字段与构造器保持不变 ...
// ✅ 将私有方法升级为 public,供外部安全调用
public String fullName() {
return firstName + " " + secondName + " " + lastName;
}
public String alsoKnownAs() {
if (firstName.isEmpty() || secondName.isEmpty() || lastName.isEmpty()) {
return "N/A";
}
return firstName.charAt(0) + ". " + secondName.charAt(0) + ". " + lastName;
}
// ✅ getGender() 也应设为 public(当前已是 public,但注意:原答案中误写为 private)
public Gender getGender() { // ← 此处原代码实际为 public,符合设计
return g;
}
// 其余逻辑保持不变
}修改后,Customer.displayInfo() 中的调用即可正常编译并运行:
BIWEB 门户版几经周折,最终与大家见面了。BIWEB门户版建立在ArthurXF5.8.3底层上,有了更加强大的功能。 BIWEB WMS v5.8.3 (2010.1.29) 更新功能如下: 1.修正了底层getInfo方法中的调用参数,做到可以根据字段进行调用。 2.修正了栏目安装和卸载后,跳转链接的错误。 3.修正所有栏目分类系统,提交信息页面错误。 4.新增后台删除信息后仍停留原分
public void displayInfo() {
System.out.printf("Full name: %s%n", bi.fullName()); // ✅ 合法
System.out.printf("Also known as: %s%n", bi.alsoKnownAs()); // ✅ 合法
System.out.printf("Gender: %s%n", bi.getGender()); // ✅ 合法(原已 public)
System.out.printf("Year of birth: %d%n", birthYear);
}⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 不要尝试反射绕过访问控制(如 setAccessible(true)):这破坏封装性、降低可维护性,且在模块化环境(Java 9+)中默认受限;
- 避免滥用 protected 或包级访问:除非明确需要子类或同包扩展,否则 public + 明确语义的方法名更清晰;
- 考虑职责分离:若 Customer 需要定制化展示逻辑,可让 BasicInfo 提供通用能力,再由 Customer 组合组装(而非侵入其内部实现);
- 空值/边界校验不可少:如示例中 alsoKnownAs() 增加了非空判断,防止 charAt(0) 抛出 StringIndexOutOfBoundsException。
总结:面向对象设计强调封装与契约式交互。private 是保护内部实现的屏障,不是“暂时不可用”的占位符。当方法需被协作类使用时,应主动将其提升为 public 接口,并确保其行为稳定、文档清晰——这才是符合 Java 原则、可持续演进的工程实践。









