当前位置: 首页 > article >正文

Java——继承的细节

继承的细节1、构造方法1.1、父类无默认构造1.2、父类构造调用可被重载的方法2、重名与静态绑定2.1、重名3、重载和重写4、父子类型转换5、继承访问权限protected6、可见性重写7、防止继承final1、构造方法1.1、父类无默认构造子类可以通过super调用父类的构造方法如果子类没有通过super调用则会自动调动父类的默认构造方法那如果父类没有默认构造方法呢如下所示publicclassBase{privateStringmember;publicBase(Stringmember){this.membermember;}}这个类只有一个带参数的构造方法没有默认构造方法。这个时候它的任何子类都必须在构造方法中通过super调用Base的带参数构造方法如下所示否则Java会提示编译错误。publicclassChildextendsBase{publicChild(Stringmember){super(member);}}1.2、父类构造调用可被重载的方法另外需要注意的是如果在父类构造方法中调用了可被重写的方法则可能会出现意想不到的结果。我们来看个例子下面是基类代码publicclassBase{publicBase(){test();}publicvoidtest(){}}构造方法调用了test()方法。这是子类代码publicclassChildextendsBase{privateinta123;publicChild(){}publicvoidtest(){System.out.println(a);}}子类有一个实例变量a初始赋值为123重写了test()方法输出a的值。看下使用的代码publicstaticvoidmain(String[]args){ChildcnewChild();c.test();}输出结果是0 123第一次输出为0第二次输出为123。第一行为什么是0呢第一次输出是在new过程中输出的在new过程中首先是初始化父类父类构造方法调用test()方法test()方法被子类重写了就会调用子类的test()方法子类方法访问子类实例变量a而这个时候子类的实例变量的赋值语句和构造方法还没有执行所以输出的是其默认值0。像这样在父类构造方法中调用可被子类重写的方法是一种不好的实践容易引起混淆应该只调用private的方法。2、重名与静态绑定2.1、重名子类可以重写父类非private的方法当调用的时候会动态绑定执行子类的方法。那实例变量、静态方法和静态变量呢它们可以重名吗如果重名访问的是哪一个呢重名是可以的重名后实际上有两个变量或方法。private变量和方法只能在类内访问访问的也永远是当前类的即在子类中访问的是子类的在父类中访问的是父类的它们只是碰巧名字一样而已没有任何关系。public变量和方法则要看如何访问它。在类内访问的是当前类的但子类可以通过super明确指定访问父类的。在类外则要看访问变量的静态类型静态类型是父类则访问父类的变量和方法静态类型是子类则访问的是子类的变量和方法。我们来看个例子这是基类代码publicclassBase{publicstaticStringsstatic_base;publicStringmbase;publicstaticvoidstaticTest(){System.out.println(base static: s);}}定义了一个public静态变量s一个public实例变量m一个静态方法staticTest。这是子类代码publicclassChildextendsBase{publicstaticStringschild_base;publicStringmchild;publicstaticvoidstaticTest(){System.out.println(child static: s);}}子类定义了和父类重名的变量和方法。对于一个子类对象它就有了两份变量和方法在子类内部访问的时候访问的是子类的或者说子类变量和方法隐藏了父类对应的变量和方法下面看一下外部访问的代码publicstaticvoidmain(String[]args){ChildcnewChild();Basebc;System.out.println(b.s);System.out.println(b.m);b.staticTest();System.out.println(c.s);System.out.println(c.m);c.staticTest();}以上代码创建了一个子类对象然后将对象分别赋值给了子类引用变量c和父类引用变量b然后通过b和c分别引用变量和方法。这里需要说明的是静态变量和静态方法一般通过类名直接访问但也可以通过类的对象访问。程序输出为static_base base basestatic:static_base child_base child childstatic:child_base当通过b静态类型Base访问时访问的是Base的变量和方法当通过c静态类型Child访问时访问的是Child的变量和方法这称之为静态绑定即访问绑定到变量的静态类型。静态绑定在程序编译阶段即可决定而动态绑定则要等到程序运行时。*实例变量、静态变量、静态方法、private方法都是静态绑定的。3、重载和重写重载是指方法名称相同但参数签名不同参数个数、类型或顺序不同​重写是指子类重写与父类相同参数签名的方法。对一个函数调用而言可能有多个匹配的方法有时候选择哪一个并不是那么明显。我们来看个例子这是基类代码publicclassBase{publicintsum(inta,intb){System.out.println(base_int_int);returnab;}}它定义了方法sum下面是子类代码publicclassChildextendsBase{publiclongsum(longa,longb){System.out.println(child_long_long);returnab;}}以下是调用的代码publicstaticvoidmain(String[]args){ChildcnewChild();inta2;intb3;c.sum(a,b);}Child和Base都定义了sum方法这里调用的是哪个sum方法呢子类的sum方法参数类型虽然不完全匹配但是是兼容的父类的sum方法参数类型是完全匹配的。程序输出为base_int_int父类类型完全匹配的方法被调用了。如果父类代码改成下面这样呢publicclassBase{publiclongsum(inta,longb){System.out.println(base_int_long);returnab;}}父类方法类型也不完全匹配了。程序输出为base_int_long调用的还是父类的方法。父类和子类的两个方法的类型都不完全匹配为什么调用父类的呢因为父类的更匹配一些。现在修改一下子类代码更改为publicclassChildextendsBase{publiclongsum(inta,longb){System.out.println(child_int_long);returnab;}}程序输出变为了child_int_long终于调用了子类的方法。可以看出当有多个重名函数的时候在决定要调用哪个函数的过程中首先是按照参数类型进行匹配的换句话说寻找在所有重载版本中最匹配的然后才看变量的动态类型进行动态绑定。4、父子类型转换子类型的对象可以赋值给父类型的引用变量这叫向上转型那父类型的变量可以赋值给子类型的变量吗或者说可以向下转型吗语法上可以进行强制类型转换但不一定能转换成功。我们以前面的例子来看BasebnewChild();Childc(Child)b;Child c (Child)b就是将变量b的类型强制转换为Child并赋值为c这是没有问题的因为b的动态类型就是Child但下面的代码是不行的BasebnewBase();Childc(Child)b;语法上Java不会报错但运行时会抛出错误错误为类型转换异常。一个父类的变量能不能转换为一个子类的变量取决于这个父类变量的动态类型即引用的对象类型是不是这个子类或这个子类的子类。给定一个父类的变量能不能知道它到底是不是某个子类的对象从而安全地进行类型转换呢答案是可以通过instanceof关键字看下面代码publicbooleancanCast(Baseb){returnbinstanceofChild;}这个函数返回Base类型变量是否可以转换为Child类型instanceof前面是变量后面是类返回值是boolean值表示变量引用的对象是不是该类或其子类的对象。5、继承访问权限protected变量和函数有public/private修饰符public表示外部可以访问private表示只能内部使用还有一种可见性介于中间的修饰符protected表示虽然不能被外部任意访问但可被子类访问。另外protected还表示可被同一个包中的其他类访问不管其他类是不是该类的子类。我们来看个例子这是基类代码publicclassBase{protectedintcurrentStep;protectedvoidstep1(){}protectedvoidstep2(){}publicvoidaction(){this.currentStep1;step1();this.currentStep2;step2();}}action表示对外提供的行为内部有两个步骤step1()和step2()使用currentStep变量表示当前进行到了哪个步骤step1()、step2()和currentStep是protected的子类一般不重写action而只重写step1和step2同时子类可以直接访问currentStep查看进行到了哪一步。子类的代码是publicclassChildextendsBase{protectedvoidstep1(){System.out.println(child step this.currentStep);}protectedvoidstep2(){System.out.println(child step this.currentStep);}}使用Child的代码是publicstaticvoidmain(String[]args){ChildcnewChild();c.action();}输出为child step1child step2基类定义了表示对外行为的方法action并定义了可以被子类重写的两个步骤step1()和step2()以及被子类查看的变量currentStep子类通过重写protected方法step1()和step2()来修改对外的行为。这种思路和设计是一种设计模式称之为模板方法。action方法就是一个模板方法它定义了实现的模板而具体实现则由子类提供。模板方法在很多框架中有广泛的应用这是使用protected的一种常见场景。6、可见性重写重写方法时一般并不会修改方法的可见性。但我们还是要说明一点重写时子类方法不能降低父类方法的可见性。不能降低是指父类如果是public则子类也必须是public父类如果是protected子类可以是protected也可以是public即子类可以升级父类方法的可见性但不能降低。看个例子基类代码为publicclassBase{protectedvoidprotect(){}publicvoidopen(){}}子类代码为publicclassChildextendsBase{//以下是不允许的会有编译错误//private void protect(){//}//以下是不允许的会有编译错误//protected void open(){//}publicvoidprotect(){}}为什么要这样规定呢继承反映的是“is-a”的关系即子类对象也属于父类子类必须支持父类所有对外的行为将可见性降低就会减少子类对外的行为从而破坏“is-a”的关系但子类可以增加父类的行为所以提升可见性是没有问题的。7、防止继承final继承是把双刃剑带来的影响就是有的时候我们不希望父类方法被子类重写有的时候甚至不希望类被继承可以通过final关键字实现。final关键字可以修饰变量而这是final的另一种用法。一个Java类默认情况下都是可以被继承的但加了final关键字之后就不能被继承了如下所示publicfinalclassBase{//主体代码}一个非final的类其中的public/protected实例方法默认情况下都是可以被重写的但加了final关键字后就不能被重写了如下所示publicclassBase{publicfinalvoidtest(){System.out.println(不能被重写);}}

相关文章:

Java——继承的细节

继承的细节1、构造方法1.1、父类无默认构造1.2、父类构造调用可被重载的方法2、重名与静态绑定2.1、重名3、重载和重写4、父子类型转换5、继承访问权限protected6、可见性重写7、防止继承final1、构造方法 1.1、父类无默认构造 子类可以通过super调用父类的构造方法&#xff…...

Allegro软件许可浪费?自动释放,版图设计告别卡顿

别再让Allegro许可空转浪费钱了,2026年新方案直接解决卡顿痛点!闲置许可,卡顿陷阱我司2026年某项目组就踩过这个坑:设计工程师临时离职,许可证没回收,两名新员工用着未授权的测试版本,团队干活像…...

AI伦理测试框架:如何系统性评估算法的公平性

在人工智能技术深度渗透各行业的当下,算法决策对社会生活的影响愈发深刻。从招聘筛选、信贷审批到医疗诊断、内容推荐,算法的每一次输出都可能关乎个体权益与社会公平。然而,算法偏见如隐形的阴影,潜藏在数据与代码之中&#xff0…...

SquareBox:声明式本地开发环境管理工具的设计与实践

1. 项目概述:一个开源的、模块化的本地开发环境管理工具如果你和我一样,常年混迹在软件开发的一线,那你一定对“开发环境”这四个字又爱又恨。爱的是,它是我们创造一切的起点;恨的是,它常常是项目启动时最大…...

人事管理|基于SprinBoot+vue的企业人事管理系统(源码+数据库+文档)

人事管理系统 目录 基于SprinBootvue的企业人事管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码…...

MySQL开发环境标准化实践:Docker Compose自动化部署与脚本管理

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“MySQL_Development_Work”。光看名字,你可能会觉得这又是一个普通的MySQL学习笔记或者代码片段合集。但当我点进去,花时间梳理了它的结构、代码和文档后,我发现它…...

CANN CANNBot智能体SIG

CANNBot SIG 【免费下载链接】community 本项目是CANN开源社区的核心管理仓库,包含社区的治理章程、治理组织、通用操作指引及流程规范等基础信息 项目地址: https://gitcode.com/cann/community CANN 社区 Agent 智能体兴趣小组,为社区提供AI辅助…...

基于Electron与AI Agent的桌面伴侣开发:从Shimeji到智能交互

1. 项目概述:当童年梦想遇见现代AI 还记得小时候守在电视机前,看着哆啦A梦从四次元口袋里掏出各种神奇道具,解决大雄所有难题的场景吗?那个蓝色的、圆滚滚的机器人猫,承载了我们无数关于“如果”的幻想。如今&#xff…...

影刀RPA如何实现店群自动化:构建拼多多与TEMU的高并发、防泄密数字基建

大家好,我是林焱,一名专注电商底层自动化架构与定制开发的独立开发者,同时也是获得认证的影刀 RPA 高级开发者。 在 CSDN 这个技术社区,我们经常讨论高并发、微服务和数据安全。如果把这些概念平移到现在的跨境与下沉电商市场&am…...

手把手教你拿下AI智能体行业8大含金量证书,轻松抢占行业高地!

文章介绍了如何进入AI智能体行业,强调了证书的重要性。作者建议读者尽早获取八大含金量高的证书,这些证书门槛友好、企业认可度高,且无需高深技术背景。文章指出,虽然智能体行业兴起不久,竞争不激烈,但行业…...

写给前端的Vue+Prisma+tRPC入门指南

写在前面:这是给前端实验室实习生培训前写的教案及入门指南(因为实验室一个比赛由于各部门人数不均问题导致部分前端实习生没有后端配合,遂得让他们自己写…),写完后觉得应该值得记录一下,本人也只是全栈半…...

AI项目规则生成器:自动化配置AI编程助手规则与技能发现

1. 项目概述:AI项目规则生成器的核心价值如果你和我一样,每天都要和Cursor、Claude Code、Antigravity IDE这些AI编程助手打交道,那你肯定也遇到过这个痛点:每次开一个新项目,都得花大量时间去配置.cursorrules、AGENT…...

基于Docker的Claude插件部署:Centmin Mod环境实战指南

1. 项目概述:一个为Claude AI模型量身打造的插件运行环境如果你和我一样,长期在服务器运维和AI应用部署的第一线摸爬滚打,那你一定对“环境配置”这四个字又爱又恨。爱的是,一个稳定、高效的环境是一切应用的基础;恨的…...

GE Eager Style Graph Builder类关系文档

Eager Style Graph Builder 类关系文档 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供…...

图片元数据修改软件

链接:https://pan.quark.cn/s/501400393eba找了半天没找到比较合适的图片元数据修改软件,用AI搓了一个,用着还行,分享出来给有需要的人,之前发原创给删除了可以检测一些常见AI图的原始数据并给出提示...

AI代理网关设计:统一多模型API调用与管理的开源解决方案

1. 项目概述:一个为AI模型接口设计的智能代理网关 最近在折腾AI应用开发,发现一个挺普遍的需求:当你手头有多个不同厂商的AI模型API(比如OpenAI的ChatGPT、Anthropic的Claude、Google的Gemini等等),想要在自…...

基于Docker容器化部署Atlassian Jira的完整实践指南

1. 项目概述与核心价值最近在帮一个中型研发团队做内部流程工具链的整合,核心需求是搭建一套稳定、可控且易于维护的协作与项目管理平台。在众多方案中,基于容器化部署的 Atlassian Jira 成为了我们的首选。而cptactionhank/docker-atlassian-jira这个 D…...

基于Flipper Zero的万能遥控器:开源硬件与红外/Sub-GHz协议深度解析

1. 项目概述:当万能遥控器遇上开源硬件最近在折腾智能家居和影音设备的朋友,估计都遇到过“遥控器泛滥”的烦恼。电视、机顶盒、空调、风扇、音响、投影仪……每个设备都配一个专属遥控器,不仅占地方,关键时刻还总找不到。市面上的…...

MouseTester终极指南:专业鼠标性能测试工具完全解析

MouseTester终极指南:专业鼠标性能测试工具完全解析 【免费下载链接】MouseTester 项目地址: https://gitcode.com/gh_mirrors/mo/MouseTester 想要精准评估你的鼠标性能表现吗?无论是游戏玩家追求极致的操作响应,还是设计师需要精准…...

CMOS图像传感器低功耗低噪声Zoom ADC电路设计【附电路】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,可以私信,或者点击《获取方式》 (1)逐次逼近粗转换与 ΣΔ 细…...

FPGA多速率信号处理与多相滤波器实现

1. 多速率信号处理基础与FPGA实现价值数字信号处理系统相比模拟系统具有无可比拟的设计自由度,其中最关键的就是系统采样时钟的可控性。多速率滤波技术正是通过动态调整采样率来充分挖掘这一优势的核心方法。在FPGA上实现多速率系统,能够同时满足高性能和…...

大语言模型多智能体系统:架构、应用与挑战

1. 从单兵作战到团队协作:大语言模型多智能体系统的演进与核心架构如果你在过去一年里深度使用过ChatGPT、Claude或者国内的文心一言、通义千问等大模型,你可能会有一个直观的感受:单个大模型在回答具体问题、生成文本或代码片段时已经相当出…...

个人微信接口开发

在微信深度渗透社交与商业场景的今天,个人微信号已成为企业客户运营、用户触达的核心载体。开发个人微信营销系统、自定义机器人、智能客服及群数据分析工具等需求日益增长,但如何高效实现与微信的交互、调用聊天接口并保障安全稳定,成为开发…...

算力时代散热革命:液冷市场星辰大海

🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 211、985硕士,从业16年 从事结构设计、热设计、售前、产品设计、项目管理等工作,涉足消费电子、新能源、医疗设备、制药信息化、核工业…...

构建AI增强的网状思维工作流:从MCP协议到多智能体协同的实践

1. 项目概述:一个为“多动”思维打造的互联工具生态 如果你和我一样,脑子里总是不停地冒出各种想法,从重构一段代码到设计一个全新的交互界面,再到为昨晚的游戏模组构思一个功能,这些念头像烟花一样同时炸开&#xff0…...

three粒子飘动效果

1、总结<template><div id"box"></div></template> <script setup> import * as three from three; import { onMounted } from vue; import { OrbitControls } from three/addons/controls/OrbitControls.js; import ring from "…...

RWKV Runner:一站式桌面应用,轻松部署与集成开源大语言模型

1. 项目概述&#xff1a;RWKV Runner&#xff0c;一个让大模型触手可及的“全能管家”如果你对开源大语言模型&#xff08;LLM&#xff09;感兴趣&#xff0c;尤其是对那个以“RNN架构”和“Transformer级性能”而闻名的RWKV模型系列有所耳闻&#xff0c;但又被繁琐的环境配置、…...

Rewardful vs PartnerShare:2026 联盟营销管理追踪软件对比指南

选择合适的联盟营销管理系统&#xff0c;能让SaaS企业在2026年的增长竞争中事半功倍。Rewardful和PartnerShare分别是海外与国内市场备受关注的两款工具&#xff0c;本文将从功能、定价、支付集成等维度进行全方位对比&#xff0c;帮你快速做出最适合业务阶段的选择。一、什么是…...

AI编程助手如何对抗能力错觉?agentic-learning技能包实战指南

1. 项目概述&#xff1a;一个能让你真正学会编程的AI伙伴 如果你用过Cursor、Claude Code或者GitHub Copilot这类AI编程助手&#xff0c;大概率有过这样的体验&#xff1a;你抛出一个问题&#xff0c;它瞬间给你一段完美的代码。你复制粘贴&#xff0c;程序跑起来了&#xff0…...

【2026】企业工商照面信息查询:深入了解企业的33项核心数据

企业工商照面信息查询&#xff1a;深入了解企业的33项核心数据在企业服务、金融风控、政务审批等场景中&#xff0c;全面了解企业工商信息至关重要。本文介绍一种高效的企业工商照面查询方案&#xff0c;帮助开发者快速获取企业的完整注册信息。一、为什么需要工商照面信息 企业…...