静态方法应通过类名直接调用(如Math.abs(-5)),虽允许对象调用但不推荐;不能访问非静态字段、非静态方法及this/super,仅限静态成员。

静态方法用类名直接调用,不能通过对象调用(虽语法允许但不推荐),也不能访问非静态成员。
怎么调用静态方法
静态方法属于类本身,不依赖实例,因此最标准、最清晰的调用方式是:类名.方法名()。
- 例如:
Math.abs(-5)、String.valueOf(123)、MyUtils.printLog() - 虽然也能用对象引用调用(如
obj.staticMethod()),但这是误导性写法——JVM 实际仍按类去解析,且容易让人误以为该方法和对象状态有关 - 在静态上下文(如另一个 static 方法、static 块)中,可直接写方法名调用,无需加类名(前提是同个类里)
静态方法不能访问哪些东西
静态方法运行时可能没有对象实例,所以它无法直接访问:
- 非静态字段(实例变量),如
this.name或普通int count - 非静态方法(实例方法),如
doSomething()(除非先创建对象再调用) -
this和super关键字(它们都依赖具体对象)
如果真需要访问实例成员,必须显式创建对象或接收一个对象作为参数。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
常见注意事项
- 继承中不支持重写(Override),只支持隐藏(Hide):子类定义同名 static 方法,不会多态分派,调用哪个取决于引用类型,不是实际对象类型
-
不能被 synchronized 修饰为实例锁:static 方法加 synchronized,等效于
synchronized(MyClass.class),锁的是类对象,不是 this -
工具类常用 static 方法:如
Objects.equals()、Collections.sort(),设计初衷就是无状态、通用、不依赖实例 - 测试和 mock 较麻烦:多数 mock 框架(如 Mockito)不支持直接 mock 静态方法,需额外配置(MockitoInline)或改用策略接口
什么时候该用 static 方法
适合以下场景:
- 纯计算逻辑,输入全靠参数,不读写任何字段(如
StringUtils.isBlank()) - 工厂方法,创建本类或相关类对象(如
LocalDateTime.now()) - 辅助功能,与类强相关但无需维护状态(如
Arrays.asList()) - 主入口方法
public static void main(String[] args)必须是 static
如果方法需要访问对象的状态、修改实例字段、或未来可能被子类差异化实现,就别用 static。

















