抽象类的非私有成员变量可被子类继承并按访问权限正常使用:public/protected变量直接访问,包级变量同包可见,private变量需通过getter访问;子类构造必须调用super()初始化父类变量。

抽象类里的非抽象成员变量(比如 public、protected 或包访问权限的字段)能被子类正常继承和使用,规则和普通类完全一致——只要不是 private,子类就能直接访问或通过继承链调用。
非抽象变量的继承方式
抽象类中声明的非私有成员变量,子类会“拥有”它们,就像自己定义的一样:
-
public/protected 变量:子类可直接通过变量名访问(如
name),也可用this.name或super.name明确指代 - 默认(包级)访问权限变量:只要子类与抽象父类在同一个包内,就能直接访问;跨包则不可见
- private 变量:不会被继承,子类无法直接访问,只能靠父类提供的 public/protected getter 方法间接获取
子类如何使用这些变量
子类对象创建后,这些变量就作为实例的一部分存在。使用时注意访问权限和初始化时机:
- 子类构造方法中通常需调用
super(...),确保父类(含抽象类)的变量被正确初始化 - 若抽象类有带参构造方法,子类必须显式调用它,否则编译报错(因为抽象类无默认无参构造)
- 变量值在父类构造过程中赋值,子类可后续修改(除非该变量被
final修饰)
一个典型例子
假设抽象类定义如下:
abstract class Animal {<br> protected String name;<br> public int legs = 4;<br> private String id;<br><br> public Animal(String name) {<br> this.name = name;<br> this.id = "AN" + System.nanoTime();<br> }<br><br> public String getId() { return id; }<br>}子类继承并使用:
class Dog extends Animal {<br> public Dog(String name) {<br> super(name); // 必须调用,否则 name 不会被初始化<br> }<br><br> public void show() {<br> System.out.println(name); // ✅ 可直接访问 protected 字段<br> System.out.println(legs); // ✅ 可直接访问 public 字段<br> System.out.println(getId()); // ✅ 通过 getter 访问 private 字段<br> }<br>}注意事项
几个容易出错的关键点:
- 抽象类的变量不因“抽象”而特殊——是否可继承只取决于访问修饰符,和类是否抽象无关
- 子类不能重写(override)变量,但可以定义同名变量造成“隐藏”,此时建议用
super.变量名明确调用父类版本 - 静态变量也遵循相同规则:
public static可被子类直接用类名或对象访问;private static则不可见
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











