Java继承必须显式用extends声明且单继承,private成员编译期不可见,重写需满足签名、访问权限和异常约束,@Override注解强制校验合法性。

Java 中的继承不是“能不能实现”,而是“必须按规则写,否则编译直接报错”。核心就一条:extends 关键字只能用于类声明,且一个类最多继承一个父类。
如何正确声明继承关系
继承必须显式写出 extends,Java 不支持隐式继承(比如不写就默认继承 Object 是自动发生的,但你不能省略 extends 来表达自定义继承)。
-
class Child extends Parent是唯一合法语法;class Child extends Parent1, Parent2会触发编译错误error: class, interface, or enum expected - 父类不能是
final类,否则编译器报error: cannot inherit from final - 构造方法不会被继承,子类必须显式调用
super(...)(或让编译器插入默认无参super()),否则编译失败
为什么子类访问不了父类的 private 成员
这不是继承失效,而是访问控制在编译期就拦截了。即使子类继承了父类,private 字段和方法对子类不可见——连名字都“不存在”于子类作用域中。
- 常见误操作:在子类里直接写
this.privateField或super.privateMethod()→ 编译错误error: cannot find symbol - 正确做法:父类提供
protected或public的 getter/setter,或把字段改为protected(仅限受信继承体系) - 注意:
private成员仍参与内存布局(子类实例对象里有它们),只是语法层禁止访问
继承后方法重写要注意什么
重写(override)不是覆盖(overwrite),它受签名、修饰符、异常三重约束,违反任一条件都会变成重载(overload)或编译失败。
立即学习“Java免费学习笔记(深入)”;
- 子类方法签名(名称 + 参数类型)必须与父类完全一致;返回类型可以是父类返回类型的子类型(协变返回)
- 子类方法的访问权限不能比父类更严格:父类是
protected,子类不能写private;但可以写public - 子类不能抛出比父类方法声明更多、更宽泛的检查异常(
Exception),否则报error: overridden method does not throw - 加
@Override注解不是可选的——它是编译器帮你校验重写是否合法的强制开关
真正容易卡住的地方,往往不是语法写错,而是没意识到 private 成员不可见、final 类不可继承、或者把重写写成了重载却没加 @Override 导致逻辑静默失效。










