Java中super关键字介绍

article/2025/8/15 14:11:32

由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字。super 可以用来访问父类的构造方法、普通方法和属性。

super 关键字的功能:

  • 在子类的构造方法中显式的调用父类构造方法
  • 访问父类的成员方法和变量。

1、使用super调用父类的构造方法

super必须是子类构造方法中头一条语句

当我们在父类中定义多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略super时出现错误

声明父类 Person 和子类 Student,在 Person 类中定义一个带有参数的构造方法,代码如下:

public class Person {public Person(String name) {}
}
public class Student extends Person {}

会发现 Student 类出现编译错误,提示必须显式定义构造方法,错误信息如下:

Implicit super constructor Person() is undefined for default constructor. Must define an explicit constructor

在本例中 JVM 默认给 Student 类加了一个无参构造方法,而在这个方法中默认调用了 super(),但是 Person 类中并不存在该构造方法,所以会编译错误。

如果一个类中没有写任何的构造方法,JVM 会生成一个默认的无参构造方法。在继承关系中,由于在子类的构造方法中,第一条语句默认为调用父类的无参构造方法(即默认为 super(),一般这行代码省略了)。所以当在父类中定义了有参构造方法,但是没有定义无参构造方法时,编译器会强制要求我们定义一个相同参数类型的构造方法。 

子类 Student 继承了 Person 类,使用 super 语句来定义 Student 类的构造方法。示例代码如下:

public class Student extends Person {public Student(String name, int age, String birth) {super(name, age); // 调用父类中含有2个参数的构造方法}public Student(String name, int age, String sex, String birth) {super(name, age, sex); // 调用父类中含有3个参数的构造方法}
}

 从上述 Student 类构造方法代码可以看出,super 可以用来直接调用父类中的构造方法,使编写代码也更加简洁方便。
编译器会自动在子类构造方法的第一句加上super();来调用父类的无参构造方法,必须写在子类构造方法的第一句,也可以省略不写。通过 super 来调用父类其它构造方法时,只需要把相应的参数传过去。

public class Student 
{int number;String name;Student(){}Student(int number, String name){this.number = number;this.name = name;}public int getNumber(){return number;}public String getName(){return name;}
}
public class UniverStudent extends Student
{boolean isMarriage;   //子类新增的结婚属性UniverStudent(int number, String name, boolean b){super(number, name);}public boolean getIsMarriage(){return isMarriage;}
}
public class Example5_6 
{public static void main(String[] args) {UniverStudent zhang = new UniverStudent(20111, "张三", false);int number = zhang.getNumber();String name = zhang.getName();boolean marriage = zhang.getIsMarriage();System.out.println(name + "的学号是:" + number);if(marriage == true){System.out.println(name + "已婚");}else{System.out.println(name + "未婚");}}
}

2、调用被隐藏的成员变量和方法

使用 super 访问父类中的成员与 this 关键字的使用相似,只不过它引用的是子类的父类,语法格式如下:

super.member

其中,member 是父类中的属性或方法。使用 super 访问父类的属性和方法时不用位于第一行。

子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super。比如super.xsuper.play()就是访问和调用被子类隐藏的成员变量x和方法play()

super调用隐藏的方法时,该方法中出现的成员变量是指被隐藏的成员变量

public class Sum 
{int n;public double f(){double sum = 0;for(int i = 1; i<= n; i++){sum += i;}return sum;}
}
public class Average extends Sum 
{double n;  //子类继承的int型变量n被隐藏public double f(){double c;super.n = (int)n;  //double类型变量n做int转换,将结果赋给隐藏的int型变量nc = super.f();return c + n;}public double g(){double c;c = super.f();return c - n;}
}
public class Example5_7 
{public static void main(String[] args) {Average aver = new Average();aver.n = 100.5678;double result1 = aver.f();double result2 = aver.g();System.out.println("result1 = " + result1);System.out.println("result2 = " + result2);}
}

如果改写成(颠倒顺序)

double result2 = aver.g();double result1 = aver.f();

运行结果:

result1 = 5150.5678

result2 = -100.5678

因为执行“aver.g();”的过程中需要执行"super.f();",super.f()中出现的n是隐藏的n且n还没有赋值。默认为0;

3、super和this的区别

this 指的是当前对象的引用,super 是当前对象的父对象的引用。下面先简单介绍一下 super 和 this 关键字的用法。

super 关键字的用法:

  • super.父类属性名:调用父类中的属性
  • super.父类方法名:调用父类中的方法
  • super():调用父类的无参构造方法
  • super(参数):调用父类的有参构造方法

如果构造方法的第一行代码不是 this() 和 super(),则系统会默认添加 super()。


this 关键字的用法:

  • this.属性名:表示当前对象的属性
  • this.方法名(参数):表示调用当前对象的方法

当局部变量和成员变量发生冲突时,使用this.进行区分。

关于 Java super 和 this 关键字的异同,可简单总结为以下几条。

  1. 子类和父类中变量或方法名称相同时,用 super 关键字来访问。可以理解为 super 是指向自己父类对象的一个指针。在子类中调用父类的构造方法。
  2. this 是自身的一个对象,代表对象本身,可以理解为 this 是指向对象本身的一个指针。在同一个类中调用其它方法。
  3. this 和 super 不能同时出现在一个构造方法里面,因为 this 必然会调用其它的构造方法,其它的构造方法中肯定会有 super 语句的存在,所以在同一个构造方法里面有相同的语句,就失去了语句的意义,编译器也不会通过。
  4. this( ) 和 super( ) 都指的是对象,所以,均不可以在 static 环境中使用,包括 static 变量、static 方法和 static 语句块。
  5. 从本质上讲,this 是一个指向对象本身的指针, 然而 super 是一个 Java 关键字。

在 Animal 类和 Cat 类中分别定义了 public 类型的 name 属性和 private 类型的 name 属性,并且 Cat 类继承 Animal 类。那么,我们可以在 Cat 类中通过 super 关键字来访问父类 Animal 中的 name 属性,通过 this 关键字来访问本类中的 name 属性,如下面的代码:

// 父类Animal的定义
public class Animal {public String name; // 动物名字
}//子类Cat的定义
public class Cat extends Animal {private String name; // 名字public Cat(String aname, String dname) {super.name = aname; // 通过super关键字来访问父类中的name属性this.name = dname; // 通过this关键字来访问本类中的name属性}public String toString() {return "我是" + super.name + ",我的名字叫" + this.name;}public static void main(String[] args) {Animal cat = new Cat("动物", "喵星人");System.out.println(cat);}
}
我是动物,我的名字叫喵星人

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

相关文章

关于Java中super的应用

super( )的用法 大白话解释一下super( ) : super( )其实就相当于一个指向基类的指针&#xff0c;&#xff08;Java中没有指针&#xff0c;但是可以这样理解&#xff09;。至于用法有一下三种形式&#xff1a; 1. super.XXX( 这里的XXX指的是父类的成员变量名即父类的属性&#…

java中super的用法

java中super的用法 super只在子类中出现super有三种用法 【1】 super.xxx; xxx可以是类的属性。例如super.name;即从子类中获取父类name属性的值 【2】 super.xxx(); xxx()可以是类中的方法名。super.xxx();的意义是直接访问父类中的xxx()方法并调用 【3】 super(); 此方法意…

Java关键字:super

文章目录 一、super关键字的使用二、子类对象实例化的全过程三、Eclipse的debug调试 一、super关键字的使用 1、super理解为&#xff1a;父类的…… 2、super可以用来调用&#xff1a;属性、方法、构造器 3、super的使用&#xff1a;调用属性或方法 重写只是对父类中的方法&am…

Java关键字super解释

目录 前言&#xff08;废话文学&#xff09;前言&#xff08;定义&#xff09;super()之构造方法super()之成员函数super()之成员变量结束语 前言&#xff08;废话文学&#xff09; 又是看了一大堆文字介绍&#xff0c;非常系统和官方&#xff0c;理解要费半天劲&#xff0c;所…

Java中super详解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

网络安全(黑客)自学

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