Java 继承详解?什么时候用继承?设计继承是为了什么? 目录一. 封装的意义是什么二. 为什么需要继承三. 继承是什么如何使用四. 继承的好处是什么五. 设计继承需要注意什么六. 继承的特点七. 子类到底继承了父类的哪些内容7.1 继承内容7.2 虚方法表的概念八. 继承中成员变量的访问特点8.1 例子1方法优先访问局部变量8.2 例子2方法其次访问成员变量8.3 例子3方法最后访问父类变量8.4 例子4this 主动调用成员变量super 主动调用父类变量8.5 总结概括九. 继承中方法的重写详情9.1 重写的目的与注意事项9.2 虚方法表再重写中的作用十. 继承中构造方法的访问特点一. 封装的意义是什么封装想必大家都不陌生众所周知Java最重要的一个特点就是面向对象对象代表什么就要封装什么样的数据并提供数据对应的内容。我们可以利用封装将以前的一些零散的属性信息方法封装在一起组成一个整体这个整体就是我们常说的对象。在没有封装以前我们就需要对这个零三的属性和方法分别做处理将它们作为参数传入到方法中有了封装之后我们只需要一个对象传入方法中就可以解决以前的所有烦恼非常的方便。举个最简单的例子现在有一个打印学生信息的类类中有一些属性和方法现在有一业务需求要求打印学生的相关信息。1没有封装加入我们就需要把学生的信息全部作为参数传递到方法中有多少个属性就要传递多少个参数2有了封装的加入我们将学生的信息封装到学生对象中将 get 和 set 方法也封装到学生对象中然后将对象作为参数传递到方法中这样当我们需要打印学生信息时只需要通过对象的 get 方法获取到属性信息非常的方便极大的简化的业务的复杂度。二. 为什么需要继承我来说明一个场景引出一个问题同学们或许就会明白了。假设现在的业务中我有两个类一个是学生类 Student一个是老师类 Teacher。它们的属性和方法如下图所示已经封装完成仔细观察上面两个类有没有发现什么问题。其实很显然这两个类重复的代码太多了那么有没有什么办法能够解决这个问题呢我们可不可以把重复的代码抽取出来重复使用呢就像封装一样。当然是可以的那么接下来就需要用到今天的重点——继承。三. 继承是什么如何使用在实际开发过程中基本都会无法避免的产生一些重复相似的属性和方法为了避免让我们项目代码过于冗余和臃肿就引入了继承这么一个概念。Java 中关于继承提供了一个关键字 extend我们使用这个关键字就可以让一个类与另一个类之间产生继承关系使用方法也比较简单只需要在一个类的后面写上 extend 被继承类类名。使用继承我们就可以对上面的 Student 类和 Teacher 类进行优化将两个类的公共部分抽取出来生成第三个类让 Student 类和 Teacher 类都继承这第三个类。如下图所示Student 类和 Teacher 类都被称为子类(也叫派生类)Person 类被称为父类(也可以叫超类或基类)。四. 继承的好处是什么1通过继承我们可以将一些类中相同的属性和方法即重复的代码抽取到一个类中作为父类提高了代码的复用性降低的代码的冗余。2青出于蓝而胜于蓝。子类在继承了父类之后得到了父类中的所有属性和方法(私有属性和方法除外)还可以在自己的类中添加额外的属性和方法扩展自己的功能让子类更加强大以便于满足更多更复杂的业务需求。五. 设计继承需要注意什么请同学们牢牢记住下面这句话当类与类之间存在相同(共性)的内容并且满足子类是父类中的一种就可以考虑使用继承优化代码。使用继承要满足两点1存在相同内容2一定一定要满足子类是父类中的一种这一点不能忽视Student 类和 Teacher 类都是人的一种所以他们都可以继承 Person 类Manager 管理者类和 Coder 程序猿类都是员工的一种他们可以同时继承 Employee 员工类而大家看下面这种情况我能否让 Coder 程序猿类和 Phone 手机类继承一个 Goods 商品类呢它们都有相同的属性 id 和名字属性。答案是不能的因为在常规认知中它们两个之间是没有直接或者间接的联系的。所以再强调一遍使用继承时一定要满足两点。第一点类与类之间有共同的内容第二点子类必须是父类中的一种如果不是一种就算有相同的属性也不能使用继承六. 继承的特点Java只支持单继承不支持多继承但支持多层继承。我们拆分成三句话来说明。Java 只支持单继承在 Java 中一个类只能继承一个类不能再继承其它的类可以理解为一个儿子只能有一个父亲不能有两个Java 不支持多继承假设我现在的 A类 继承了 B类而且B类中有一个方法 method 打印一句话我继承了B类A类 也继承了 C类C类中也有一个方法 method 打印一句话 我继承了C类那么当A类的对象调用 method 方法时它就蒙了它不知道该调用哪个所以为了避免这种情况的发生Java 中不支持多继承。Java 支持多层继承这个意思就是A类继承了B类B类也可以继承C类C类也可以继承D类类似于套娃无限循环。也好比是四世同堂儿子——爸爸——爷爷——姥爷。还有一点需要注意Java 中的所有类都直接或者间接的继承了 Object 类。七. 子类到底继承了父类的哪些内容7.1 继承内容在一个类中我们通常会定义 成员变量构造方法成员方法。子类继承父类时它所能继承的内容如下图所示1父类中的构造方法不管是不是私有的子类都继承不了2父类中的成员变量不管是不是私有的子类都能继承只是父类中的成员变量被锁定了子类可以继承但是子类访问不了3父类中的成员变量非私有的方法可以继承下来7.2 虚方法表的概念在成员方法的继承中我要补充一个额外的点子类在继承父类中的成员方法时实际上会继承父类的虚方法表。Java 在最顶级的父类开始会设立一个虚方法表它会把这个类当中经常可能会用到的方法单独的抽取出来放到虚方法表中。判断一个方法是否会经常被使用需要满足以下三点1不被 private 修饰2不被 static 修饰3不被 final 修饰满足这三点的方法就会被存放到虚方法表中。在继承的过程中父类就会把这个虚方法表交给子类子类在父类虚方法表的基础上添加自己的虚方法然后继续交给后续的子类层层传递如下图所示。八. 继承中成员变量的访问特点在继承中成员变量的访问特点遵循 就近原则谁离我近我就用谁。8.1 例子1方法优先访问局部变量如下代码public class Test9 { // 定义 main 方法做测试 public static void main(String[] args) { // 定义 Son 类对象 Son son new Son(); // 调用方法 son.ziShow(); } } // 定义一个父类 class Futher{ // 定义一个字符串 String name 父类字符串; } // 定义一个儿子类继承父类 class Son extends Futher{ // 定义一个字符串 String name 子类字符串; // 定义一个方法 public void ziShow(){ String name 方法内部的字符串; System.out.println(name); } }运行上述代码就可以在控制台看到打印出的是方法内部的 name 字符串因为方法内部的字符串距离方法最近8.2 例子2方法其次访问成员变量刚才的演示中方法内部本身就有 name 字符串那么现在我将方法内部的字符串删除再重新运行就可以在控制台中看到如下结果所以可以得出结论当继承中方法访问的变量在方法内部存在时会优先就近访问方法内部的局部变量当方法内部没有变量可以访问时会去访问类中的成员变量。8.3 例子3方法最后访问父类变量我们对上面的方法再做修改将方法类中的成员变量 name 也删除再次运行得出如下结果结合上面三个例子可以得出结论当方法内部没有变量可以访问时方法会先去访问了当前类的成员变量如果当前方法类的成员变量也没有可以访问时会最后去访问父类中的成员变量。8.4 例子4this 主动调用成员变量super 主动调用父类变量当我们不想访问方法内部的变量时就可以通过 this 关键字主动调用方法的成员变量或通过 super 关键字调用父类变量在原本的代码基础上稍微做修改如下所示8.5 总结概括OK下面我们几句句话来总结上面四个例子得出的结论。1在继承中方法调用变量时会采用就近原则当方法想要访问的变量方法内部本身就有时会最优先访问方法内部的局部变量2当方法内部访问不到变量时会去方法当前类成员变量中寻找访问3如果成员变量中也访问不到时会最后去父类成员变量访问4如果想要主动访问当前方法类成员变量可以通过 this 关键字如果想要调用父类成员变量则可以通过 super 关键字。九. 继承中方法的重写详情9.1 重写的目的与注意事项子类在继承了父类的方法之后可以使用父类中的方法但在实际开发过程中子类继承父类之后通常会扩展自己额外的功能那么此时从父类继承下来的方法可能就满足不了业务需求了这个时候就需要用到方法的重写我们可以在子类冲重新编写重复类那里继承下来的方法的执行逻辑高造成满足我们业务需求的方法。再进行重写时需要满足以下几点需求。1重写方法的名称形参列表必须与父类保持一致2重写的方法上方要加上 Override 注解3子类在重写父类方法时方法的访问权限必须大于等与父类方法的返回值范围必须小于等于父类4父类中的私有方法不能被重写5父类中的静态方法即被 static 修饰的方法不能被重写重写会报错9.2 虚方法表再重写中的作用回顾我们上面提到的虚方法表父类会把常用的方法存放到虚方法表中交给子类其实在子类重写父类方法的过程中其实重写的就是虚方法表中从父类那里得到的方法。如下图所示如果B类中重写了从父类C那里继承过来的 method2 方法那么被重写后的 method2 方法就会被加入到虚方法表中此时A类从B类那里继承过来的 method2 方法实际上并不是最原始的C类中的方法而是已经被B类重写后的 method2 方法。十. 继承中构造方法的访问特点1在继承体系中子类不能继承父类的构造方法但是可以通过 super 调用2子类在执行构造方法之前会先去执行父类的无参构造我们用一段代码来证明一下public class Test9 { // 定义 main 方法做测试 public static void main(String[] args) { // 无参定义 Son 类对象 Son son new Son(); // 带参定义 Son 类对象 Son son2 new Son(张三); } } // 定义一个父类 class Futher{ String name; public Futher(){ System.out.println(父类无参构造方法先执行); } public Futher(String name) { System.out.println(父类带参构造); this.name name; } } // 定义一个儿子类继承父类 class Son extends Futher{ String name; public Son(){ System.out.println(无参构造创建 Son 对象); } public Son(String name) { System.out.println(带参构造创建 Son 对象); this.name name; } }运行得出如下结果从运行结果我们可以看出创建子类时不管我们使用无参构造还是带参构造父类的无参构造方法都会执行。

相关新闻

最新新闻

SpringBoot系列19:生产环境性能调优:JVM参数、连接池、接口慢查询优化(完整版)

SpringBoot系列19:生产环境性能调优:JVM参数、连接池、接口慢查询优化(完整版)

文章目录📌 专栏:SpringBoot进阶实战系列🎯 本文独家核心收获(区别于全网水文)一、前言:为什么生产环境必须做性能调优?二、性能调优核心流程(生产标准规范)2.1 标准调优…

2026/7/16 22:02:20
LabVIEW XY图自定义游标系统设计与优化

LabVIEW XY图自定义游标系统设计与优化

1. LabVIEW XY图游标的核心功能与应用场景在测试测量和工业自动化领域,图形化数据显示是最基础也最关键的环节。LabVIEW作为图形化编程的标杆工具,其XY图控件能够直观展示各类传感器采集的时域/频域数据、运动轨迹坐标或任意二维关系曲线。而游标功能&am…

2026/7/16 22:02:20
C语言指针完全指南:从内存模型到实战应用详解

C语言指针完全指南:从内存模型到实战应用详解

很多C语言初学者在接触指针时都会感到困惑,甚至有些开发者工作多年后对指针的理解仍然不够深入。指针作为C语言最核心的特性之一,直接关系到内存管理、数据结构和系统编程的方方面面。本文将系统梳理指针的核心概念、使用方法和常见陷阱,通过…

2026/7/16 22:02:20
Ex tc IIIC T80金属多芯防爆连接器:粉尘环境传感器专用解决方案

Ex tc IIIC T80金属多芯防爆连接器:粉尘环境传感器专用解决方案

一、防爆标志完整释义(Ex tc IIIC T80℃ Dc)1. Ex:防爆电气通用标识2. tc:粉尘外壳保护型,Dc防护等级,仅适配22区粉尘危险区域;仅故障泄漏时短时出现粉尘云,正常工况无持续粉尘爆炸介…

2026/7/16 22:02:20
别踩 2026年录音怎么转换成文字的常见误区:亲测总结的实操经验

别踩 2026年录音怎么转换成文字的常见误区:亲测总结的实操经验

2026年录音转文字不需要手动逐字录入,也不用盲目选最贵的工具,只要选匹配自身需求的AI工具,就能10分钟内完成1小时录音的转写整理。对自媒体从业者来说,不管是访谈录音、直播素材转文字还是线下活动记录,只要提前确认录…

2026/7/16 22:02:20
NickelMenu技术解析:Kobo阅读器自定义菜单系统的架构与实践

NickelMenu技术解析:Kobo阅读器自定义菜单系统的架构与实践

NickelMenu技术解析:Kobo阅读器自定义菜单系统的架构与实践 【免费下载链接】NickelMenu The easiest way to launch scripts, change settings, and run actions on Kobo e-readers. 项目地址: https://gitcode.com/gh_mirrors/ni/NickelMenu NickelMenu是一…

2026/7/16 21:57:20

月新闻