JavaSE 基础语法 - 继承 - ②
接上节 JavaSE 基础语法 - 继承 - ① 的内容。子类不仅可以拥有父类的成员变量也可以拥有父类的方法。那么新的问题来了。如果子类自己也有String name 这时候怎么办如果子类自己也有eat()又怎么办如果子类构造对象的时候需要先初始化父类应该怎么办Java 为了解决这些问题引入了super关键字。8、为什么需要 super第一次学习继承的时候应该都有一个疑惑子类已经继承了父类为什么还需要 super其实super的出现并不是为了增加一种新的语法而是为了解决继承过程中成员冲突和父类初始化的问题。8.1 子类为什么需要访问父类假设有一个 Person 类classPerson{Stringname张三;publicvoideat(){System.out.println(Person 正在吃饭);}}定义 StudentclassStudentextendsPerson{publicvoidstudy(){System.out.println(学习);}}测试StudentstunewStudent();System.out.println(stu.name);stu.eat();输出张三Person正在吃饭这是没有问题的。因为 Student 没有 name 也没有 eat() 。Java自然向父类查找。但是如果 Student 自己也定义classStudentextendsPerson{Stringname李四;// 自己也定义有了name}测试StudentstunewStudent();System.out.println(stu.name);输出李四为什么因为成员变量遵循就近原则。那么问题来了如果我就是想访问 Person 里面那个 name 怎么办Java于是设计了super专门表示父类对象部分。8.2 为什么会出现成员重名再来看一个例子。PersonclassPerson{Stringname张三;}StudentclassStudentextendsPerson{Stringname李四;}对象实际上应该长这样很多同学看到这里会问一个对象里面怎么会有两个 name答案是可以。因为父类部分属于 Person 子类部分属于 Student 。它们分别存储。只是访问的时候遵循先找子类再找父类。因此 stu.name 得到李四而父类那个张三仍然存在只是访问不到所以Java设计super。表示访问父类中的 name。8.3 super 诞生的原因现在我们已经知道对象实际上包含父类部分 子类部分。因此Java需要一种方式告诉 JVM不要找子类请直接访问父类。于是有了super可以把 super 理解成父类对象部分的引用。例如super.name 表示 Person中的name不是 Student自己的name。同样 super.eat() 表示调用父类的方法。而不是子类自己的方法。另外super() 表示调用父类构造方法。所以 super 实际上有三种用途super.成员变量super.成员方法super()9、super 关键字9.1 什么是 supersuper是 Java 提供的一个关键字。它表示当前对象中的父类部分。很多人会把 super 理解成父类对象这种说法并不准确。因为程序中并没有重新创建一个父类对象。真正存在的是只有一个对象这个对象里面存着父类部分还有子类部分。所以更准确的理解super 用来引用当前对象中的父类部分。例如classPerson{Stringname张三;}classStudentextendsPerson{Stringname李四;publicvoidprint(){System.out.println(name);System.out.println(super.name);}}输出李四 张三说明name 访问子类而 super.name 访问的是父类。9.2 super 访问成员变量这是 super 最简单的用法。例如classPerson{Stringname张三;}classStudentextendsPerson{Stringname李四;publicvoidshow(){System.out.println(name);System.out.println(super.name);}}测试StudentstunewStudent();stu.show();输出李四 张三因此super 可以解决成员变量隐藏的问题。9.3 super 访问成员方法不仅成员变量可以重名成员方法也可以。例如classPerson{publicvoideat(){System.out.println(Person 吃饭);}}classStudentextendsPerson{Overridepublicvoideat(){System.out.println(Student 吃饭);}publicvoidtest(){eat();super.eat();}}测试StudentstunewStudent();stu.test();输出Student吃饭Person吃饭解释eat()调用当前类Student的实现。super.eat()调用父类Person的实现。这种写法在方法重写中非常常见例如子类希望在保留父类逻辑的基础上扩展功能Overridepublicvoideat(){super.eat();// 执行父类逻辑System.out.println(饭后散步);}9.4 super 调用父类构造方法除了访问成员变量和成员方法super 还有第三种用途调用父类构造方法例如classPerson{publicPerson(){System.out.println(Person 构造方法);}}classStudentextendsPerson{publicStudent(){super();System.out.println(Student 构造方法);}}测试newStudent();输出Person构造方法Student构造方法可以看到创建子类对象时父类构造方法一定先执行。为什么因为子类对象中包含父类部分。只有先完成父类部分初始化才能继续初始化子类部分。9.5 super 使用注意事项使用 super 时需要记住以下几点1、super 可以访问父类成员变量、成员方法和构造方法super.name;super.eat();super();2、super() 只能出现在构造方法中错误示例publicvoidtest(){// 这是一个普通的的方法不是构造方法super();}编译错误。3、super() 必须是构造方法中的第一条语句正确publicStudent(){super();System.out.println(Student);}错误publicStudent(){System.out.println(Hello);super();}编译错误。4、this() 与 super() 不能同时出现例如publicStudent(){this(Tom);super();}编译错误。原因是this() 用于调用本类其他构造方法。super() 用于调用父类构造方法。两者都必须位于构造方法第一行因此不能同时出现。10、this 与 super学习完 super 之后都会有一个疑问this 和 super 到底有什么区别例如this.name和super.name到底有什么不同再比如this();和super();为什么都必须写在构造方法第一行10.1 什么是 this在前面我们已经讲过this表示当前对象的引用。例如classStudent{Stringname张三;publicvoidprint(){System.out.println(this.name);}}这里的this.name表示当前Student对象中的name10.2 什么是 super而super表示当前对象中的父类部分。例如classPerson{Stringname父类;}classStudentextendsPerson{Stringname子类;}this.name得到的是子类而super.name得到父类10.3 this 与 super 相同点两者都有引用作用。都不能脱离对象。例如下面都可以访问成员变量this.name;super.name;都可以访问成员方法this.eat();super.eat();都可以调用构造方法this();super();因此它们都属于Java提供的特殊引用。10.4 this 与 super 不同点虽然写法非常相似。但是作用完全不同。this表示当前对象。例如this.name的查找会先在子类中查找子类没有才去父类。super.name的查找会直接在父类中查找不会在子类。因此两者访问对象不同。10.5 this 与 super 对比表对比项thissuper表示对象当前对象当前对象中的父类部分访问成员变量✔✔访问成员方法✔✔调用构造方法✔✔调用位置普通方法、构造方法普通方法、构造方法super()仅构造方法是否必须第一行this()必须super()必须是否可同时出现✘✘注意this 和 super成员访问可以同时出现publicvoidtest(){System.out.println(this.name);System.out.println(super.name);// 这样是可以同时使用}但 this() 和 super() 不能同时出现因为两者都必须位于构造方法第一行。10.6 使用场景场景一访问当前对象成员this.name场景二访问父类成员super.name场景三调用当前类其他构造方法this(张三);场景四调用父类构造方法super();这是最常见也是最重要的使用方式。11、protected 访问权限之前我们介绍了四种访问权限publicprotected默认defaultprivate但是当时并没有详细介绍protected。因为它真正发挥作用是在继承。11.1 为什么需要 protected先来看一个例子。PersonclassPerson{privateStringname;}StudentclassStudentextendsPerson{publicvoidshow(){System.out.println(name);}}编译报错因为 private 只能本类访问。如果改成protected String name;Student 立即可以访问。因为 protected 就是专门为继承设计。11.2 protected 访问规则protected 允许下面两种情况同一个包不同包例如1、都在同一个包中可以访问2、分别在不同包但是需要继承关系才可以访问3、如果分别在不同包也没有继承关系的话就不能访问。11.3 同包访问例如protectedintage;同一个包任何类都可以访问。例如StudentstunewStudent();System.out.println(stu.age);合法。11.4 不同包继承访问例如Person 位于 com.personStudent 位于 com.student只要class Student extends Person仍然可以访问age这也是 protected 最大的作用。11.5 四种访问权限总结这是Java面试经常考的。修饰符本类同包不同包子类其他包public✔✔✔✔protected✔✔✔✘default✔✔✘✘private✔✘✘✘12、构造方法我们已经讲过构造方法。那么在继承以后构造方法又会发生什么变化来看下面例子。12.1 父类构造方法classPerson{publicPerson(){System.out.println(Person);}}12.2 子类构造方法classStudentextendsPerson{publicStudent(){System.out.println(Student);}}测试newStudent();很多人猜输出Student实际上输出PersonStudent因为创建Student对象。首先必须完成Person部分初始化。因此父类构造方法一定先执行。12.3 默认 super()我们发现代码没有写super()父类构造方法还是会执行。原因Java自动补充publicStudent(){super();System.out.println(Student);}因此即使没有写仍然调用父类构造方法。12.4 显示调用 super()如果父类只有有参构造。例如classPerson{publicPerson(Stringname){}}那么必须自己写super(张三);否则编译报错。12.5 为什么 super() 必须放第一行这是Java规定的。原因只有父类初始化完成子类才能继续初始化。否则子类可能使用一个尚未初始化完成的父类成员。因此Java从语言层面规定super() 必须位于构造方法第一行。13、对象初始化过程前面我们已经知道子类对象中实际上包含两部分父类部分子类部分例如classPerson{Stringname;intage;}classStudentextendsPerson{intscore;}创建StudentstunewStudent();此时 stu 所代表的对象中可以理解为包含Person部分 name ageStudent部分 score那么问题来了创建 Student 对象时父类部分和子类部分到底谁先初始化答案是先初始化父类部分再初始化子类部分。也就是说创建Student对象 ↓ 初始化Person部分 ↓ 执行Person构造方法 ↓ 初始化Student部分 ↓ 执行Student构造方法 ↓ 对象创建完成但是真正的初始化过程比这个更加详细。13.1 成员变量默认初始化当 JVM 为对象分配内存后对象中的成员变量会先获得默认值。例如classPerson{Stringname;intage;booleanflag;}创建PersonpnewPerson();此时成员变量会先获得默认值name-nullage-0flag-false注意这里说的是成员变量。局部变量不会自动进行默认初始化。例如publicstaticvoidmain(String[]args){intage;System.out.println(age);}会编译错误。所以成员变量-有默认值 局部变量-必须手动初始化13.2 成员变量显式初始化如果成员变量在定义的时候进行了初始化classPerson{Stringname张三;intage18;}那么在默认初始化之后显式初始化按照成员变量在类中定义的顺序依次执行。可以简单理解为name →nullage →0先执行默认初始化 然后再到下边的赋值 name →张三age →1813.3 父类部分先初始化假设classPerson{StringnamePerson;publicPerson(){System.out.println(Person 构造方法);}}classStudentextendsPerson{StringschoolJava;publicStudent(){System.out.println(Student 构造方法);}}执行StudentstunewStudent();首先处理的是Person部分也就是name 默认初始化 ↓ name 显式初始化为Person↓Person构造方法然后才开始处理Student部分13.4 子类部分再初始化接下来处理 Student 部分StringschoolJava;先进行默认初始化school-null然后进行显式初始化school-Java最后执行 Student 构造方法publicStudent(){System.out.println(Student 构造方法);}所以整个过程可以理解为Person部分 默认初始化-显式初始化-Person构造方法Student部分 默认初始化-显式初始化-Student构造方法14、综合案例下面通过一个完整案例把 super、构造方法和对象初始化过程结合起来。14.1 定义 PersonclassPerson{protectedStringnamePerson;protectedintage20;publicPerson(){System.out.println(Person 无参构造方法);}publicPerson(Stringname,intage){this.namename;this.ageage;System.out.println(Person 有参构造方法);}publicvoideat(){System.out.println(Person 吃饭);}}14.2 定义 StudentclassStudentextendsPerson{privatedoublescore100;publicStudent(Stringname,intage,doublescore){super(name,age);this.scorescore;System.out.println(Student 构造方法);}Overridepublicvoideat(){super.eat();System.out.println(Student 吃饭);}publicvoidshow(){System.out.println(姓名this.name);System.out.println(年龄this.age);System.out.println(成绩this.score);}}14.3 测试publicclassTest{publicstaticvoidmain(String[]args){StudentstunewStudent(张三,18,95);stu.show();stu.eat();}}运行结果Person有参构造方法Student构造方法 姓名张三 年龄18成绩95.0Person吃饭Student吃饭14.4 分析对象创建过程执行StudentstunewStudent(张三,18,95);首先创建 Student 对象然后进入 Student 构造方法publicStudent(Stringname,intage,doublescore){super(name,age);this.scorescore;System.out.println(Student 构造方法);}第一条语句super(name,age);调用Person(Stringname,intage)所以父类部分得到name张三age18然后返回到 Student 构造方法又执行this.scorescore;得到score95最后输出Student构造方法14.5 分析 super.eat()执行stu.eat();Student 中重写了publicvoideat(){super.eat();System.out.println(Student 吃饭);}首先super.eat();调用父类Person.eat()输出Person吃饭然后执行System.out.println(Student 吃饭);输出Student吃饭最终Person吃饭Student吃饭这是一种非常典型的继承使用方式子类重写父类方法同时通过 super 保留父类原有功能再增加自己的功能。

相关新闻

2026年杭州AI搜索优化实战:企业从0到1布局全流程

2026年杭州AI搜索优化实战:企业从0到1布局全流程

2026年,越来越多用户在决策前先问AI大模型。杭州作为数字经济与企业服务活跃的城市,企业主和营销负责人正面临一个新课题:官网排在搜索引擎首页已经不够,品牌信息能否被DeepSeek、豆包、千问、文心、元宝、Kimi、百度AI等模型准确…

2026/8/15 22:10:06 阅读更多 →
Gitee高人气开源项目深度解析:从筛选到源码学习的全链路指南

Gitee高人气开源项目深度解析:从筛选到源码学习的全链路指南

1. 项目概述:为什么我们需要一份高质量的Gitee开源项目清单?如果你是一名开发者,或者正在学习编程,那么“找项目”这件事,大概率是你技术成长路上绕不开的坎。无论是为了学习新技术栈、寻找灵感、还是想直接借鉴成熟的…

2026/8/15 22:09:06 阅读更多 →
OpenLayers加载高德瓦片与GCJ02坐标转换实战(08)

OpenLayers加载高德瓦片与GCJ02坐标转换实战(08)

OpenLayers加载高德瓦片高德坐标:最简单的地图集成方案如果你的数据来自高德地图API,底图也用高德瓦片,那恭喜你——这是所有地图集成方案里最简单的一种。坐标不用偏移、瓦片不用封装,只需要做一次投影转换。这篇文章把完整实现和…

2026/8/15 22:09:06 阅读更多 →

最新新闻

开源AI智能体框架对比:openJiuwen、OfficeClaw与AgentArts的架构解析与选型指南

开源AI智能体框架对比:openJiuwen、OfficeClaw与AgentArts的架构解析与选型指南

1. 项目概述:一次关于开源智能体框架的深度碰撞上周,我们团队内部组织了一场技术分享会,主角是三个在开发者社区里逐渐升温的开源项目:openJiuwen、OfficeClaw和AgentArts。这并非一场简单的产品介绍会,而是一次围绕“…

2026/8/15 22:47:31 阅读更多 →
TMC2209步进电机电磁噪声录音与分析实践:从信号采集到频谱诊断

TMC2209步进电机电磁噪声录音与分析实践:从信号采集到频谱诊断

这次我们来看一个关于“电磁录音”和“步进电机声”的技术项目,具体聚焦于TMC2209这款步进电机驱动芯片。如果你正在处理电机噪音、电磁干扰(EMI)问题,或者在做音频设备、精密仪器相关的开发,这个主题直接关系到信号完…

2026/8/15 22:47:31 阅读更多 →
从CF模拟题看算法竞赛基本功:逻辑严谨性与边界处理

从CF模拟题看算法竞赛基本功:逻辑严谨性与边界处理

1. 项目概述:从一道CF模拟题看算法竞赛的“基本功”如果你在Codeforces上刷过题,尤其是那些标着“A”或“B”的所谓“简单题”,可能会和我有一样的感受:有时候,这些题比后面的难题更让人头疼。不是因为算法有多复杂&am…

2026/8/15 22:47:31 阅读更多 →
Seedance2.5 正式上线】

Seedance2.5 正式上线】

重磅|Seedance2.5 正式上线】 新一代生产级 AI 视频模型,相比 2.0 版本全方位升级: 🔹30s 原生单片段输出:不再多段拼接,解决接缝处人物变脸、光影错乱,支持视频续延,实现长叙事成片…

2026/8/15 22:47:31 阅读更多 →
构建可控AI Agent:从ReAct架构到安全实践

构建可控AI Agent:从ReAct架构到安全实践

在实际的AI应用开发与集成项目中,我们经常遇到一个核心挑战:如何设计一个既智能又可控的AI代理(Agent)。当AI能够自主调用工具、访问网络或执行代码时,其“自作主张”的行为可能带来效率提升,也可能引发意料…

2026/8/15 22:47:31 阅读更多 →
Apache HTTP Server 从零安装到生产环境配置实战指南

Apache HTTP Server 从零安装到生产环境配置实战指南

1. 从零到一:为什么Apache依然是Web服务的基石如果你刚接触服务器运维,或者准备自己搭建一个网站,那么“Apache”这个名字你肯定绕不过去。即使现在Nginx、Caddy等后起之秀风头正劲,Apache HTTP Server(简称Apache&…

2026/8/15 22:46:31 阅读更多 →

日新闻

内景 空间站内部 中国空间站 太空 内仓

内景 空间站内部 中国空间站 太空 内仓

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 空间站内部 中国空间站 太空 内仓 地址:本地PC端运行(或Web…

2026/8/15 0:00:30 阅读更多 →
重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 当我们面对海量金融数据时,传统的数据获取方式往往让我们陷入困境—…

2026/8/15 0:00:30 阅读更多 →
一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

快消品(FMCG)是流通速度较快、竞争较为激烈的行业之一。一瓶饮料从出厂到消费者手中,往往只有几十天甚至几天的周转窗口。这决定了快消行业的仓储管理系统(WMS)与制造业、电商行业存在明显区别:它不仅需要管…

2026/8/15 0:02:30 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/15 12:59:14 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →