Java 类与对象

类作为模板、对象作为实例:字段与方法如何归属,new 创建了什么,引用如何指向堆上对象。

#type / concept #status / growing #tech / dev #resource / java

[!info] 关联笔记

Java 类与对象

这个概念为什么出现

Java 用描述一组状态与行为,用对象承载运行时实例。几乎所有领域模型(订单、用户、连接)都落在“对象 + 引用”上;不懂创建与引用共享,就无法理解可变状态、别名与 NPE。

[!abstract] 一句话理解 类是类型与模板;new 创建实例对象;变量持有引用(或 null),通过引用读写实例字段并调用实例方法。

最小可运行示例

场景:订单服务创建一笔订单并让两处引用观察同一状态

支付成功后更新状态;风控模块拿着同一订单引用应看到最新状态。

public class Order {
    String id;
    String status;

    void markPaid() {
        // 业务动作:状态迁移到 PAID
        this.status = "PAID";
    }

    public static void main(String[] args) {
        Order o1 = new Order(); // 在堆上创建对象,o1 持有引用
        o1.id = "ORD-1";
        o1.status = "CREATED";

        Order o2 = o1; // 引用拷贝:两个变量指向同一对象
        o2.markPaid();

        System.out.println(o1.status); // PAID,因为共享实例
        System.out.println(o1 == o2);  // true,同一引用目标
    }
}

建议运行:

javac Order.java && java Order

期望输出:

PAID
true

结合场景再看三个关注点

  1. new 之后才有实例状态;类本身不是那一笔订单。
  2. 赋值复制的是引用,不是对象深拷贝。
  3. 领域行为优先做成方法markPaid),而不是到处改字段。

核心概念与准确模型

1. 类的成员

  • 字段(状态)
  • 方法(行为)
  • 构造器、嵌套类型、初始化块等(后续篇)

2. 对象创建过程(概念模型)

  1. 分配对象内存
  2. 默认值填充字段
  3. 执行构造逻辑
  4. 返回引用给调用方

3. 引用

  • 变量类型决定编译期可见成员
  • 运行时对象有具体类
  • null 表示“没有对象”

4. 实例方法调用

引用.方法(参数)

实际执行哪个实现,在存在继承/覆盖时由运行时类型决定(多态篇)。

边界情况与反直觉行为

  1. new 就用实例成员 → 编译错或对 null 调用 NPE。
  2. 多个引用共享可变对象 → 别名副作用。
  3. 类可以没有显式字段,只作行为命名空间(常配合 static,需克制)。

常见误区

[!warning] 常见误区:把类当全局可变单例袋 全是 static 字段的“上帝类”会失去对象模型的可测试性与隔离性。

工程实践

  1. 保持对象不变量:非法状态不要被构造出来。
  2. 能不可变则不可变(final 字段 + 无 setter)。
  3. 避免暴露内部可变集合引用。
  4. 一个类一个主要职责, ord 订单别同时管邮件发送与报表。

本节总结

  • 类模板 / 对象实例 / 引用访问
  • 共享引用是协作也是风险
  • 为构造器、继承、相等性打地基

自测题

  1. Order a = b; 拷贝了什么?
  2. 为什么领域方法比公开可变字段更稳?
参考答案
  1. 拷贝引用,不拷贝对象。
  2. 方法可维护不变量与状态机,字段暴露会让外部绕过规则。

延伸阅读与资料来源

资料类型支撑内容
JLS Classes规范类声明
OOP Concepts (Oracle Tutorial)官方教程对象概念
创建于 2026/7/15 更新于 2026/7/15