子类继承父类非私有成员以复用逻辑,可直接调用public/protected成员及同包默认成员,通过super()调用父类构造器和方法;private成员不可继承,需getter访问;重写应聚焦实际差异,避免无效覆盖。

子类通过继承直接获得父类的非私有成员,无需重复编写就能复用逻辑,关键在于理解“继承什么”和“怎么用”。
继承能拿到哪些东西
子类自动拥有父类的:
• public 和 protected 的字段与方法(可直接调用)
• 同一包内的默认(package-private)成员
• 父类的构造逻辑(需显式调用 super())
但 private 成员不会被继承——它们只在父类内部可见;子类若需访问,得靠父类提供的 public/protected getter 方法。
重用父类方法的常见方式
不是所有父类方法都要重写,多数时候直接用就行:
• 直接调用:比如 dog.eat() 调用的是 Animal 类中定义的 eat()
• 在子类方法中复用:比如 Dog 的 runAndBark() 里可以先调 super.run() 再执行 bark()
• 用 super 显式调用被重写的方法:当需要保留父类行为并叠加新逻辑时,例如在 @Override eat() 中先写 super.eat(),再补充“啃骨头”细节
构造过程中的逻辑复用
子类对象初始化时,父类部分必须先准备好:
• 子类构造器第一行默认或显式调用 super(...)
• 这确保父类字段(如 name、age)被正确赋值,后续子类逻辑才能安全使用
• 如果父类只有带参构造器,子类就必须显式调用,否则编译失败
立即学习“Java免费学习笔记(深入)”;
避免无效重写,聚焦真正差异
重写(@Override)不是为了“看起来像继承”,而是解决实际差异:
• 比如 Animal 的 eat() 输出“动物进食”,Dog 重写为“小狗吃骨头”,Cat 重写为“猫咪舔爪”
• 若某子类行为和父类完全一致,就不该重写——留着原方法更清晰、更易维护
• 过度重写反而破坏复用初衷,让代码变臃肿


















