【Java基础-29】深入理解Java中的super关键字:用法、场景与最佳实践

在Java编程中,super关键字是一个非常重要的概念,尤其在继承和多态的上下文中。它用于访问父类的成员(属性、方法或构造函数),帮助开发者在子类中更好地管理和扩展父类的功能。本文将深入探讨super关键字的用法、适用场景以及最佳实践,帮助你全面掌握这一核心概念。


1. super关键字的基本概念

super是Java中的一个保留关键字,用于在子类中引用父类的成员。它的主要作用包括:

  • 调用父类的构造函数。
  • 访问父类的属性或方法。

super关键字的使用场景通常与继承相关,当子类需要扩展或修改父类的行为时,super提供了一种直接访问父类成员的途径。

在这里插入图片描述


2. super关键字的用法

2.1 调用父类的构造函数

在子类的构造函数中,可以使用super()调用父类的构造函数。需要注意的是:

  • super()必须是子类构造函数中的第一条语句。
  • 如果父类没有默认构造函数(无参构造函数),必须在子类构造函数中显式调用父类的有参构造函数。

在这里插入图片描述

在这里插入图片描述

示例:

class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    String breed;

    Dog(String name, String breed) {
        super(name); // 调用父类的构造函数
        this.breed = breed;
    }
}

2.2 访问父类的属性

当子类和父类有同名的属性时,可以使用super关键字访问父类的属性。

在这里插入图片描述

示例:

class Animal {
    String name = "Animal";
}

class Dog extends Animal {
    String name = "Dog";

    void printNames() {
        System.out.println("Parent name: " + super.name); // 访问父类的属性
        System.out.println("Child name: " + this.name);   // 访问子类的属性
    }
}

2.3 调用父类的方法

当子类重写了父类的方法时,可以使用super关键字调用父类的原始方法。

在这里插入图片描述

示例:

class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        super.makeSound(); // 调用父类的方法
        System.out.println("Dog barks");
    }
}

3. super关键字的适用场景

3.1 扩展父类的功能

当子类需要在父类功能的基础上添加新功能时,可以使用super调用父类的方法,然后添加额外的逻辑。

示例:

class Vehicle {
    void start() {
        System.out.println("Vehicle started");
    }
}

class Car extends Vehicle {
    @Override
    void start() {
        super.start(); // 调用父类的方法
        System.out.println("Car engine running");
    }
}

3.2 解决命名冲突

当子类和父类有同名的属性或方法时,使用super可以明确指定访问父类的成员,避免歧义。

示例:

class Parent {
    int value = 10;
}

class Child extends Parent {
    int value = 20;

    void printValues() {
        System.out.println("Parent value: " + super.value); // 访问父类的属性
        System.out.println("Child value: " + this.value);   // 访问子类的属性
    }
}

3.3 初始化父类状态

在子类的构造函数中,使用super调用父类的构造函数,确保父类的状态被正确初始化。

在这里插入图片描述
在这里插入图片描述

示例:

class Person {
    String name;

    Person(String name) {
        this.name = name;
    }
}

class Employee extends Person {
    int id;

    Employee(String name, int id) {
        super(name); // 调用父类的构造函数
        this.id = id;
    }
}

4. super关键字的最佳实践

  1. 明确使用场景
    仅在需要访问父类成员时使用super,避免滥用。
  2. 构造函数调用
    确保在子类构造函数中正确调用父类的构造函数,尤其是父类没有默认构造函数时。
  3. 避免过度重写
    在重写父类方法时,尽量保留父类的核心逻辑,使用super调用父类方法,然后添加额外功能。
  4. 命名规范
    尽量避免子类和父类的属性或方法同名,以减少使用super的必要性。
  5. 理解继承链
    在使用super时,明确父类的继承链,确保调用的成员来自正确的父类。

5. superthis的区别

在这里插入图片描述

特性superthis
作用对象父类的成员当前类的成员
构造函数调用调用父类的构造函数调用当前类的构造函数
属性/方法访问访问父类的属性或方法访问当前类的属性或方法
使用场景继承、重写、初始化父类状态当前类的成员访问、构造函数重载

6. 总结

super关键字是Java继承机制中的重要工具,它使得子类能够访问和扩展父类的功能。通过合理使用super,开发者可以更好地管理类的继承关系,避免命名冲突,并确保父类的状态被正确初始化。然而,super的使用也需要遵循一定的规范和最佳实践,以确保代码的可读性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944769.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux-软硬链接

我们今天再来聊一下这个"软硬链接"的问题. 目录 1. 软硬链接长什么样?2. 软连接和硬链接的特征 和 应用2.1 软连接特征 及其 应用?①软连接是什么?②软连接的应用1: 快捷方式③软连接的应用2: 方便维护库文件 2.2 硬连接特征 及其 应用?①硬链接是什么?②引用计…

学习threejs,THREE.CircleGeometry 二维平面圆形几何体

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.CircleGeometry 圆形…

ISO/IEC 25012:2008 系统和软件的质量模型(数据质量模型)

本文是对GBT 25000.12-2017《软件产品系统与软件质量要求与评价(SQuaRE)第12部分:数据质量模型》一文的转载,此外还参考了ISO/IEC 25012:2008(en) Software engineering — Software product Quality Requirements and Evaluation…

鸿蒙开发工程师成长的五个阶段

在科技日新月异的今天,鸿蒙(HarmonyOS)作为华为自主研发的操作系统,正以其独特的魅力和广阔的应用前景吸引着越来越多的开发者加入。鸿蒙不仅承载着华为对未来智能设备互联互通的愿景,也为开发者提供了一个充满挑战与机…

torch.nn.LSTM介绍

torch.nn.LSTM 是 PyTorch 提供的一个高级封装,用于构建长短时记忆网络(LSTM)。相比手动实现,torch.nn.LSTM 更高效且支持批量处理、双向 LSTM、多层 LSTM 等功能,适合大多数实际应用。 LSTM基本原理 门控机制(Gating Mechanism)是深度学习中常见的一种设计,用于控制信…

termux-boot安卓开机自动启动应用

termux安装 github 蓝奏云 v119.1 termux-boot安装 github 蓝奏云 v0.8.1 安装 给权限运行加锁后台 am启动应用命令 am start -n 包名/启动项获取包名和启动入口(图中app为爱玩机工具箱) 例 简黑时钟蓝奏云 包名com.hm.jhclock 桌面启动项com.hm.jh…

【畅购商城】购物车模块之查看购物车

目录 分析 接口 后端实现 前端实现:显示页面 前端实现:显示购物车信息 分析 用户如果没有登录,购物车存放在浏览器端的localStorage处,且以数组的方式进行存储。用户如果登录了,购物车存放在redis中&#xff0c…

Kimi进行学术方向选择精讲!

目录 1.文献搜索 2.辅助选题 3.选题判断 在我们之前的文章中,小编都强调了选题在文章价值中的核心作用。一篇优秀的文章背后,肯定有一个精心挑选的选题。选题的好坏直接影响着文章能够发表的期刊等级。许多宝子们却采取了相反的做法,将大量…

记一次内存泄漏分析(待写稿)

背景 线上Flink频繁重启,先后排查了很多情况,目前在内存阶段排查,首先说说学到的知识 内存泄漏分析 JVM常用命令 JConsole JVisualvm 快照的这里是最有用的,它和jmap不同,jmap查找的是占用字节最多的类&#xff…

【PPTist】网格线、对齐线、标尺

前言:本篇文章介绍辅助我们摆放元素位置的几个功能 一、网格线功能 网格线主要是用来辅助我们对齐元素的,右键可以选择使用哪种网格线,以及关闭和打开 显示效果就是图中的这种效果。但是强迫症有点难受,它底部没对齐啊啊啊 不…

探究步进电机与输入脉冲的关系

深入了解步进电机 前言一、 步进电机原理二、 细分三、脉冲数总结 前言 主要是探究以下内容: 1、步进电机的步进角。 2、什么是细分。 3、脉冲的计算。 最后再扩展以下STM32定时器的计算方法。 一、 步进电机原理 其实语言描述怎么样都不直观,我更建议…

E-commerce .net+React(一)——项目初始化

文章目录 项目地址一、创建.Net环境1.1环境配置1.1.1 使用vscode创建webapi1.1.2 Clean architecture结构创建1.1.3 将创建好结构的项目添加到git里1.1.4 EF Core配置1. 在infrastructure里安装EF所需环境2. 创建Product数据模型3. 创建EF Core的DbContext 数据库上下文4. 创建…

Spring Bean 管理学习

Spring 框架的核心之一是 IOC(控制反转)容器,Bean 的管理是其中的重要功能。本文将从 Bean 的获取、作用域和第三方 Bean 的管理三个方面进行学习和总结。 1. 获取 Bean 在 Spring 项目启动时,IoC 容器会将所有的 Bean 创建好并托…

Excel for Finance 07 `FV PV` 函数

Excel 的 FV 函数用于计算一笔投资在未来的价值,基于固定的利率和定期付款。这是一个金融函数,常用来分析储蓄计划、贷款、或投资的增长。 语法: FV(rate, nper, pmt, [pv], [type])参数说明: rate(必需)&…

Lecture 18

Floating Point Numbers 1. 整数的局限性: • 在计算机中,并非所有数字都能用整数形式表示。例如: • 非整数(如小数):345.0256。 • 超出整数表示范围的数: 5.375 \times 10^{25} 。 2. 浮…

【LC】19. 删除链表的倒数第 N 个结点

题目描述: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出&#xff…

EasyExcel(读取操作和填充操作)

文章目录 1.准备Read.xlsx(具有两个sheet)2.读取第一个sheet中的数据1.模板2.方法3.结果 3.读取所有sheet中的数据1.模板2.方法3.结果 EasyExcel填充1.简单填充1.准备 Fill01.xlsx2.无模版3.方法4.结果 2.列表填充1.准备 Fill02.xlsx2.模板3.方法4.结果 …

五.Springboot通过AOP实现API接口的签名验证

文章目录 前言一、实现原理二、签名规则三、服务端实现4.1、创建自定义注解4.2、创建切面处理类4.3、对应工具类RequestUtil 四、测试4.1 签名失败测试:4.2 签名成功测试: 四、总结 前言 对外开放的接口,需要验证请求方发送过来的数据确实是…

记录jvm进程号

日常开发中,相信大家会经常用到这么一行命令: ps -ef | grep xxx.jar | grep -v grep | awk {print $2} | xargs -r kill -9 就是杀掉xxx相关的进程,然后启动,当然也还有其他的方式可以实现类似的功能,我就不列举了&…

STM32完全学习——使用定时器1精确延时

一、定时器的相关配置 首先一定要是递减定时器,递增的不太行,控制的不够准确,其次在大于10微秒的延时是非常准确的,小于的话,就没有那没准,但是凑合能用。误差都在一个微秒以内。使用高级定时器也就是时钟…