extends只能用于类继承,不能修饰接口或方法;它表示子类单继承父类,接口继承用implements,Java不支持多类继承,final类不可被继承,子类构造器必须调用父类构造器。

extends 只能用于类继承,不能修饰接口或方法
Java 中 extends 是类与类之间建立单继承关系的唯一关键字,它明确表示“子类扩展父类”。你不能用它去实现接口(该用 implements),也不能用它修饰字段、方法或局部变量——编译器会直接报错 illegal start of type 或 unexpected token。
常见误写:
interface B extends A {} // ❌ 错!接口继承接口应使用 extends,但这里 A 若是类就非法;若 A 是接口,语法虽对,但语义不符本题场景(本题聚焦类继承)
class C extends void method() {} // ❌ 完全语法错误
class D extends E, F {} // ❌ Java 不支持多类继承- 一个类最多只能有一个直接父类(
extends后只能跟一个类名) - 如果类没写
extends,默认隐式继承java.lang.Object -
final类不能被extends,否则编译失败:cannot inherit from final 'X'
子类构造器必须显式或隐式调用父类构造器
只要用了 extends,子类所有构造器的第一行(哪怕没写)都必须是 super(...) 或 this(...)。如果父类没有无参构造器,而子类构造器又没显式调用 super(…),编译就会失败:constructor X in class Y cannot be applied to given types。
示例:
立即学习“Java免费学习笔记(深入)”;
class Parent {
Parent(String name) { /* 仅此有参构造 */ }
}
class Child extends Parent {
Child() {
// ❌ 编译错误:找不到合适的 super()
// ✅ 必须补上:super("default");
}
}- 若父类只有有参构造器,子类每个构造器都得显式写
super(...) -
super()必须是构造器第一句;放在第二句会报call to super must be first statement - 不写
super(...)也不写this(...)时,编译器自动插入super()—— 所以父类必须存在无参构造器
继承后无法访问父类 private 成员,但可调用 public/protected 方法
子类通过 extends 获得的是父类的“可见接口”,不是全部代码拷贝。private 字段和方法在子类中不可见,连编译都过不去;但 protected 和 public 成员可直接使用(除非被子类同名成员隐藏)。
典型混淆点:
class A {
private int x = 10;
protected void print() { System.out.println(x); }
}
class B extends A {
void test() {
// System.out.println(x); // ❌ 编译错误:x has private access in A
print(); // ✅ OK,protected 方法可继承并调用
}
}-
private成员不会被继承,子类里查不到、不能重写、也不能反射直接访问(除非设setAccessible(true),但那是另一回事) - 子类定义了同名
public方法,并不叫“重写private方法”——因为父类那个根本不可见,这只是个全新方法 - 字段永远不被重写(只有方法才谈重写),子类同名字段只是隐藏(hiding),不是覆盖
泛型类继承需注意类型擦除与桥接方法
带泛型的父类被继承时,子类是否保留泛型、如何指定类型参数,直接影响方法签名和多态行为。Java 在编译期擦除泛型,但会生成桥接方法(bridge methods)来保证多态调用正确性——这点容易在重写泛型方法时出问题。
例如:
class Box{ T value; void set(T v) { value = v; } } class StringBox extends Box { @Override void set(String v) { super.set(v); } // ✅ 正确重写 // 编译器会自动生成 bridge 方法:void set(Object o) { set((String)o); } }
- 子类若写
class StringBox extends Box(原始类型),虽然能编译,但失去类型安全,且无法重写set(T)的具体版本 - 若父类方法签名含泛型类型(如
U convert(U input)),子类重写时不能改类型参数名或约束,否则视为新方法而非重写 - IDE 或
javap -c可看到桥接方法,它们对开发者透明,但调试时可能困惑“为什么断点进了两个同名方法”
子类能否访问父类成员、构造器怎么联动、泛型如何传递——这些不是靠记住 extends 写在哪行,而是取决于它触发的那套继承契约。最容易忽略的是:父类构造器调用规则和 private 的“不可继承性”,这两点一旦出错,往往报错信息不直观,需要回溯到继承链起点看声明。










