java中extends复用的是父类public和protected成员;private字段和构造器不被继承,但可通过super()调用;static方法可继承不可重写;子类构造器必须第一句调用super();重写方法应调用super逻辑;多层继承易导致耦合与维护问题。

Java里用extends继承父类,到底复用了什么?
不是所有代码都能被子类直接用。只有public和protected成员(字段、方法)能被继承;private字段和构造器不会被继承,但子类可以通过super()调用父类构造器来参与初始化。
- 子类不能访问父类
private字段,哪怕同包也不行——常见错误是以为“同包就能绕过” -
default(包私有)成员只在同包下可访问,跨包子类拿不到,别误判为“继承失败” - 父类的
static方法会被继承,但无法被重写(只能隐藏),调用时看引用类型而非实际对象类型
子类构造器必须显式或隐式调用super()
Java编译器会在子类无参构造器第一行自动插入super(),但只要父类没无参构造器,就会报错:Constructor not defined。这不是语法糖失效,而是JVM强制要求对象初始化链完整。
- 如果父类只有带参构造器,子类每个构造器都得用
super(...)明确调用其中一个 -
super()必须是构造器第一句,否则编译不通过;放第二行?直接error: call to super must be first statement - 别想用
this()代替super()——它只是调本类其他构造器,最终仍要落到super()上
重写toString()、equals()这些方法时,记得调super逻辑
很多初学者重写时从头手写,结果丢掉父类已有的字段逻辑。比如父类Person有name,子类Student加了id,但toString()里只拼id,name就没了。
- 重写
toString()建议用super.toString() + ", id=" + this.id,而不是另起炉灶 -
equals()里先if (!super.equals(obj)) return false;,再检查子类特有字段,否则父类字段比较被跳过 - 漏掉
super.hashCode()会导致HashMap里同一对象存两次——因为hashCode()和equals()不一致
继承深度超过两层就要警惕设计问题
Java支持多层继承(A → B → C),但每多一层,耦合就加重一分。父类一改,所有下游子类都可能崩,尤其是当父类暴露了protected方法供子类覆写时,语义契约极难维护。
立即学习“Java免费学习笔记(深入)”;
- 三层以上继承链中,
protected方法的实际调用路径常被忽略,调试时容易误判“谁改了这个值” - Android开发里常见
Activity → AppCompatActivity → FragmentActivity → ComponentActivity,这种是框架强依赖,业务代码别学 - 多数时候,组合(has-a)比继承(is-a)更可控:把父类逻辑抽成
Helper或Service,用字段持有,而不是拉长继承树
继承不是“写个extends就完事”,关键在父子之间的契约是否清晰、变更是否可预期。最麻烦的从来不是语法,而是某个protected方法在第4层子类里被悄悄重写了,而没人记得它还影响着初始化顺序。








