Java关键字super解释

article/2025/8/15 14:42:35

目录

  • 前言(废话文学)
  • 前言(定义)
  • super()之构造方法
  • super()之成员函数
  • super()之成员变量
  • 结束语

前言(废话文学)

又是看了一大堆文字介绍,非常系统和官方,理解要费半天劲,所以总结一下super它到底有啥用,还有代码演示也会放出来,这里使用的IDE为idea

前言(定义)

还是先官方一下

在java中,super表示超类(就是我们俗称的父类),当子类需要引用父类的字段时,我们就可以使用super.FieldName.



因此,本文就将从构造函数,公有成员函数,公有成员变量来分别演示super的作用,因为private私有成员是只允许自己使用的,所以这里也可以看出,super在继承关系中,对公有字段起作用。

super()之构造方法

如果父类(超类)没有默认的构造方法,子类就必须显式调用super(),并且必须使用父类中的某个构造方法的参数。

什么意思呢?
就是有一个父类Parent,子类Son,如果我们在Parent中定义了构造函数,那么在继承父类的子类中就必须书写父类的构造函数。那么此时就需要将super()写在子类构造方法中。
如果父类中没有定义构造方法,那么编译器会默认是public Parent(){}就是空的,此时在子类中不书写super也不会报错,因为编译器默认生成子类构造方法为空,super()就默认是隐藏的。
就是构造函数必须有super(),(开个玩笑:你说那我看到的有的咋没有,不是没有,只是只有聪明人能看见嘿嘿嘿。)如果子类中没有super(),那是因为编译器替你干了这个活,它隐藏了super()这个默认的无参构造方法,算是隐式调用。
注意显式二字。

来了来了,代码示例它来了

父类

public class Parent {//public Parent(){}//可以不写,编译器会默认是它,空的// 为了查看效果,我们把父类无参构造函数里加个输出public Parent(){System.out.println("This is Parent!");}
}

子类

public class Son extends Parent{public Son(){//此时不写super也不会报错,因为编译器默认是有super(),只不过隐藏了。System.out.println("This is son!");}
}

MyMain.java

public class MyMain {public static void main(String[] args){Son son = new Son();}
}

来,让我们看看效果,会发现父类构造方法也执行了。所以说super()意思就是调用父类的方法,往往我们通过传参的方式来达到我们所先要的结果
1
现在修改父类代码如下

public class Parent {public Parent(String name,int id){System.out.println(name+"  "+id);}
}

子类代码如下

public class Son extends Parent{public Son(String name,int id){System.out.println("This is son!");}
}

MyMain类代码如下

public class MyMain {public static void main(String[] args){String name ="Bob";int id=12;Son son = new Son(name,id);}
}

当当当,报错了,为啥,你没写super,因为默认隐藏super是super(),它没有传入任何参数,就导致子类在继承父类时,父类构造器就无法应用到子类中。
java: 无法将类 Parent中的构造器 Parent应用到给定类型;

1
修改子类代码如下,其它不变,发现可以运行了,因为传入了String参数和int参数,与父类一致,所以super()表示子类使用父类构造函数,(就是子类重载了父类函数,因为函数名和参数都必须相同),同时它也可以自己在构造函数中添加其它逻辑:

public class Son extends Parent{public Son(String name,int id){super(name, id);System.out.println("This is son!");}
}

1

super()之成员函数

对于可继承的成员函数,如果子类在重写父类的方法同时想要调用(实现)与父类相同的方法,那么就用super.func(obj,obj,…)。与构造函数不同的是,super.func()可以不用放在函数一开始的位置,而构造方法的super()必须放在函数体中最前面的位置。

来了来了,代码示例它来了
父类

public class Parent {private String name="Pang pang";private int id=12;private String selfIntro="This is a fat parent";public Parent(){}public void getName() {System.out.println(name);}public void getId(){System.out.println(id);}public void getSelfIntro() {System.out.println(selfIntro);}
}

子类

public class Son extends Parent{private static String sonIntro="This is Feifei's child";public Son(){System.out.println("This is Son:");}@Overridepublic void getSelfIntro() {System.out.println(sonIntro);System.out.println("I want to see my parents' introduction: ");super.getSelfIntro();//可写可不写,只是看子类想不想调用它,它可以放在任何想调用的位置,返回的是父类的介绍//如果子类想调用却不写super的话就会报错}
}

主类

public class MyMain {public static void main(String[] args){//从子类读取信息Son son = new Son();son.getSelfIntro();}
}

结果展示
1
看到这,你一定想问,那要是一个有参数的成员函数咋个整呢,是啊,咋个整呢。其实你会发现,需要传参的一般情况下不会再调用super,因为子类优先原则会覆盖掉父类的数据,比如下面来演示一下。当然有的参数不影响的情况下,想要调用父类的含参成员函数还是可以调用super的

父类

public class Parent {private String name;private int id;public Parent(){}public void setInfo(String name,int id){this.name=name;this.id=id;}public void getInfo(){System.out.println(name+"  "+id);}
}

子类

public class Son extends Parent{private String name;private int id;public Son(){}@Overridepublic void setInfo(String name,int id){super.setInfo(name,id);//将值传递给父类this.name=name;this.id=id;}@Overridepublic void getInfo(){//打印信息System.out.println("This is parents' information:");super.getInfo();System.out.println("This is son's information: ");System.out.println(name+"  "+id);}
}

主类

public class MyMain {public static void main(String[] args){//由于子类优先原则,会将所有的值由子类传递给父类,顺便演示一下子类优先原则//设置父类信息Parent parent=new Parent();String pName="Pang pang";int pId = 11;parent.setInfo(pName,pId);System.out.println("This is first parent:");parent.getInfo();//打印出来看看,此时还是很正常的父类的值//设置子类信息,会发现父类信息失效了Son son = new Son();String sName = "Fei fei";int sId = 15;son.setInfo(sName,sId);son.getInfo();}
}

1

super()之成员变量

通过super.变量名就可以在子类中访问父类的成员变量,但是只有protected和public的成员变量可以被访问,而private的变量子类是访问不到的。

父类

public class Parent {private String inf1 = "Parent: stupid!";protected String inf2 = "Parent: Kids!";public String inf3 = "Parent: eat!";}

子类

public class Son extends Parent{private String inf1;protected String inf2;public String inf3;public Son(){}public void setInfo(String inf1,String inf2,String inf3){this.inf1=inf1;this.inf2=inf2;this.inf3=inf3;}public void getInfo(){//打印信息System.out.println("This is son's information: ");System.out.println(inf1);System.out.println(inf2);System.out.println(inf3);System.out.println("This is parents' information:");//System.out.println(super.inf1);System.out.println(super.inf2);System.out.println(super.inf3);}
}

主类

public class MyMain {public static void main(String[] args){//设置子类信息Son son = new Son();String ss1 = "Son: mom!";String ss2 = "SOn: sorry!";String ss3 = "Son: play!";son.setInfo(ss1,ss2,ss3);son.getInfo();}
}

运行结果
1
如果调用了private变量时会报错的,如下图
1

结束语

总结在前言,到此super解析完成,若有疑问或者任何问题欢迎指出。


http://chatgpt.dhexx.cn/article/lAn0PY0F.shtml

相关文章

Java中super详解

目录 Java中super详解 super的作用: 1. 通过super可以访问父类的构造方法 2. 通过super可以访问父类的属性(非私有) 3. 通过super可以访问父类的方法(非私有的方法) Java中super详解 在说super之前…

网络安全工程师零基础入门:(企业级)从入门到精通学习路线规划,学完即可就业

前言 最近总能在网上看到很多诸如:“怎样成为网络信息安全工程师”等相关问题,这可能与近几年网络安全事件频发,国家对于互联网信息安全和互联网舆情的重视程度不断提升有关,似乎网络信息安全工程师随之成为炙手可热的职业。 很…

网络安全工程师需要学哪些内容?零基础如何从入门到精通,看完这一篇就够了

网络安全工程师需要学习哪些内容? 作为一名网络安全工程师,需要学习以下内容: 计算机网络和操作系统:网络安全工程师需要了解计算机网络和操作系统的基础知识,以便理解网络安全的基础原理。 网络协议和技术&#xff…

论零基础自学web安全如何成为一名网络安全工程师

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决. …

网络安全工程师必备的七大技能

网络安全有多重要 网络安全非常重要,因为在现代社会中,人们日常生活中的很多方面都与网络有关。随着互联网和数字技术的不断发展,人们已经变得越来越依赖网络,网络已经成为了商业、金融、通信、交通、能源、医疗、教育等各个领域…

自学黑客(网络安全),一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而…

自学网安十余载,如何成为一名网络安全工程师?

前言 说实话,直到现在,我都认为绝大多数看我这篇文章的读者最后终究会放弃,原因很简单,自学终究是一种适合于极少数人的学习方法,学习进度非常非常慢,在这个过程中的变数过大,稍有不慎&#xf…

成为一名网络安全工程师,你应该学习什么?

前言 这是我的建议如何成为网络安全工程师,你应该按照下面顺序学习。 简要说明 第一件事你应该学习如何编程,我建议首先学python,然后是java。 (非必须)接下来学习一些算法和数据结构是很有帮助的,它将帮…

零基础自学网络安全?劝你还是别做梦了,你可能不知道这行门槛有多高...

前言 作为一名5年网安工程师老菜鸟来说,我实在想不通,开发岗位那么多,为什么要来学网安? 在这里必须给那些准备入坑的同学泼几盆冷水!零基础自学网络安全?劝你还是别做梦了! 待遇 我想不管什么工作&am…

网络安全自学能学会吗?网络安全如何学习

网络安全是近年来的热门工作,吸引了许多小伙伴开始学习网络安全知识。那么我们应该如何学习网络安全呢?这是一个很多人都在考虑的问题。网络安全可以自学吗?自学网络安全能不能学会? 无论什么知识都是自学的,只是说每…

入门网络安全工程师要学什么

根据最新版网络安全产业人才发展报告发布的信息得到的结论: 1、疫情常态化后,国内经济回温,网络安全人才需求增长,2021年上半年需求就较去年增长39.87%,平均薪酬较往年提高4.85%。 2、网络安全工程师从业趋势年轻化&a…

网络安全系统教程+渗透测试+学习路线(自学笔记)

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性…

网络安全工程师自学教程2023年最新版

什么是黑客? 你以为的黑客是这样的: 黑客帝国 实际上,黑客可能是街边炒粉的大叔、穿着格子衫的路人甲、一位体重再增加就得买3人座的“小胖” 著名黑客Richard Stallman 黑客是一类掌握超高计算机技术的人群。凭着掌握的知识,他…

网络安全工程师自学教程,从零基础到精通2023年最新版,想入坑的收藏这一篇就够了,全程无尿点

前言 网络安全非常重要,因为随着互联网的普及和应用的广泛,网络攻击的威胁也越来越大,如果不重视网络安全,可能会导致个人隐私泄露、财产损失、国家安全受到威胁等问题。因此,保障网络安全对于个人和社会都非常重要。…

网络安全工程师一般都是自学的吗?

前言 谈起黑客,可能各位都会想到:盗号,其实也不尽然;黑客是一群喜爱研究技术的群体,在黑客圈中,一般分为三大圈:娱乐圈 技术圈 职业圈。 娱乐圈:主要是初中生和高中生较多&#xf…

网络安全(黑客)自学

黑客,对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域,越深入越敬畏! 学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发 3.有…

零基础如何自学成为网络安全工程师

前言 一份网络攻防渗透测试的学习路线,不藏私了! 👉 【一帮助安全学习一】👈这里自取256G网络安全自学资料 1、学习编程语言(phpmysqljshtml) 原因: phpmysql可以帮助你快速的理解B/S架构是怎样运行的&#xff0c…

如何通过3个月自学成为网络安全工程师!

前言: 趁着今天下班,我花了几个小时整理了下,非常不易,希望大家可以点赞收藏支持一波,谢谢。 我的经历: 我 19 年毕业,大学专业是物联网工程,我相信很多人在象牙塔里都很迷茫&…

网络安全工程师入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

前言 想要成为网络安全工程师,却苦于没有方向,不知道从何学起的话,下面这篇 网络安全入门 教程可以帮你实现自己的网络安全工程师梦想,如果想学,可以继续看下去,文章有点长,希望你可以耐心看到…

零基础自学网络安全,来收藏这一篇就够了,白嫖网安教程,

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…