Java中super关键字及super()的使用

Java中super关键字及super()的使用super 关键字的使用 1 super 是一个关键字 2 super 和 this 很类似 我们对比着学习 先复习一下 this 关键字的使用 this 关键字 this 能出现在实例方法和构造方法中 this 的语法是 this 和 this this 不能出现在静态方法中 this 大部分情况下是可以省略的 this 什么时候不能省略呢 在区分局部变量和实例变量时不能省略 例如 Publicvoidse Stringname this name name

Java中super关键字及super()的使用:

1、super的使用:

(1)super是一个关键字。

(2)super和this很类似,我们对比着学习。


2、先复习一下this关键字的使用。

Public void setName(String name){ 
     this.name = name; } 

(6)this()只能出现在构造方法的第一行,通过当前的构造方法去调用“本类”中的对应的构造方法,目的是:代码复用。


3、super关键字:

(1)super能出现在实例方法和构造方法中。

(2)super的语法是“super.”和“super()”。

(3) super不能出现在静态方法中。

(4) super大部分情况下是可以省略的。

super和this区别是:this可以看做一个引用变量,保存了该对象的地址,是当前对象整体,而super代表的是父类型特征,是子类局部的一些东西,这些继承过来的东西已经在子类里面了,你可以输出整体this,但不能输出父类型特征super。因为super指向的东西不是一个整体,没法打印输出。

System.out.println(this); //输出this.toString()的值 System.out.println(super); //编译报错,需要'.' 

当在子类对象中,子类想访问父类的东西,可以使用“super.”的方式访问。例如:方法覆盖后,子类内部虽然重写了父类的方法,但子类也想使用一下父类的被覆盖的方法,此时可以使用“super.”的方式。当子类中出现和父类一样的属性或者方法,此时,你要想去调用父类的那个属性或者方法,此时“super.”不能省略。

(6)super()只能出现在构造方法的第一行,通过当前的构造方法去调用“父类”中的对应的构造方法,目的是:创建子类对象时,先初始化父类型特征。

用通俗的话来讲,要想有儿子,得先有父亲。

//父类,Animal类 class Animal { 
      //构造函数 public Animal() { 
      System.out.println("Animal类的无参数构造函数执行"); } } //子类,Cat类 class Cat extends Animal{ 
      //构造函数 public Cat() { 
      System.out.println("Cat类的无参数构造函数执行"); } } 

执行下面一行代码:

public static void main(String[] args) { 
      Cat cat = new Cat(); } 

运行输出结果为:

Animal类的无参数构造函数执行 Cat类的无参数构造函数执行 

我们发现实例化一个子类的对象,也就是调用了子类的构造方法,为什么父类的无参数构造方法也执行了,并在子类构造方法执行之前就已经执行了父类的无参数构造方法,好奇怪。

刚刚在上面的super关键字的使用第6点,我已经说了,super()和this()方法一样,都只能在构造方法的第一行出现。我们猜想,难道子类的构造方法第一行有一个隐形的super()方法?答案是肯定的。

我们把子类的构造方法的第一行给它加上super():

//子类,Cat类 class Cat extends Animal{ 
      //构造函数 public Cat() { 
      super(); System.out.println("Cat类的无参数构造函数执行"); } } 

再执行下面代码:

Cat cat = new Cat(); 

运行输出结果为:

Animal类的无参数构造函数执行 Cat类的无参数构造函数执行 

和刚才的子类构造方法没加super()的运行结果是一样的。

所以说当子类的构造方法内第一行没有出现“super()”时,系统会默认给它加上无参数的”super()”方法

上面谈的都是无参数的“super”方法,我们也可以在构造方法的第一行使用有参数的“super(父类构造函数的参数列表)”,但值得注意的是,当子类构造方法执行有参数的“super(参数列表)”方法,你得确保父类中也有对应的有参数构造方法,不然会编译报错。同样我要提醒一下,当子类构造方法的第一行执行super()无参数方法,那么父类中一定要有无参数构造方法,有的人可能会在父类中写了有参数的构造方法,却忽略了写无参数构造方法,那么在子类构造方法内就会报错,因为当你在一个类中写了有参数的构造方法时,无参数构造方法就会不存在,你需要自己补上无参数的构造方法,这是一个良好的编程习惯。

无论你子类构造方法有没有“this()”和“super()”方法,实例化子类对象一定一定会执行对应的父类构造方法,即不管实例化了一个怎样的孩子,它一定会先实例化一个对应的父亲。


下面给道例题练习一下this()和super()方法:

public class MyTest { 
       public static void main(String[] args) { 
       new Cat(); } } //父类,Animal类 class Animal { 
       //构造函数 public Animal() { 
       super(); System.out.println("1:Animal类的无参数构造函数执行"); } public Animal(int i) { 
       super(); System.out.println("2:Animal类的有int参数构造函数执行"); } } //子类,Cat类 class Cat extends Animal{ 
       //构造函数 public Cat() { 
       this(""); System.out.println("3:Cat类的无参数构造函数执行"); } public Cat(String str) { 
       super(5); System.out.println("4:Cat类的有String参数构造函数执行"); } } 

输出结果为:

2:Animal类的有int参数构造函数执行 4:Cat类的有String参数构造函数执行 3:Cat类的无参数构造函数执行 

我们又可以得出一个结论:不管你创建什么对象,Object对象的无参数构造方法一定会先执行,因为Object是所有类的根类。


说了这么多,super()到底什么时候使用?再来看下面代码:

public class MyTest { 
        public static void main(String[] args) { 
        Cat c1 = new Cat(3); System.out.println("名字:" + c1.getName()); System.out.println("年龄:" + c1.getAge()); } } //父类,Animal类 class Animal { 
        //私有属性:名字 private String name; //setter and getter public void setName(String name) { 
        this.name = name; } public String getName() { 
        return name; } //构造函数 public Animal() { 
        } public Animal(String name) { 
        this.name = name; } } //子类,Cat类 class Cat extends Animal{ 
        //私有字段:年龄 private int age; //setter and getter public void setAge(int age) { 
        this.age = age; } public int getAge() { 
        return age; } //构造函数 public Cat() { 
        } public Cat(int age) { 
        this.age = age; } } 

输出结果:

名字:null 年龄:3 
public Cat(String name, int age) { 
        this.name = name; //报错 this.age = age } 

显然这样做是会报错的,因为name已经被父类封装成private的了,不能直接访问,可能有的人会这样做:

public Cat(String name, int age) { 
        setName(name); // 因为父类的setName()方法是public的 this.age = age; } 

显然这样做的确可以做到给父类的name赋值,但这样做是不建议的,我们在构造方法中通常只调用构造方法,不会去调用实例方法,况且当不止一个变量时,用set方法时,我们就要调用好多个实例方法去完成多个变量的赋值。这时候为什么不考虑使用super()方法呢?如下:

public Cat(String name, int age) { 
        super(name); this.age = age; } 

这样就显得文雅,美观多了。


2、this指向当前对象自己,super指向当前对象的父类型特征,故this的东西比super多,也就是super是this的一部分;

3、this()和super()都只能出现在构造方法的第一行,故this()和super()方法不能共存,当一个类的构造方法第一行中没有this(),也没有super(),系统默认有super()方法;

4、this()是构造方法中调用本类其他的构造方法,super()是当前对象构造方法中去调用自己父类的构造方法。


不知道你现在对 this和super 有没有一个新的认识?嘿嘿。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233406.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 社会治理大数据平台怎么建_平度市社会治理大数据平台建设有序推进

    社会治理大数据平台怎么建_平度市社会治理大数据平台建设有序推进6月1日,市委常委、政法委书记陈勇调度了全市社会治理大数据平台建设进展情况。陈勇首先实地查看了市级社会治理指挥中心建设情况,详细询问了施工人员工程进展、需要协调解决的问题和困难。下午,陈勇听取了青岛城市大数据运营有限公司关于社会治理大数据平台建设推进情况汇报,指出要按照“全省最优、全国一流”的目标,加快智慧城市创新软件版块的开发和基础数据的导入,同步做好信息安全保障工作,强化实战应用,确保7月1日…

    2022年6月1日
    39
  • 行为识别综述

    行为识别综述定义背景难点最新论文最新算法数据集1定义行为识别:行为识别(ActionRecognition)任务是从视频剪辑(2D帧序列)中识别不同的动作,其中动作可以在视频的整个持续时间内执行或不执行。行为识别似乎是图像分类任务到多个帧的扩展,然后聚合来自每帧的预测。尽管图像分类取得了很大的成功,但是视频分类和表示学习依然进展缓慢。2背景2.1方法2.1.1传统方法提取视频区域的局部高维视觉特征,然后组合成固定大小的视频级描述,最后利用分类器(SVM,RF等)进行最终预测2.

    2022年6月21日
    27
  • AAA认证详解

    AAA认证详解802.1x(基于端口的认证)802.1x的主要功能:对接入的用户做认证,防止未授权的用户访问网络802.1x起源于无线当用户插上网线时,交换机会提示用户执行802.1x认证(输入用户名和密码),当开启802.1X认证的交换机,在端口检测到有网卡接入的时候,交换机会想接入该端口的主机发送EAPOL数据帧,要求进行认证在交换机认证成功之前(802.1x)只允许三种流量通过:…

    2022年5月2日
    91
  • 第一章《初识数据库》

    第一章《初识数据库》

    2021年5月28日
    94
  • 懒加载(Lazy Loading) – MyBatis懒加载 – Spring懒加载

    懒加载(Lazy Loading) – MyBatis懒加载 – Spring懒加载文章目录懒加载(LazyLoading)MyBatis中懒加载的使用Spring中懒加载的使用懒加载(LazyLoading)  懒加载也叫“延迟价值”,核心思想是把对象的实例化延迟到真正调用该对象的时候,这样做的好处是可以减轻大量对象在实例化时对资源的消耗,而不是在程序初始化的时候就预先将对象实例化。另外“懒加载”可以将对象的实例化代码从初始化方法中独立出来,从而提高代码的可读性,以便于代码能够更好地组织。  特别是在web应用程序中,它能够在用户滚动页面的时候自动获取更多的数据,而新得到的数据

    2025年6月7日
    0
  • python究竟要不要使用多线程

    (1)python多线程究竟有没有用?(2)python虚拟机机制如何控制代码的执行?(3)python中多进程处理原理是怎么样的?1.先来看两个例子(1)例1分别用单线程、使用多线程、使

    2021年12月29日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号