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

相关推荐
廋到被风吹走2 小时前
【Spring】Spring Boot详细介绍
java·spring boot·spring
资深低代码开发平台专家2 小时前
MicroQuickJS:为极致资源而生的嵌入式JavaScript革命
开发语言·javascript·ecmascript
世转神风-2 小时前
qt-通信协议基础-固定长度-小端字节序补0x00指导
开发语言·qt
计算机毕设指导62 小时前
基于微信小程序的智慧社区娱乐服务管理系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·娱乐
期待のcode2 小时前
Java中的super关键字
java·开发语言
TM1Club2 小时前
Zoey的TM1聊天室|#3 合并报表提速:业财一体如何实现关联方对账自动化
大数据·开发语言·人工智能·经验分享·数据分析·自动化·数据库系统
禾高网络2 小时前
互联网医院系统|禾高互联网医院|互联网医院成品
java·大数据·人工智能
nnsix2 小时前
【C#】HttpPost请求 - Query参数 - URL编码方法
java·javascript·c#
Selegant2 小时前
百万 QPS 下的 Java 服务调优:JVM 参数、GC 策略与异步非阻塞编程
java·开发语言·jvm