抽象类的静态属性属于类本身,所有子类共享同一份内存空间,不因继承而复制,通过类名访问最清晰,无多态性。

抽象类里的静态属性,本质上就是“类级别的变量”,它不依赖于任何实例,也不因继承关系而复制多份。所以它天然被所有子类共享——不是通过继承“获得”的,而是所有子类(以及父类本身)都指向同一块内存空间。
静态属性属于类,不是属于继承链
Java 中 static 修饰的字段在类加载时初始化,只有一份,存放在方法区(或元空间)。无论这个类是普通类还是抽象类,只要它被加载,它的静态属性就存在且唯一。
- 子类不能“拥有”一份副本,也不能通过
this或实例去改变它的归属 - 子类访问该静态属性,实际是通过类名(如
AbstractParent.count)或直接继承后用自身类名(如Child.count)间接引用同一变量 - 哪怕子类也定义了同名静态字段,那只是隐藏(hiding),不是覆盖;原抽象类的静态字段依然存在、独立、可访问
子类如何访问抽象类的静态属性
推荐方式始终是使用抽象类的类名直接访问,语义清晰、无歧义:
-
AbstractAnimal.MAX_AGE—— 明确指出来源,不会受子类是否重名影响 -
Dog.MAX_AGE—— 如果 Dog 没有声明同名静态字段,JVM 会向上查找至抽象父类;但一旦 Dog 定义了public static int MAX_AGE = 15;,则此调用就指向 Dog 自己的字段,和父类无关 - 不建议用实例访问(如
new Dog().MAX_AGE),虽语法允许,但容易误导为“实例属性”
注意:静态属性 ≠ 继承得来的成员
继承机制对静态成员不起作用。子类能“看到”父类(含抽象类)的 public / protected 静态字段,是因为访问权限允许,而不是因为继承了它:
立即学习“Java免费学习笔记(深入)”;
- private 静态字段子类无法访问,哪怕在同一个包内
- 默认(package-private)静态字段仅限同包子类可访问
- protected 静态字段可在不同包子类中通过类名或继承关系访问
- static 字段没有多态性,也没有动态绑定,调用哪个类名就决定读取哪个类的字段(若未被隐藏)
一个典型例子
假设抽象类定义:
abstract class Vehicle {<br> public static int totalCreated = 0;<br> public Vehicle() { totalCreated++; }<br>}
两个子类:
class Car extends Vehicle {}<br>class Bike extends Vehicle {}
执行:new Car(); new Car(); new Bike();
此时 Vehicle.totalCreated 值为 3,Car.totalCreated 和 Bike.totalCreated 都等于 3(因为它们没定义同名字段,查找到父类)。


















