java继承通过extends实现代码复用,子类获得父类非私有成员,构造器默认调用super(),支持重写非final方法;受限于单一继承,需结合接口与组合使用。

Java 中通过 extends 关键字实现继承,本质是让子类“获得”父类的非私有成员(字段和方法),从而避免重复编写相同逻辑,达到代码复用的目的。
继承的基本写法与复用机制
使用 extends 声明子类继承父类后,子类自动拥有父类中 public 和 protected 修饰的字段与方法(以及默认访问权限下同包内的成员)。这些成员无需重新定义,可直接调用或在子类中扩展。
- 父类中 private 成员不会被继承,子类无法访问,也不能算作复用的一部分
- 构造方法不被继承,但子类构造器默认会通过 super() 调用父类无参构造器(若父类无无参构造,需显式调用)
- 子类可重写(override)父类的非 final 方法,在保留原有功能基础上定制行为
复用的实际例子:通用属性与行为提取
比如多个业务实体(如 Student、Teacher、Employee)都有姓名、年龄、打印信息等共性,可抽象出父类 Person:
class Person {
protected String name;
protected int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("我是 " + name + ",今年 " + age + " 岁。");
}
}
class Student extends Person {
private String studentId;
public Student(String name, int age, String studentId) {
super(name, age); // 复用父类构造逻辑
this.studentId = studentId;
}
// 直接复用 introduce(),也可选择重写
@Override
public void introduce() {
super.introduce(); // 复用父类行为
System.out.println("我的学号是:" + studentId);
}
}
Student 类无需重复定义 name/age 字段和基础介绍逻辑,仅关注自身特有属性和差异化行为。
复用时的关键注意事项
- 单一继承限制:Java 不支持多继承(一个类只能 extends 一个父类),但可通过接口(implements)补充能力复用
- 访问控制影响复用效果:父类用 private 封装字段时,子类应通过 public/protected 的 getter/setter 访问,而非直接读写
- 方法重写要谨慎:若父类方法已满足需求,不重写就是最直接的复用;重写是为了增强或调整,不是必须操作
- 组合优于继承:当“has-a”关系更自然(如 Car 有 Engine),优先用字段引用+委托,而非强行用 extends
继承复用的本质是“能力传递”,不是代码拷贝
extends 不是把父类代码复制进子类,而是建立运行时的类型关系:子类对象在内存中包含父类部分的结构,JVM 在调用方法时按继承链向上查找。这意味着:
- 修改父类逻辑,所有继承它的子类自动受益(符合开闭原则中的“对扩展开放,对修改关闭”)
- 多态成为可能:Person p = new Student(...),p.introduce() 会动态调用 Student 的版本
- 复用粒度由父类设计决定——合理抽象公共部分,是高效复用的前提
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











