问题背景:
从一开始,Java就引入了类的静态成员的概念,与实例成员不同——这些变量存储在类级别而不是对象级别。这允许在所有类的实例之间共享数据,或者用于常量和服务结构。
问题:
静态字段的主要任务是为类的所有对象提供数据或实现单一访问点。但是,不当使用static可能导致难以捉摸的错误,与全局状态、数据竞争和测试问题有关。
解决方案:
静态字段通过关键字static声明:
public class Counter { public static int globalCount = 0; public Counter() { globalCount++; } }
每次创建实例时,计数器都会增加,该值通过Counter.globalCount访问,不依赖于对象。
关键特性:
可以通过对象而不是类名访问静态字段吗?
可以,语法允许通过对象访问静态字段,但这会导致代码可读性差,有时可能令人困惑。最好始终通过类名进行访问。
Counter c = new Counter(); System.out.println(c.globalCount); // 工作,但不推荐
静态字段可以是私有的吗?
可以,访问级别没有限制。私有静态字段通常与公共静态方法一起使用(例如,用于单例):
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
尝试用依赖于非静态的值初始化静态字段会发生什么?
这样的代码无法编译,因为非静态字段在静态字段之后初始化。静态字段不能直接引用非静态字段。
在大型应用程序中,将static字段用于存储特定于用户的缓存数据。
优点:
缺点:
使用public static final String存储常量(例如,错误代码或标准参数)。
优点:
缺点: