百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Java中super关键字怎样使用? java super关键字的使用

yuyutoo 2024-10-12 00:55 10 浏览 0 评论

当子类重写父类的方法后,子类对象将无法直接访问父类被重写的方法。为了解决这个问题,在Java中专门提供了一个super关键字来访问父类的成员,例如访问父类的成员变量、成员方法和构造方法。下面分两种情况来学习一下super关键字的具体用法。

(1)使用super关键字调用父类的成员变量和成员方法,具体格式如下:

super.成员变量
super.成员方法([参数1,参数2...])

接下来通过一个案例来学习如何使用super关键字调用父类的成员变量和成员方法,如文件1所示。

文件1 Example03.java

     // 定义Animal类
     class Animal {
         String name = "动物";
          // 定义动物叫的方法
         void shout() { 
             System.out.println("动物发出叫声");
         }
     }
     // 定义Dog类继承动物类
     class Dog extends Animal {
         String name = "犬类";
          // 重写父类的shout()方法
          void shout() {
             super.shout();    // 访问父类的成员方法
         }
          // 定义打印name的方法
         void printName() {
             System.out.println("name=" + super.name);// 访问父类的成员变量
         }
     }
     // 定义测试类 
     public class Example03{
         public static void main(String[] args) {
             Dog dog = new Dog();  // 创建一个dog对象
             dog.shout();           // 调用dog对象重写的shout()方法
             dog.printName();      // 调用dog对象的的printName()方法
         }
     }

运行结果如图1所示。

图1 运行结果

文件1中,定义了一个Dog类继承Animal类,重写了Animal类的shout()方法并重新定义了子类的name属性。在子类Dog的shout()方法中使用“super.shout()”调用了父类被重写的方法,在printName()方法中使用“super.name”访问父类的成员变量。从运行结果可以看出,子类通过super关键字成功地访问了父类成员变量和成员方法。

(2)使用super关键字调用父类的构造方法,具体格式如下:

super([参数1,参数2...])

接下来就通过一个案例来学习,如何使用super关键字来调用父类的构造方法,如文件2所示。

文件2 Example04.java

     // 定义Animal类
     class Animal {
         // 定义Animal类有参的构造方法
         public Animal(String name) { 
             System.out.println("我是一只" + name);
         }
     }
     // 定义Dog类继承Animal类
     class Dog extends Animal {
         public Dog() {
             super("沙皮狗");          // 调用父类有参的构造方法
         }
     }
     // 定义测试类
     public class Example04 {
         public static void main(String[] args) {
             Dog dog = new Dog();   // 创建Dog类的实例对象
         }
     }

运行结果如图2所示。

图2 运行结果

根据前面所学的知识,文件1中在创建Dog类对象时一定会调用Dog类的构造方法,从运行结果可以看出,Dog类的构造方法被调用时,执行了内部的super("沙皮狗")方法,从而调用了父类的有参构造方法。需要注意的是,通过super调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次,否则程序在编译期间就会报错。

将文件1第11行代码进行注释,程序就会出现编译错误,如图3所示。

图3 运行结果

从图3可以看出,程序编译出现错误,显示“Implicit super constructor Animal() is undefined. Must explicitly invoke another constructor(未定义隐式无参构造方法,必须显示的调用另一个构造方法)”的错误。出错的原因是,在子类的构造方法中一定会调用父类的某个构造方法。这时可以在子类的构造方法中通过super关键字指定调用父类的哪个构造方法,如果没有指定,在实例化子类对象时,会默认调用父类无参的构造方法,而在文件2中,父类Animal中只定义了有参构造方法,未定义无参构造方法,所以在子类默认调用父类无参构造方法时就会出错。

为了解决上述程序的编译错误,可以在子类中显示地调用父类中已有的构造方法,或者在父类中定义无参的构造方法。现将文件2中的Animal类进行修改,在父类中添加无参构造方法来解决上述编译错误,如文件3所示。

文件3 Example05.java

     // 定义Animal类
    class Animal {
          // 定义Animal无参的构造方法
         public Animal() {
             System.out.println("我是一只动物");
         }
          // 定义Animal有参的构造方法
         public Animal(String name) {
             System.out.println("我是一只" + name);
         }
     }
     // 定义Dog类,继承自Animal类
     class Dog extends Animal {
          // 定义Dog类无参的构造方法
         public Dog() {
         }
     }
     // 定义测试类
     public class Example05 {
         public static void main(String[] args) {
             Dog dog = new Dog(); // 创建Dog类的实例对象
         }
     }

运行结果如图4所示。

图4 运行结果

从图4可以看出,子类在实例化时默认调用了父类无参的构造方法。通过这个案例还可以得出一个结论:在定义一个类时,如果没有特殊需求,当定义了有参构造方法后,尽量在类中再显示地定义一个无参构造方法,这样可以避免该类被继承时出现错误。

相关推荐

当 Linux 根分区 (/) 已满时如何释放空间?

根分区(/)是Linux文件系统的核心,包含操作系统核心文件、配置文件、日志文件、缓存和用户数据等。当根分区满载时,系统可能出现无法写入新文件、应用程序崩溃甚至无法启动的情况。常见原因包括:...

玩转 Linux 之:磁盘分区、挂载知多少?

今天来聊聊linux下磁盘分区、挂载的问题,篇幅所限,不会聊的太底层,纯当科普!!1、Linux分区简介1.1主分区vs扩展分区硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两...

Linux 文件搜索神器 find 实战详解,建议收藏

在Linux系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过200M文件,查看近7天系统中哪些文件被修改过,找出所有子目录中的可执行文件,这些任务需求...

Linux 操作系统磁盘操作(linux 磁盘命令)

一、文档介绍本文档描述Linux操作系统下多种场景下的磁盘操作情况。二、名词解释...

Win10新版19603推送:一键清理磁盘空间、首次集成Linux文件管理器

继上周四的Build19592后,微软今晨面向快速通道的Insider会员推送Windows10新预览版,操作系统版本号Build19603。除了一些常规修复,本次更新还带了不少新功能,一起来了...

Android 16允许Linux终端使用手机全部存储空间

IT之家4月20日消息,谷歌Pixel手机正朝着成为强大便携式计算设备的目标迈进。2025年3月的更新中,Linux终端应用的推出为这一转变奠定了重要基础。该应用允许兼容的安卓设备...

Linux 系统管理大容量磁盘(2TB+)操作指南

对于容量超过2TB的磁盘,传统MBR分区表的32位寻址机制存在限制(最大支持2.2TB)。需采用GPT(GUIDPartitionTable)分区方案,其支持64位寻址,理论上限为9.4ZB(9....

Linux 服务器上查看磁盘类型的方法

方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。...

ESXI7虚机上的Ubuntu Linux 22.04 LVM空间扩容操作记录

本人在实际的使用中经常遇到Vmware上安装的Linux虚机的LVM扩容情况,最终实现lv的扩容,大多数情况因为虚机都是有备用或者可停机的情况,一般情况下通过添加一块物理盘再加入vg,然后扩容lv来实...

5.4K Star很容易!Windows读取Linux磁盘格式工具

[开源日记],分享10k+Star的优质开源项目...

Linux 文件系统监控:用脚本自动化磁盘空间管理

在Linux系统中,文件系统监控是一项非常重要的任务,它可以帮助我们及时发现磁盘空间不足的问题,避免因磁盘满而导致的系统服务不可用。通过编写脚本自动化磁盘空间管理,我们可以更加高效地处理这一问题。下面...

Linux磁盘管理LVM实战(linux实验磁盘管理)

LVM(逻辑卷管理器,LogicalVolumeManager)是一种在Linux系统中用于灵活管理磁盘空间的技术,通过将物理磁盘抽象为逻辑卷,实现动态调整存储容量、跨磁盘扩展等功能。本章节...

Linux查看文件大小:`ls`和`du`为何结果不同?一文讲透原理!

Linux查看文件大小:ls和du为何结果不同?一文讲透原理!在Linux运维中,查看文件大小是日常高频操作。但你是否遇到过以下困惑?...

使用 df 命令检查服务器磁盘满了,但用 du 命令发现实际小于磁盘容量

在Linux系统中,管理员或开发者经常会遇到一个令人困惑的问题:使用...

Linux磁盘爆满紧急救援指南:5步清理释放50GB+小白也能轻松搞定

“服务器卡死?网站崩溃?当Linux系统弹出‘Nospaceleft’的红色警报,别慌!本文手把手教你从‘删库到跑路’进阶为‘磁盘清理大师’,5个关键步骤+30条救命命令,快速释放磁盘空间,拯救你...

取消回复欢迎 发表评论: