应根据是否操作对象状态选择:不依赖实例字段的纯函数用静态方法,需读写this字段或支持多态的行为用实例方法。

选静态方法还是实例方法,关键看这个方法要不要操作对象的状态。
看方法是否依赖对象数据
如果方法只靠传入的参数就能完成任务,不读写任何成员变量,就该用静态方法。比如计算两个数的和、判断字符串是否为空——这些跟具体对象无关。
- 能用参数解决的,优先静态:Math.max(a, b)、Objects.equals(a, b)
- 要读或改 this 的字段,必须用实例方法:account.deposit(100)、list.add(item)
- 哪怕只读一个实例变量,也不能写成静态,否则编译报错
看调用场景是否需要对象上下文
静态方法适合“拿来即用”,不用先 new 对象;实例方法天然绑定对象生命周期,适合封装行为逻辑。
- 工具类(如 StringUtils、DateUtils)全用静态方法,方便随处调用
- 代表实体的类(如 User、Order)核心行为用实例方法,体现“谁在做什么”
- 工厂方法(如 LocalDate.now()、Collections.emptyList())虽返回对象,但本身是静态的——创建动作不依赖已有实例
注意多态和扩展性限制
静态方法不能被重写,子类同名方法只是隐藏父类方法;实例方法支持多态,运行时按实际类型调用。
- 需要子类定制行为(比如不同 PaymentStrategy 的 pay()),必须用实例方法
- 纯功能函数(如 JSON.parse()、Base64.encode())没多态需求,静态更清晰
- 误把可重写的逻辑写成静态,后期扩展会受限
避免常见误用
不是“加了 static 就更快”,也不是“所有工具都该静态”。混淆会导致设计僵硬或运行错误。
- 在静态方法里 new 对象再调它的实例方法,可以;但直接访问 this 或非静态字段,不行
- 把本该属于对象状态的操作(如更新余额、修改配置)写成静态,等于绕过封装
- 一个类全是静态方法,可能说明它本不该是类——考虑用接口+默认方法,或纯函数式设计
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











