子类不能继承父类静态属性,但可通过父类名直接访问(如parent.staticfield),因其属于类而非实例;同名字段在子类中会遮蔽父类字段,二者独立;访问受修饰符限制。

子类不能“继承”父类的静态属性,但可以直接访问它——只要访问权限允许(如 public 或 protected),无需继承关系也能用,更不用实例化。
直接通过父类名访问静态属性
这是最常用、最清晰的方式。静态属性属于类本身,不是某个对象,所以子类里写 Parent.staticField 就能读取或修改:
- 即使子类没写
extends Parent,只要在同一个包或满足访问修饰符规则,也能这么用 - 修改它会影响所有地方对该静态属性的引用,包括父类、子类、其他任意类
- 不推荐在子类中用
this.staticField或super.staticField——语法虽可能通过,但语义模糊且易误导
避免同名遮蔽导致误读
如果子类自己也声明了同名的 static 字段,比如:static String staticAttribute = "子类自己的值";
那么在子类内部写 staticAttribute 会指向子类的字段,而不是父类的。要明确访问父类的,必须写全 Parent.staticAttribute。
- 这不是“覆盖”,而是两个独立的静态变量,只是名字一样
- JVM 不会自动把父类静态字段“拉进”子类作用域;写错名或省略类名,很可能读到的是子类自己的副本
通过父类的静态方法间接访问
如果父类提供了 public static 方法来读/写该属性(比如 getStaticValue()、setStaticValue(...)),子类调用这些方法也是安全、规范的做法:
- 适合需要封装逻辑的场景(如校验、日志、懒初始化)
- 比直接访问字段更利于后期维护和扩展
- 调用方式为
Parent.getStaticValue(),和字段访问一样不依赖实例
注意访问修饰符的实际限制
能否访问,取决于父类静态字段的修饰符:
-
public:任何地方都能用Parent.field -
protected:同包内或子类中可用(跨包子类也可) - 默认(包级私有):仅限同包内的子类可访问
-
private:子类无法直接访问,必须靠父类提供的 public static 方法中转











