Java中的继承

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修饰的方法,子类不能重写。

相关推荐
孟陬3 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌3 小时前
一站式了解四种限流算法
java·后端·go
华仔啊3 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
也些宝4 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java
Nyarlathotep01134 小时前
SpringBoot Starter的用法以及原理
java·spring boot
wuwen55 小时前
WebFlux + Lettuce Reactive 中 SkyWalking 链路上下文丢失的修复实践
java
SimonKing5 小时前
GitHub 10万星的OpenCode,正在悄悄改变我们的工作流
java·后端·程序员
Seven976 小时前
虚拟线程深度解析:轻量并发编程的未来趋势
java
雨中飘荡的记忆16 小时前
ElasticJob分布式调度从入门到实战
java·后端