热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大聪明教你学Java|深入浅出聊super关键字

大聪明教你学Java|深入浅出聊super关键字-前言今天没有前言,都是干货硬货,这一篇文章肯定让你明白super的用法!废话不多说,咱们直接进入正题。super()的使用子
前言

今天没有前言,都是干货硬货,这一篇文章肯定让你明白 super 的用法!废话不多说,咱们直接进入正题。

super()的使用

子类重写父类方法

/**
 * 父类
 * @description: father
 * @author: 庄霸.liziye
 * @create: 2021-12-06 15:05
 **/
public class father {

    private String fatherName = "小头爸爸";

    public void getName() {
        System.out.println("我是" + fatherName);
    }
}
/**
 * 子类
 * @description: son
 * @author: 庄霸.liziye
 * @create: 2021-12-06 15:07
 **/
public class son extends father{

    private String sOnName= "大头儿子";

    @Override
    public void getName() {
        System.out.println("我是" + sonName);
        super.getName();
    }

    public static void main(String[] args) {
        father b = new father();
        b.getName();
    }
}

咱们运行一下代码,结果如?

在子类中重写了父类的 getName() 方法,如果在重写的 getName() 方法中去调用父类的相同方法,就必须要通过 super 关键字去指明。

肯定会有一些小伙伴“另辟蹊径”,就不用 super 去指明,那么按照子类优先的原则,相当于还是在调用子类中的 getName() 方法,也就形成了死循环。咱们看看不用 super 关键字去指明会有什么情况发生~ ?

子类重写父类变量

/**
 * 父类
 * @description: father
 * @author: 庄霸.liziye
 * @create: 2021-12-06 15:05
 **/
public class father {

    String name = "小头爸爸";

}
/**
 * 子类
 * @description: son
 * @author: 庄霸.liziye
 * @create: 2021-12-06 15:07
 **/
public class son extends father{

    String name = "大头儿子";

    public void getName() {
        System.out.println("我是" + name);
        System.out.println("我是" + super.name);
    }

    public static void main(String[] args) {
        son s = new son();
        s.getName();
    }
}

咱们运行一下代码,结果如?

此时子类中有一个和父类一样的字段 name(也可以说成父类字段被隐藏了),为了获得父类的这个字段我们就必须加上super,如果还想玩花里胡哨的不加 super ,这时候肯定不会报错,因为此时都是访问的子类里面的字段,但是也就没什么意义了。

有些眼尖的小伙伴发现我们去掉了 private ,因为我们通过 super 关键字是不能访问父类中被 private 修饰的变量和方法,被 private 修饰的变量和方法属于父类的内部成员,其他对象是不能访问其 private 成员的。

子类构造方法中使用super

编译器会自动在子类构造方法的第一句加上 super 来调用父类的无参构造方法,此时 super 可以省略不写,如果写上的话必须在子类构造方法的第一句;当然也可以通过 super 来调用父类其他的构造方法,只要相应的把参数传过去就好。

/**
 * 父类
 * @description: father
 * @author: 庄霸.liziye
 * @create: 2021-12-06 15:05
 **/
public class father {

    public father(String name) {
        System.out.println("这是father类带参构造方法,名字是:"+name);
    }

}
/**
 * 子类
 * @description: son
 * @author: 庄霸.liziye
 * @create: 2021-12-06 15:07
 **/
public class son extends father{

    public son(String name) {
        super(name);
    }

    public static void main(String[] args) {
        new son("大头儿子和小头爸爸");
    }
}

咱们运行一下代码,结果如?

在子类构造方法中使用 super 关键字时需要注意以下两点:

① 注意一

/**
 * 父类
 * @description: father
 * @author: 庄霸.liziye
 * @create: 2021-12-06 15:05
 **/
public class father {

    public father(String s) {

    }

}


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

② 注意二

/**
 * 父类
 * @description: father
 * @author: 庄霸.liziye
 * @create: 2021-12-06 15:05
 **/
public class father {

    public father(String s) {

    }

}


虽然我们在子类中自己定义了一个构造方法,但是在这个构造方法中还是默认调用了super(),但是父类中并不存在该构造方法,所以就出现编译错误了。

总结起来就是一句话:在子类的构造方法中,只要没有写明通过 super 去调用父类的某个构造方法,默认调用的都是无参构造方法,所以一定要确保父类中有相应的构造方法。

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨?‍

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●'◡'●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

爱你所爱 行你所行 听从你心 无问东西


推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
幸福抉择2502901973
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有