java中extends实现单继承,需注意构造器调用顺序、访问控制、private不可继承等规则,滥用会导致高耦合;应基于“is-a”关系审慎设计。

Java里用extends写继承,不是加个关键字就完事
Java中extends确实是最直接的继承语法,但写错位置、忽略访问控制或搞混构造器调用顺序,代码立刻编译失败或行为异常。最常见的是子类忘了显式调用父类构造器,或者把private成员当成了可继承资源。
-
extends只能跟在类名后、类体前,且一个类最多extends一个父类(Java不支持多继承) - 父类的
private字段和方法不会被继承——子类里看不到,也不能用super.xxx访问 - 如果父类只有带参构造器,子类必须在第一行写
super(...),否则编译报错:Constructor Xxx() is undefined - 子类重写方法时,不能降低访问权限(比如父类是
protected,子类不能改成private)
什么时候该用继承,而不是组合或接口
继承本质是“is-a”关系,不是“has-a”或“can-do”。滥用extends会让类耦合变紧,改父类就容易牵一发而动全身。
- 适合继承:比如
Dog是Animal的一种,共享生命周期、行为框架;ArrayList是AbstractList的具体实现 - 不适合继承:比如
Car有Engine,该用字段组合,而不是让Car extends Engine——这明显违背常识 - 优先考虑
interface+ 默认方法:需要多行为扩展时(如Runnable、Comparable),比单继承更灵活
super不是万能转发器,用错会触发空指针或逻辑错乱
super只在子类中有效,且仅用于访问父类中被子类覆盖或隐藏的成员。它不等于“父类实例”,也不是运行时动态绑定的代理对象。
- 在子类构造器中,
super()必须是第一行语句;否则编译报错:Call to super() must be first statement in constructor -
super.toString()调用的是父类版本,但如果父类toString()依赖了未初始化的字段,可能返回null或默认值 - 不能在
static上下文中用super——super属于实例,而static属于类 - 如果父类方法被
final修饰,super.xxx()可以调用,但子类无法重写它
继承链过深会让instanceof和类型转换变得脆弱
三层以上继承(比如A → B → C → D)会让类型判断和向下转型越来越难维护。JVM虽然支持,但人脑容易漏掉中间层约束。
立即学习“Java免费学习笔记(深入)”;
-
instanceof检查的是实际运行时类型,不是声明类型;但若父类引用指向子类实例,instanceof仍返回true - 强制转型前务必先
instanceof检查,否则抛ClassCastException - 泛型擦除后,
List<string></string>和List<integer></integer>在运行时都是List,继承关系无法靠泛型体现 - 工具类如
Objects.equals()内部用了instanceof,但自己写等价逻辑时容易忽略子类字段是否参与比较






