不推荐用对象访问静态变量,因编译器会转为类名访问且易混淆设计边界;应统一使用类名(如math.pi),避免new myclass().count等写法。

可以,但不推荐。
语法上允许,但属于“语法糖”
Java 编译器允许你用 obj.staticVar 的方式访问静态变量,看起来像是对象在调用。但实际上,编译器会自动把它转成 ClassName.staticVar,JVM 执行时完全不依赖那个对象实例——哪怕 obj 是 null,只要没触发空指针异常(比如没调用方法),这行代码依然能正常运行。
- 这不是真正的“对象访问”,只是语言层面的写法宽容
- 底层仍走类级别访问路径,内存中只有一个副本
- IDE(如 IntelliJ、Eclipse)通常会给出警告或提示,建议改用类名
为什么官方不鼓励这种写法
它模糊了静态成员和实例成员的设计边界,容易引发误解:
- 新人可能误以为
obj.staticVar操作的是该对象独有的变量 - 代码可读性下降,别人一眼看不出这是共享的类级资源
- 如果未来把变量从
static改成非static,所有用对象调用的地方都会直接报错
实际开发中的推荐做法
统一使用类名访问,明确语义:
- ✅ 推荐:
Math.PI、StringUtils.isEmpty(str)、MyClass.COUNT - ⚠️ 避免:
new MyClass().COUNT、myObj.SOME_CONSTANT - 特别注意:私有静态变量(
private static)只能通过类内部或公共静态方法访问,对象引用根本无法触达
和实例变量对比更清楚
实例变量必须通过对象访问,没有类名路径;静态变量则相反——类名是本质路径,对象路径只是“借道”。这种不对称恰恰说明:静态变量不属于对象,只属于类。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











