一、Java 继承的核心价值与基础概念
1. 继承的本质:复用与扩展
继承的核心思想是 “子类继承父类”,即子类(Subclass)通过extends关键字,获得父类(Superclass)的属性和行为(方法),同时可在子类中新增专属属性或重写父类方法,实现功能扩展。这种设计既减少了代码冗余,又让类之间形成清晰的层级关系,便于维护和扩展。
2. Java 的单继承特性
与部分编程语言支持多继承不同,Java 明确规定类只能单继承(一个子类只能有一个直接父类)。这一限制是为了避免多继承带来的 “菱形问题”(多个父类存在同名方法时的歧义),保证代码逻辑的简洁性。若需实现类似多继承的功能,可通过接口组合来弥补。
3. 继承的语法与层次结构
- 基础语法:
class 子类名 extends 父类名 {} - 继承层次:父类可再继承其他类,形成 “祖父类→父类→子类” 的层级结构,子类能访问父类及祖先类中允许访问的成员(受访问修饰符限制)。
二、继承的底层逻辑:对象创建与内存存储
1. 子类对象创建:父类优先初始化
课程重点强调:创建子类对象时,父类对象会先于子类对象创建。底层流程如下:
- 调用子类构造方法时,会隐式调用父类的无参构造方法(若父类无无参构造,需通过
super()显式调用父类有参构造); - 父类完成属性初始化和构造方法执行后,子类才会初始化自身属性并执行构造逻辑;
- 本质是 “先初始化父类成员,再初始化子类成员”,确保子类能正常复用父类的资源。
2. 继承中的内存存储机制
继承在内存中的核心逻辑是 “共享与独立并存”:
- 父类的属性和方法会被所有子类对象共享,存储在方法区的类信息中;
- 每个子类对象仅存储自身新增的属性(父类属性不会重复存储),调用父类方法时,通过类信息找到对应的方法执行;
- 这种设计既节省内存空间,又保证了子类对象对父类资源的复用。
三、继承的核心语法:方法重写与方法重载
继承中最易混淆也最常用的两个概念的是方法重写(Override)和方法重载(Overload),二者本质、规则完全不同,需精准区分。
1. 方法重写(Override):改写父类行为
- 定义:子类中定义与父类方法名、参数列表、返回值类型完全一致的方法,用于改写父类方法的实现逻辑。
- 核心规则:
- 访问修饰符:子类重写方法的访问权限不能低于父类(如父类是
protected,子类可改为public,但不能改为private); - 不能重写父类的
final方法(final修饰的方法不可被修改); - 重写方法需与父类方法的核心签名(方法名 + 参数列表)完全匹配。
- 访问修饰符:子类重写方法的访问权限不能低于父类(如父类是
- 应用场景:子类需要沿用父类方法名称,但实现逻辑与父类不同(如动物类的
move()方法,子类鸟的move()实现 “飞行”,子类狗的move()实现 “奔跑”)。
2. 方法重载(Overload):同一类中多态表现
- 定义:在同一个类中,定义多个方法名相同、参数列表不同的方法(参数个数、类型或顺序不同),与返回值类型无关。
- 核心规则:
- 方法名必须一致;
- 参数列表必须不同(核心区分依据);
- 可与继承结合(子类可重载父类方法,也可重载自身方法)。
- 应用场景:同一功能有多种参数输入方式,需简化方法命名(如
println()方法,支持int、String、boolean等多种参数类型)。
3. 重写与重载的核心区别
| 对比维度 | 方法重写(Override) | 方法重载(Overload) |
|---|---|---|
| 存在范围 | 子类与父类之间 | 同一个类中 |
| 核心条件 | 方法名、参数列表、返回值一致 | 方法名相同,参数列表不同 |
| 访问修饰符 | 子类权限≥父类权限 | 无严格限制 |
| 与继承关系 | 依赖继承 | 可独立存在,也可结合继承 |
四、继承中的关键关键字:super 与 this
1. super 关键字:访问父类资源
super的核心作用是在子类中访问父类的成员,避免子类与父类成员命名冲突:
- 调用父类构造方法:
super(参数),必须放在子类构造方法的第一行; - 访问父类属性:
super.父类属性名(当子类有同名属性时使用); - 调用父类方法:
super.父类方法名(参数)(当子类重写了父类方法,仍需调用父类原方法时使用)。
2. this 关键字:指代当前对象
在继承场景中,this的作用主要是:
- 区分当前对象的属性与局部变量(如
this.name = name); - 调用当前类的其他构造方法(
this(参数)); - 明确指代当前对象,避免与父类成员混淆(如
this.method()表示调用子类自身的方法,而非父类方法)。
五、继承的延伸:与抽象类、接口的关联
继承并非孤立存在,它与抽象类、接口的配合是 Java 实现多态和灵活设计的关键:
- 抽象类:作为继承体系的 “模板类”,定义子类必须实现的抽象方法(通过
abstract关键字),强制子类遵循统一的行为规范,同时可包含非抽象方法供子类复用; - 接口:弥补 Java 单继承的局限,一个类可实现多个接口(
implements关键字),接口中定义的抽象方法(Java 8 + 后支持默认方法)需实现类全部实现,常用于定义 “行为规范”(如Runnable接口的run()方法)。
六、继承中的常见问题与注意事项
- 子类访问父类成员的限制:子类不能直接调用父类的私有(
private)变量和方法,需通过父类提供的public或protectedgetter/setter 方法访问; - 构造方法的使用规则:父类若没有无参构造,子类必须通过
super(参数)显式调用父类的有参构造,否则编译报错; - 全局变量与局部变量冲突:继承中若子类与父类有同名全局变量,子类访问时默认优先使用自身变量,需通过
super访问父类变量; - 避免继承滥用:并非所有类都适合作为父类,若类之间没有明确的 “is-a” 关系(如 “狗是动物”),强行使用继承会导致类体系混乱,此时可考虑组合(“has-a” 关系)替代。