Java中的继承
Java的继承
Java 中的继承(Inheritance)是面向对象编程(OOP)三大核心特性之一,其本质是基于已有类的结构和行为构建新类的机制:被继承的类称为父类,继承父类的类称为子类。子类会自动继承父类中可访问的非私有成员(包括成员变量、成员方法,构造方法除外),从而实现代码复用;同时子类可通过新增专属成员(属性 / 方法) 拓展功能,或通过方法重写(Override) 重新定义父类方法的实现逻辑(需遵循方法重写的语法规则),以适配自身业务场景。
继承的基本语法
java
public class Person {
// 成员变量
String name;
int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 成员方法
public void eat() {
System.out.println(name + "在吃饭");
}
public void sleep() {
System.out.println(name + "在睡觉");
}
}
定义子类(通过 extends 关键字继承)
java
public class Student extends Person {
// 子类独有的属性
String studentId;
// 子类构造方法
public Student(String name, int age, String studentId) {
// super 调用父类的构造方法
super(name, age);
this.studentId = studentId;
}
// 子类独有的方法
public void study() {
System.out.println(name + "(学号:" + studentId + ")在学习Java");
}
}
java
public class Test {
public static void main(String[] args) {
// 创建子类对象
Student stu = new Student("张三", 20, "2025001");
// 调用父类的属性和方法
stu.eat();
stu.sleep();
// 调用子类独有的属性和方法
stu.study();
}
}

父类对象无法调用子类对象的代码

继承的核心特性
方法重写(Override)
在继承关系中,子类可以提供一个与其父类中已定义方法具有相同签名(方法名、参数列表) 的具体实现,子类重写父类中的方法之后,子类对象默认调用的是自身重写后的方法。
注意:
重写是发生在父子类关系当中,子类重写父类的方法;
方法的相同度是要达到方法签名级别,方法名和参数列表都需要相同;
子类重写后的方法的访问修饰符不能比父类更严格,但子类可以扩大方法的访问权限。
子类重写后的方法的访问修饰符不能比父类更严格,例如父类是 public 子类是 private 会报错

在 Student 类中添加重写的方法,如下:
java
@Override
public void eat() {
System.out.println(name + "在食堂吃饭,边吃边看笔记");
}
@Override 注解用于校验是否符合重写规则
stu.eat() 会输出子类重写后的逻辑
super 关键字
专门用于子类访问父类的成员,常见用法:
super(参数) 调用父类的构造方法(必须在子类构造方法第一行)
super.属性名 访问父类的成员变量(避免和子类同名属性冲突)
super.方法名() 调用父类的成员方法(即使子类重写了该方法)
在重写的 eat() 中调用父类的 eat(),如下:
java
@Override
public void eat() {
super.eat(); // 调用父类的eat()方法
System.out.println("吃完饭后继续学习");
}
Java 继承的限制
单继承限制
Java 规定:一个子类只能有一个直接父类(即 extends 关键字后只能跟一个类名),不支持多继承;但支持多层继承(子类可作为其他类的父类,形成继承链),也可通过接口实现间接多继承的效果。
限制原因:避免多继承的二义性,如果允许子类同时继承两个父类,且两个父类有同名方法 / 属性,子类调用该成员时会无法确定执行哪个父类的逻辑,导致编译 / 运行时歧义。
成员继承的权限约束
子类并非能继承父类的所有成员,继承范围受访问修饰符和成员类型的限制。
限制 1:构造方法不可继承
父类的构造方法不会被子类继承,子类必须自行定义构造方法;且子类构造方法中必须先调用父类构造方法(默认调用无参构造,若无则需显式通过 super() 调用),是为了保证父类成员先初始化,避免子类访问未初始化的父类属性。
限制 2:私有成员不可直接继承
父类用 private 修饰的属性 / 方法,子类无法直接访问,只能通过父类提供的 public/protected 级别的 get/set 方法间接访问。
遵循封装原则,private 是最高级别的封装,父类有权控制自身内部状态的访问范围,避免子类随意修改父类的核心数据。
限制 3:包私有成员(default)的继承限制
父类用 default 修饰的成员(无修饰符),仅同包的子类能继承 / 访问,不同包的子类无法访问。
限制 4:final 修饰的类不可被继承
用 final 修饰的类,无法被其他类继承;final修饰的方法,子类不能重写。