static 关键字的 特殊性
static
关键字的 “特殊性” 主要体现在其与类、对象的绑定关系,以及由此带来的一些反常规规则,具体如下:
生命周期与内存位置特殊
- 静态成员(变量 / 方法)随类加载而创建,随类卸载而销毁,生命周期与类一致,远长于对象(对象随创建而存在,垃圾回收时销毁)。
- 静态变量存储在方法区(而非堆内存),所有对象共享同一份,修改时会影响所有使用该变量的地方。
访问方式特殊
- 可直接通过
类名.成员
访问,无需创建对象(非静态成员必须通过对象访问)。 - 即使对象被销毁,静态成员仍可正常访问(只要类未卸载)。
- 可直接通过
内部限制特殊
- 静态方法中不能直接使用非静态成员(变量 / 方法),因为非静态成员依赖对象存在,而静态方法调用时可能无对象。
- 静态方法中不能使用
this
或super
关键字,因为this
指向当前对象,而静态方法不依赖对象。
继承与重写的特殊性
- 静态方法不能被重写(Override),只能被 “隐藏”(子类定义同名静态方法时,父类方法被隐藏,而非重写)。
- 调用静态方法时,实际执行的版本由编译时类型决定(非静态方法由运行时类型决定),违背多态的动态绑定规则。
静态内部类的独立性
- 静态内部类可独立实例化,无需先创建外部类对象;而非静态内部类必须依赖外部类对象存在。
- 静态内部类中不能访问外部类的非静态成员,只能访问外部类的静态成员。