extends 是 Java 中声明单继承的唯一关键字,格式为 class 子类名 extends 父类名,父类不能是 final 或非 public(跨包时),不可多继承,子类继承 public/protected 成员,构造器需显式调用 super(参数) 若父类无无参构造。

extends 是 Java 中声明继承关系的唯一关键字,一个子类只能直接继承一个父类(单继承),这是语法铁律。
如何正确写出继承声明
格式固定为:class 子类名 extends 父类名,且 extends 必须紧跟在子类声明后、类体前。
- 父类不能是
final类,否则编译报错:Cannot inherit from final 'XXX' - 子类和父类必须在同一个包中,或父类为
public,否则会因访问权限不足导致编译失败 - 接口不能用
extends继承类(那是implements的事),也不能用extends去“继承”另一个接口以外的类型
class Animal {
public String name;
public void eat() { System.out.println(name + " 吃饭"); }
}
class Dog extends Animal { // ✅ 正确:public 类 + extends
public void bark() { System.out.println(name + " 汪汪"); }
}
为什么不能写成 class Dog extends Animal, Runnable
Java 明确禁止多继承类——这种写法会直接触发编译错误:error: '{' expected 或更明确的 error: multiple inheritance not allowed。
- 如果需要多个行为,应让
Dogimplements Runnable(实现接口) - 若需复用另一类逻辑,考虑组合(has-a)而非继承(is-a),比如在
Dog中持有一个Tracker对象 - 切勿试图用内部类或匿名类绕过该限制,那不是继承,也不解决设计问题
继承后子类能直接用父类哪些成员?
子类自动获得父类 public 和 protected 成员(字段与方法),但无法直接访问 private 成员——哪怕在同一个文件里。
-
private字段如private int id,子类中写id = 100会报错:cannot find symbol - 正确做法是父类提供
public int getId()/public void setId(int),子类通过这些方法间接访问 - 若父类只有
default(包访问)成员,子类必须与父类在同一个包,否则不可见
最容易被忽略的构造链陷阱
子类构造方法默认第一行隐式调用 super(),即父类无参构造。一旦父类删掉了无参构造,子类立刻编译失败:constructor ParentClass() is undefined。
立即学习“Java免费学习笔记(深入)”;
- 解决方式只有两个:要么给父类补上
public ParentClass() {};要么在子类构造中显式写super(参数),且必须是第一行 -
super()和this()互斥,不能共存于同一构造方法中 - 静态方法里不能用
super,写了就报错:non-static variable super cannot be referenced from a static context
extends 背后的初始化顺序和访问边界来定位。










