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

【Java SE】super 关键字详解

super 关键字详解

  • super 的本质与作用
  • super 的三种用法
    • a) 调用父类构造方法
    • b) 访问父类属性
    • b) 调用父类方法
  • 深入理解 super 的查找机制(查找路径规则)
  • super 与 this 的完整对比
  • 常见陷阱
    • 陷阱1:在静态方法中使用 super
    • 陷阱2:super 与多态的误解
    • 陷阱3:构造方法中 this 和 super 的冲突

super 的本质与作用

super是 Java 中的一个引用变量,用于直接引用父类对象。它不是一个独立的对象,而是当前对象中对父类部分的引用。

核心作用

  • 解决子类与父类中成员(属性、方法)的命名冲突
  • 显式调用父类的构造方法
  • 实现父类功能的复用与扩展

super 的三种用法

用法示例说明
调用父类构造方法super(参数)必须在子类构造方法第一行
访问父类属性super.属性名当子类属性隐藏父类属性时使用
调用父类方法super.方法名()当子类重写父类方法时使用

a) 调用父类构造方法

子类构造方法需要初始化继承自父类的属性,或调用父类特定的构造逻辑。

语法规则

  • 必须写在子类构造方法的第一行
  • 如果子类构造方法中没有显式调用super(...),编译器会自动插入super()(调用父类的无参构造)
  • 如果父类没有无参构造,子类必须显式调用父类的带参构造
classAnimal{Stringname;intage;// 父类带参构造publicAnimal(Stringname,intage){this.name=name;this.age=age;System.out.println("父类构造被调用");}publicAnimal(){System.out.println("父类无参构造被调用");}}classDogextendsAnimal{Stringbreed;// 显式调用父类带参构造publicDog(Stringname,intage,Stringbreed){super(name,age);// 必须第一行this.breed=breed;}// 默认调用父类无参构造publicDog(){// 隐式调用 super()System.out.println("子类构造被调用");}}

执行顺序验证

publicclassTest{publicstaticvoidmain(String[]args){Dogdog1=newDog("旺财",3,"金毛");System.out.println("---");Dogdog2=newDog();}}

输出

父类构造被调用 --- 父类无参构造被调用 子类构造被调用

b) 访问父类属性

子类定义了与父类同名的属性(属性隐藏),需要访问父类的属性时。

classParent{Stringname="父类名字";StringparentOnly="父类特有属性";}classChildextendsParent{Stringname="子类名字";// 隐藏了父类的 namevoidprintNames(){System.out.println("直接访问 name: "+name);// 子类System.out.println("this.name: "+this.name);// 子类System.out.println("super.name: "+super.name);// 父类System.out.println("父类特有属性: "+parentOnly);// 可直接访问}}

注意事项

  • super不能跨级访问祖父类的属性(只能直接访问父类)
  • 如果父类属性是private,则super也无法直接访问

b) 调用父类方法

  • 子类重写了父类方法,但仍需使用父类的原有功能
  • 在子类方法中扩展父类方法的功能
classCalculator{protectedintadd(inta,intb){returna+b;}protectedvoidshowInfo(){System.out.println("这是计算器类");}}classAdvCalculatorextendsCalculator{// 重写并扩展父类方法@Overrideprotectedintadd(inta,intb){// 先调用父类方法,再添加额外逻辑intresult=super.add(a,b);System.out.println("计算结果: "+result);returnresult;}@OverrideprotectedvoidshowInfo(){super.showInfo();// 复用父类逻辑System.out.println("这是高级计算器类");}}

输出验证

publicclassTest{publicstaticvoidmain(String[]args){AdvCalculatorcalc=newAdvCalculator();calc.add(3,5);calc.showInfo();}}

输出

计算结果: 8 这是计算器类 这是高级计算器类

深入理解 super 的查找机制(查找路径规则)

classGrandParent{voidmethod(){System.out.println("GrandParent");}}classParentextendsGrandParent{voidmethod(){System.out.println("Parent");}}classChildextendsParent{voidmethod(){System.out.println("Child");}voidtest(){// super 从直接父类开始向上查找super.method();// 调用 Parent 的 method// 无法直接调用 GrandParent 的 method(需要间接方式)}voidcallGrandParent(){// 间接调用祖父类的方法((GrandParent)this).method();// 注意:这是运行时绑定,实际仍是调用子类的// 正确方式:通过父类的 supernewParent().method();// 创建父类实例调用}}

重要理解

  • super不是独立对象,不能写super.super.method()
  • super遵循静态绑定(编译时确定调用哪个类的方法)
  • 当调用super.method()时,直接查找父类的方法定义,不会向下查找

super 与 this 的完整对比

比较维度superthis
查找起点从父类开始向上查找从当前类开始向上查找
适用范围父类构造、父类成员本类构造、本类成员
独立性不是独立对象,只是引用当前对象的引用
在构造方法中调用父类构造,必须在第一行调用本类其他构造,必须在第一行
能否同时使用不能同时使用(都需在第一行)不能同时使用(都需在第一行)
静态上下文中不能使用不能使用
访问权限受父类访问修饰符限制受本类访问修饰符限制

代码演示

classBase{Stringname="Base";voidshow(){System.out.println("Base show");}}classDerivedextendsBase{Stringname="Derived";voidshow(){System.out.println("Derived show");}voiddemonstrate(){// this 和 super 的对比System.out.println(this.name);// DerivedSystem.out.println(super.name);// Basethis.show();// Derived showsuper.show();// Base show// 类型比较System.out.println(thisinstanceofBase);// true// System.out.println(super instanceof Base); // 编译错误,super不能用于instanceof}}

常见陷阱

陷阱1:在静态方法中使用 super

classTest{staticvoidstaticMethod(){// super.toString(); // 编译错误!不能在静态上下文使用 super}publicstaticvoidmain(String[]args){// 不能在静态上下文使用 super}}

陷阱2:super 与多态的误解

classParent{voidmethod(){System.out.println("Parent");}}classChildextendsParent{voidmethod(){System.out.println("Child");}voidcallParent(){// 即使子类重写了方法,super.method() 一定调用父类的super.method();// 输出 "Parent"}}

陷阱3:构造方法中 this 和 super 的冲突

classChildextendsParent{Child(){// this("hello"); // 如果调用本类其他构造// super(); // 就不能同时调用 super()// 两者只能选其一}Child(Strings){super();// 必须第一行}}
http://www.jsqmd.com/news/490605/

相关文章:

  • 聊聊好用的OA软件精品定制,南京阔友信息技术有限公司口碑如何? - 工业推荐榜
  • 什么是HTTP检测?实用指南在此
  • COMSOL 6.1光镊捕获小球与光力求解
  • 超级扩展与优化方案:从入门到专家的企业级漏洞治理全景实战课程体系
  • 聚焦品质:评测国内几家知名浮动球阀制造厂家,市场上热门的浮动球阀品牌有哪些行业优质分析亮相 - 品牌推荐师
  • 【2026年滴滴春招- 3月15日 -第一题- 划分】(题目+思路+JavaC++Python解析+在线测试)
  • 探寻2026年用友系统供应商,哪家能提供优质服务和解决方案 - myqiye
  • 全面入门 ASP.NET:从 Web Pages 到 MVC 与 Web Forms 的系统教程
  • 盘点全国靠谱的本地上门名包回收公司,哪家值得推荐? - 工业品网
  • 数字化转型之路:如何挑选好用的订货管理系统助力企业增长
  • 深聊2026年热锻造制造商,交货准时和性价比如何 - 工业设备
  • 基于S-S或LCC-S结构的WPT无线电能传输电路模型,采用输出电压闭环PI控制。 另附带电路...
  • 2026年出入口安防设备选购指南,沧州北京天津太原靠谱厂家推荐 - 工业品牌热点
  • 2026年3月广州仲裁律师专业靠谱推荐榜 五大资深律师实力上榜 - 外贸老黄
  • 2026标准气企业选择有门道,看齐行业优质标准,标准气品牌优选品牌推荐与解析 - 品牌推荐师
  • 多功能数字货币交易所系统源码(秒合约 币币交易 C2C 质押理财完整版)
  • PSRR 仿真教程,怎么仿真电路的psrr 两个电路案例,一个是16分频的分频器
  • 速看!2026防腐防锈圆顶通风口定制厂家优质分析,国内头部圆顶通风口品牌推荐分析精选综合实力推荐企业 - 品牌推荐师
  • 2026年京津冀地区优质锚具厂商排名,推荐技术强售后好的靠谱生产厂 - mypinpai
  • 2026南京高功率密度电源定制,这些源头厂家有实力,模块电源/光伏电源/电源模块,高功率密度电源产品口碑推荐 - 品牌推荐师
  • Phi-3-vision-128k-instruct开发者案例:基于vLLM API构建多租户图文问答SaaS服务
  • 算法设计与分析-习题5.1
  • 轻量级AI助手!Qwen2.5-0.5B-Instruct快速部署与体验全攻略
  • Phi-3-vision-128k-instruct一文详解:Phi-3多模态家族中128K上下文的技术突破点
  • 聊聊德阳市双级活塞推料离心机厂家,靠谱的有哪些? - 工业推荐榜
  • MedGemma-X开箱即用体验:预装环境,零配置快速体验智能诊断
  • Terraform之output模块
  • 树莓派+OpenClaw+飞书配置教程【养龙虾】
  • 2026年安徽地区系统管理软件选购指南,靠谱生产商排名 - myqiye
  • Qwen3-14B开源可部署指南:无需编译,直接运行int4 AWQ量化大模型服务