发布于2026-07-05 阅读(0)
扫一扫,手机访问
Ja va 中用 extends 实现继承,核心目标不是“多写一行代码”,而是让子类天然拥有父类的共性能力,并在需要时安全定制。它不是简单的复制粘贴,而是一套有规则、有边界、讲时机的复用机制。

简单说,extends 声明的是一种“is-a”关系:Dog 是 Animal,Employee 是 Person。这种语义决定了你是否该用继承——如果只是“有某个功能”(比如 Car 有 Engine),那就该用组合,而不是去 extends Engine。
那具体有哪些硬性规则?子类自动获得父类的 public、protected 以及同包下的 default 成员;private 成员不可见,当然也无法继承。构造器不会被子类继承,但子类必须通过 super() 显式或隐式调用父类构造器,而且 super() 必须是子类构造器的第一条语句。另外,static 方法不参与继承链,子类里写一个同名方法属于“隐藏”,不是重写。一个类只能 extends 一个父类——Ja va 不支持多继承,这一点从设计上就避免了 C++ 里菱形继承的坑。
复用的前提是字段和方法对子类可见,而且在对象创建时能正确初始化。实操上可以这么做:把通用字段(比如 id、name、createTime)定义在父类里,用 protected 或 public 修饰;然后在父类构造器里完成这些字段的初始化,比如 this.id = System.nanoTime();。子类构造器第一行写 super() 或 super(args),保证父类部分先准备妥当。通用逻辑——比如校验、日志、序列化前处理——封装成 protected 方法,子类既可以直接调用,也可以按需重写。
重写不是推倒重来,而是“在父类基础上加点自己的东西”。漏掉 super 调用,往往意味着丢失了关键逻辑。保持签名一致(方法名、参数列表、返回类型兼容)是基本要求,建议随手加上 @Override 注解——编译器会帮你检查拼写错误。若需要保留父类行为,务必显式写 super.methodName();只写 methodName() 会递归调用自己,导致栈溢出。访问权限不能更严格(比如父类是 protected,子类不能改成 private),但可以更宽松(比如改成 public)。另外,final 方法不可重写,static 方法只能隐藏,不能重写。
很多编译错误或运行时异常,根源都在于对 extends 规则理解不到位。比如:父类只有带参构造器,子类没写 super(args),编译直接报错“Implicit super constructor is undefined”。在 super() 前使用 this.xxx 或普通语句,编译报错“Call to super() must be first statement”。子类定义了和父类同名的字段,会发生字段遮蔽——访问哪个值取决于引用类型,很容易误判。还有一种常见的误解:以为 private 方法能被子类继承或重写,实际上子类根本看不到它,也不存在重写一说。
掌握这些规则,继承才能真正成为代码复用的利器,而不是埋坑的源头。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8