news 2026/6/19 11:57:03

Java继承知识笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java继承知识笔记

Java 继承复习笔记

重点覆盖 Java 继承、super、构造顺序、访问权限、继承方式、final、继承与组合。


1. 为什么需要继承

在 Java 中,类用来描述现实世界中的对象。很多类之间会存在共同特征,例如:狗和猫都有nameageeat()sleep()等共同成员。

如果每个类都重复写这些字段和方法,会导致:

  • 代码重复多;
  • 后期维护困难;
  • 共性逻辑无法统一管理。

继承的核心作用:抽取共性,实现代码复用。

例如:

classAnimal{Stringname;intage;publicvoideat(){System.out.println(name+"正在吃饭");}publicvoidsleep(){System.out.println(name+"正在睡觉");}}classDogextendsAnimal{publicvoidbark(){System.out.println(name+"汪汪汪~~~");}}classCatextendsAnimal{publicvoidmew(){System.out.println(name+"喵喵喵~~~");}}

DogCat继承Animal后,可以直接复用nameageeat()sleep(),只需要新增自己特有的行为。


2. 继承的基本概念

继承 inheritance是面向对象中实现代码复用的重要机制。它允许程序员在保留已有类特征的基础上扩展新功能。

常见术语:

术语含义
父类 / 基类 / 超类被继承的类,例如Animal
子类 / 派生类继承父类的类,例如DogCat
继承关系子类获得父类的成员,并在此基础上扩展新成员

继承体现的是一种is-a关系。

例如:

  • 狗是动物:Dog is an Animal
  • 猫是动物:Cat is an Animal

3. 继承的语法

Java 中使用extends表示继承关系。

修饰符class子类extends父类{// 子类新增成员}

示例:

publicclassDogextendsAnimal{publicvoidbark(){System.out.println(name+"汪汪汪~~~");}}

注意:

  1. 子类会继承父类中的成员变量和成员方法。
  2. 子类继承父类后,应该添加自己特有的成员,否则继承的意义不大。
  3. Java 中类的继承是单继承,一个类只能直接继承一个父类。

4. 子类访问父类成员

4.1 访问成员变量

在子类方法中访问成员变量时,遵循就近原则

  1. 子类自己有该成员变量,优先访问子类自己的;
  2. 子类没有,则向父类中查找;
  3. 父类也没有,则编译报错;
  4. 如果子类和父类有同名成员变量,直接访问时访问的是子类自己的成员变量。

示例:

classBase{inta;intb;intc;}classDerivedextendsBase{inta;charb;publicvoidmethod(){a=100;// 访问子类自己的 ab=101;// 访问子类自己的 bc=102;// 子类没有 c,访问父类继承下来的 c}}

重点:

  • 同名字段不会形成重写,而是字段隐藏。
  • 直接写字段名时,优先找当前类。
  • 想访问父类同名字段,需要使用super

4.2 访问成员方法

如果子类和父类方法名不同:

  1. 优先在子类中找;
  2. 子类没有,再去父类中找;
  3. 都没有则编译报错。

示例:

classBase{publicvoidmethodA(){System.out.println("Base中的methodA()");}}classDerivedextendsBase{publicvoidmethodB(){System.out.println("Derived中的methodB()");}publicvoidmethodC(){methodB();// 访问子类自己的方法methodA();// 访问父类继承下来的方法}}

如果父类和子类有同名方法:

  • 参数列表不同:构成重载,根据调用时传递的参数决定调用哪个方法;
  • 参数列表相同:构成重写,直接调用时优先执行子类重写后的方法;
  • 想在子类中调用父类被重写的方法,需要使用super.方法名()

5.super关键字

当子类和父类中存在同名成员时,直接访问通常会访问子类自己的成员。此时可以使用super明确访问父类成员。

5.1 访问父类成员变量

classBase{inta;intb;}classDerivedextendsBase{inta;charb;publicvoidmethod(){this.a=100;// 子类自己的 athis.b=101;// 子类自己的 bsuper.a=200;// 父类中的 asuper.b=201;// 父类中的 b}}

5.2 访问父类成员方法

classBase{publicvoidmethodB(){System.out.println("Base中的methodB()");}}classDerivedextendsBase{@OverridepublicvoidmethodB(){System.out.println("Derived中的methodB()");}publicvoidmethodC(){methodB();// 调用子类重写后的 methodBsuper.methodB();// 调用父类中的 methodB}}

5.3super使用注意事项

  1. super主要用于在子类中访问父类成员。
  2. super只能在非静态方法或构造方法中使用。
  3. super.成员变量用来访问父类字段。
  4. super.成员方法()用来访问父类方法。
  5. super(...)用来调用父类构造方法,且必须放在子类构造方法第一行。

6. 子类构造方法

创建子类对象时,必须先构造父类部分,再构造子类部分。

口诀:先有父,再有子。

示例:

classBase{publicBase(){System.out.println("Base()");}}classDerivedextendsBase{publicDerived(){// 默认隐藏了 super();System.out.println("Derived()");}}publicclassTest{publicstaticvoidmain(String[]args){Derivedd=newDerived();}}

输出结果:

Base() Derived()

构造方法规则

  1. 子类构造方法中默认会隐式调用父类无参构造方法super()
  2. 如果父类没有无参构造方法,子类必须显式调用父类的带参构造方法。
  3. super(...)必须是子类构造方法中的第一条语句。
  4. 一个构造方法中super(...)只能出现一次。
  5. super(...)this(...)不能同时出现在同一个构造方法中,因为它们都要求放在第一行。

示例:父类只有带参构造时,子类必须显式调用。

classPerson{Stringname;intage;publicPerson(Stringname,intage){this.name=name;this.age=age;}}classStudentextendsPerson{publicStudent(Stringname,intage){super(name,age);// 必须调用父类构造方法}}

7.thissuper的区别

对比项thissuper
含义当前对象的引用子类对象中从父类继承下来的那部分成员的访问入口
访问字段访问本类成员变量访问父类成员变量
访问方法调用本类方法调用父类方法
构造方法中this(...)调用本类其他构造方法super(...)调用父类构造方法
是否默认存在用户不写this(...)就没有构造方法中默认会有super(),前提是父类存在无参构造
使用位置非静态方法、构造方法非静态方法、构造方法

相同点:

  • 都是 Java 关键字;
  • 都不能在静态方法中直接使用;
  • 在构造方法中调用时,都必须放在第一行;
  • this(...)super(...)不能同时出现在同一个构造方法中。

8. 初始化顺序

8.1 没有继承关系时

执行顺序:

静态代码块 -> 实例代码块 -> 构造方法

特点:

  1. 静态代码块在类加载阶段执行,只执行一次。
  2. 每创建一次对象,实例代码块和构造方法都会执行一次。
  3. 实例代码块先于构造方法执行。

8.2 有继承关系时

创建子类对象时,执行顺序:

父类静态代码块 子类静态代码块 父类实例代码块 父类构造方法 子类实例代码块 子类构造方法

第二次创建子类对象时,静态代码块不会再执行,只执行实例代码块和构造方法:

父类实例代码块 父类构造方法 子类实例代码块 子类构造方法

记忆口诀:

静态先行,父类优先;实例随后,构造最后。


9.protected和访问权限

Java 中常见访问限定符:

访问范围private默认权限 defaultprotectedpublic
同一个类中可以可以可以可以
同一个包中的其他类不可以可以可以可以
不同包中的子类不可以不可以可以可以
不同包中的非子类不可以不可以不可以可以

重点理解:

  1. private成员在子类中不能直接访问。
  2. 父类的private成员虽然不能被子类直接访问,但仍然属于父类对象的一部分,也会存在于子类对象中。
  3. protected常用于希望子类可以访问、但不想完全公开给所有类的成员。
  4. default只能在同包中访问,跨包不可见。
  5. public访问范围最大。

编码建议:

  • 能用更严格权限就不要随便用public
  • 字段一般建议设为private
  • 只把必要的方法暴露为public
  • 专门给子类使用的成员可以考虑protected

10. Java 支持的继承方式

Java 类继承支持:

10.1 单继承

一个子类直接继承一个父类。

classA{}classBextendsA{}

10.2 多层继承

一个类继承另一个类,另一个类再继承更上层的类。

classA{}classBextendsA{}classCextendsB{}

10.3 不同类继承同一个父类

多个子类继承同一个父类。

classAnimal{}classDogextendsAnimal{}classCatextendsAnimal{}

10.4 Java 不支持类的多继承

一个类不能同时继承多个父类。

错误示例:

classA{}classB{}// Java 中不允许这样写classCextendsA,B{}

注意:

  • Java 类不支持多继承;
  • 继承层次不宜过深;
  • 一般不建议超过三层继承关系,层次太深应考虑重构。

11.final关键字与继承

final可以修饰变量、方法和类。

11.1 修饰变量

表示常量,初始化后不能再修改。

finalinta=10;// a = 20; // 编译错误

11.2 修饰类

表示该类不能被继承。

publicfinalclassAnimal{}// 编译错误:final 类不能被继承classBirdextendsAnimal{}

Java 中常用的String类就是final修饰的,不能被继承。

11.3 修饰方法

表示该方法不能被子类重写。

classAnimal{publicfinalvoideat(){System.out.println("吃饭");}}classDogextendsAnimal{// 编译错误:final 方法不能被重写// public void eat() {}}

12. 继承与组合

继承和组合都能实现代码复用,但表达的关系不同。

方式表达关系示例
继承is-a,是一种狗是动物,猫是动物
组合has-a,有一个 / 由……组成汽车有轮胎、发动机、车载系统

12.1 组合示例

classTire{// 轮胎类}classEngine{// 发动机类}classVehicleSystem{// 车载系统类}classCar{privateTiretire;privateEngineengine;privateVehicleSystemvehicleSystem;}

汽车不是轮胎,也不是发动机,而是“有轮胎”“有发动机”,因此更适合用组合。

12.2 继承示例

classCar{}classBenzextendsCar{}

奔驰是一种汽车,因此可以用继承。

12.3 选择原则

优先判断关系:

  • 符合is-a,可以考虑继承;
  • 符合has-a,应该使用组合;
  • 如果只是为了复用代码,不一定要继承;
  • 一般建议:能用组合尽量用组合

13. 易错点总结

  1. Java 中继承关键字是extends,不是extend
  2. Java 类只支持单继承,不支持一个类同时继承多个父类。
  3. 子类对象创建时,一定先调用父类构造方法。
  4. 子类构造方法中如果没有写super(...),编译器会默认添加super()
  5. 如果父类没有无参构造方法,子类必须显式调用父类带参构造。
  6. super(...)必须是构造方法第一行。
  7. this(...)super(...)不能同时出现在同一个构造方法中。
  8. 子类和父类字段同名时,字段不会重写,只是隐藏。
  9. 父类private成员不能在子类中直接访问。
  10. protected在不同包的子类中可以访问,但不同包的非子类不能访问。
  11. final修饰的类不能被继承。
  12. final修饰的方法不能被重写。
  13. 继承层次不要设计得太复杂,过深时应考虑组合或重构。

14. 快速记忆版

继承语法:class 子类 extends 父类 继承关系:is-a 组合关系:has-a 成员访问:先找子类,找不到再找父类 父类同名成员:super.成员名 父类构造调用:super(...) 构造顺序:先父类,后子类 初始化顺序:父静 -> 子静 -> 父实例 -> 父构造 -> 子实例 -> 子构造 访问权限:private < default < protected < public final 类:不能被继承 final 方法:不能被重写 final 变量:不能被修改 设计原则:能用组合,尽量用组合
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 11:51:07

SI2302-ASEMI解锁低压功率控制新优势SI2302

编辑&#xff1a;David在便携式电子、智能小家电、小型工控、电源管理等中低压电路设计中&#xff0c;功率MOS管是决定设备功耗、稳定性与使用寿命的核心元器件。很多研发工程师在选型时&#xff0c;始终在寻找小体积、低损耗、高稳定、高性价比的通用型MOS管&#xff0c;既能满…

作者头像 李华
网站建设 2026/6/19 11:46:54

从校园实验到创意实践:基于Audition的音频处理全流程解析

1. 从校园实验到创意实践的跨越 第一次接触Adobe Audition是在大三的多媒体导论课上。记得当时老师布置的实验作业是用Audition完成一段简单的音频剪辑&#xff0c;我手忙脚乱地折腾了两个小时&#xff0c;才勉强把一段人声和背景音乐拼接在一起。没想到这个看似简单的校园实验…

作者头像 李华
网站建设 2026/6/19 11:41:07

Adobe-GenP 3.0:五分钟解锁Adobe全家桶的专业指南

Adobe-GenP 3.0&#xff1a;五分钟解锁Adobe全家桶的专业指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 面对Adobe Creative Cloud高昂的订阅费用&#xff0c;…

作者头像 李华
网站建设 2026/6/19 11:40:48

3分钟掌握:AcFunDown视频下载神器全方位使用指南

3分钟掌握&#xff1a;AcFunDown视频下载神器全方位使用指南 【免费下载链接】AcFunDown 包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 &#x1f633;仅供交流学习使用喔 项目地址: https://gitcode.com/gh_mirrors/ac/AcFunDown AcFunDown是一款专为…

作者头像 李华
网站建设 2026/6/19 11:34:02

Claude 4.8 辅助后端排障实践:从错误日志到修复方案,再到测试用例

文章摘要&#xff1a;本文结合订单状态同步的排障案例&#xff0c;分享如何将 Claude 4.8 与 ChatGPT、Gemini、DeepSeek 等模型用于后端开发流程&#xff1a;先整理日志和调用链&#xff0c;再分析空指针、幂等性、状态流转等风险&#xff0c;生成局部修复建议和测试用例清单。…

作者头像 李华