Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

怎样在 Java 代码中落实关联、聚合和组合?

先说出你的答案

定义边界、关键机制、一个反例;P8题再补容量、失败与验证。

查看完整题解

参考回答

直接回答

这些关系最终常以引用和方法调用实现,但区别靠业务约束落实:普通关联允许对象相互协作;聚合保留部件独立存在或共享的能力;组合需要限制部件归属,让整体负责部件的创建、变更和移除。字段的类型、final 修饰或 new 的位置都不能单独证明关系。

讲清原理

以订单明细为例,若明细由订单内部创建,不提供把现有明细挂到任意订单的入口,也不泄露可随意改写的列表,就更容易保持组合约束。聚合则可能接收已有对象引用,例如多份书单共享同一本图书的目录对象。

这里的“拥有”是业务和模型语义。Java 的垃圾回收看可达性,不识别 UML 菱形;资源清理也仍要依靠明确的关闭机制。

关联表示联系,聚合表示共享整体关系,组合强调独占部件
关联表示联系,聚合表示共享整体关系,组合强调独占部件

例子与易错点

class Order {
    private static final class Line {}
    private final java.util.List<Line> lines = new java.util.ArrayList<>();
    void addLine() { lines.add(new Line()); }
    int size() { return lines.size(); }
}
Order order = new Order();
order.addLine();
System.out.println(order.size()); // 1

这段代码展示封装创建入口,不是完整的订单模型。若把内部可变列表直接返回,外部仍可能绕开规则。设计关系要检查可操作的约束,不能只给字段加一句“这是组合”的注释。

相关题:第 1 题、第 11 题、第 15 题、第 17 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。