当前位置: 首页 > news >正文

Java中的this与super关键字深度解析

一、this关键字

this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用

(1)this.属性名

this修饰的变量用于指代成员变量

方法的形参如果与成员变量同名,不带this修饰的变量指的是形参

方法的形参如果与成员变量不同名,不带this修饰的变量指的是成员变量

在 Teacher 类的构造方法中使用了 this 关键字对属性 name和salary 赋值,this 表示当前对象this.name=name语句 表示一个赋值语句:

  • 等号左边的 this.name 是指当前对象具有的变量 name

  • 等号右边的 name 表示参数传递过来的数值

如果方法里有个局部变量成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀。例如:上述的name、salary是函数的参数就要加上this才可以表示当前类的成员变量,而age不是参数,所以直接使用age就能代表成员变量!

当一个类的属性(成员变量)名与访问该属性的方法参数名相同时,则需要使用 this 关键字来访问类中的属性,以区分类的属性和方法中的参数。

(2)this.方法名()

最大的作用就是:类中一个方法,访问该类里的另一个方法或实例变量

假设定义了一个 Student 类,这个 Student 对象的 study( ) 方法需要调用它的 readWork( ) 方法和 writeWork() 方法,Student 类的代码如下所示:

@Data
public class Student {private String name;public Student(String name) {this.name = name;}public void readWork() {System.out.println(this.name + "正在执行readWork方法");}public void writeWork() {System.out.println(this.name + "正在执行writeWork方法");}public void study() {// 方法一Student s = new Student("Tom");s.readWork();s.writeWork();// 方法二this.readWork();this.writeWork();System.out.println(this.name + "正在执行study()方法");}
}

测试类:

public class demo {public static void main(String[] args) {Student s = new Student("harmony");s.study();}
}

运行结果:

在 study()方法中调用 readWork()、writeWork() 方法时是否一定需要一个 Student 对象?

答案是肯定的,因为没有使用 static 修饰的成员变量和方法都必须使用对象来调用

是否一定需要重新创建一个 Student 对象?

不一定,因为当程序调用 study() 方法时,一定会提供一个 Student 对象,这样就可以直接使用这个已经存在的 Student 对象,而无须重新创建新的 Student 对象了。因此需要在 study() 方法中获得调用该方法的对象,通过 this 关键字就可以满足这个要求

总的来说:this 可以代表任何对象,当 this 出现在某个方法体中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的只能是当前类的实例。只有当这个方法被调用时,它所代表的对象才被确定下来,谁在调用这个方法,this 就代表谁!!!

例如,我们的study() 可以这么写:

public void study() {this.readWork();this.writeWork();System.out.println(this.name + "正在执行study()方法");
}

但是通常来说,在Java中,一个方法访问该类中定义的其他方法、成员变量时加不加 this 前缀的效果是完全一样的!

也就是说,我们完全可以这样写:

public void study() {readWork();writeWork();System.out.println(this.name + "正在执行study()方法");
}

注意事项

对于 static 修饰的方法而言,可以使用类来直接调用该方法,如果在 static 修饰的方法中使用 this 关键字,则这个关键字就无法指向合适的对象。所以,static 修饰的方法中不能使用 this 引用。并且 Java 语法规定,静态成员不能直接访问非静态成员

省略 this 前缀只是一种假象,虽然程序员省略了调用 readWork() 方法之前的 this,但实际上这个 this 依然是存在的!!!

(3)this( )访问构造方法

this( ) 用来访问本类的构造方法;括号中可以有参数,如果有参数就是调用指定的有参构造方法。

public class Student {private String name;private Integer age;// 无参构造方法(没有参数的构造方法)public Student() {this("harmony", 18);}// 有参构造方法public Student(String name, int age) {this.name = name;this.age = age;}public void print() {System.out.println("姓名:" + name);System.out.println("年龄:" + age);}public static void main(String[] args) {Student stu1 = new Student();stu1.print();System.out.println("============");Student stu2 = new Student("magic",20);stu2.print();}
}

运行结果:

注意事项

  • this( ) 不能在普通方法中使用,只能写在构造方法中。

  • 在构造方法中使用时,必须是第一条语句

二、super关键字

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

功能

  • 在子类的构造方法中显式的调用父类构造方法

  • 访问父类的成员方法变量

(1)super调用父类构造方法

super 关键字可以在子类的构造方法中显式地调用父类的构造方法!

super( ) 必须是在子类构造方法的方法体的第一行

例子一

我们先定义一个父类Father

public class Father {public Father(String name) {}
}

再定义一个子类Son

public class Son extends Father {}

但是,这样子写是有问题的!这是因为, JVM 默认给 Son 类加了一个无参构造方法,而在这个方法中默认调用了 super(),但是 Father 类中并不存在该构造方法,所以编译器会报红!

如果一个类中没有写任何的构造方法,JVM 会生成一个默认的无参构造方法。
但是,如果有有参的构造方法,JVM 就不会生成无参构造方法了,需要自己定义。

父类只有一个有参构造函数,而没有无参构造函数,则子类的构造函数必须显式地调用父类的有参构造函数,否则编译器会报错!

子类Son必须要这样:

public class Son extends Father {public Son(String name) {super(name);}
}

super 可以用来直接调用父类中的构造方法,使编写代码也更加简洁方便。

例子二

// 父类
public class Father {public Father() {System.out.println("无参构造函数!");}
}// 子类
public class Son extends Father {private String name;public Son(String name) {this.name = name;}public static void main(String[] args) {Son s = new Son("Harmony");}
}

运行结果:

我们在main函数中什么也没有输出,但是在控制台上看到了打印。说明编译器会自动在子类构造方法的第一句加上super(),来调用父类无参构造方法,必须写在子类构造方法的第一句,也可以省略不写。

(2)super调用父类构造方法

未完待续...

三、super和this的区别

this 指的是当前对象的引用,super 是当前对象的父对象的引用。

this的用法小结

  • this.属性名:表示当前对象的属性

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

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

super的用法小结

  • super.父类属性名:调用父类中的属性

  • super.父类方法名:调用父类中的方法

  • super():调用父类的无参构造方法

  • super(参数):调用父类的有参构造方法

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

相关文章:

Java中的this与super关键字深度解析

一、this关键字this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。(1)this.属性名this修饰的变量用于指代成员变量方法的形参如果…...

CSS3新增的视口单位Vh、Vw单位

定义vw:浏览器可见视口【宽度】的百分比(1vw代表视窗【宽度】的1%)vh:浏览器可见视口【高度】的百分比(1vw代表视窗【高度】的1%)vmin:当前 vw 和 vh 较小的一个值。vmax:当前 vw 和…...

【Linux】yum安装docker指定版本

🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录卸载已有的docker部署指定版本docker安…...

SpringBoot相关操作

01-今日内容 Spring概述、快速入门SpringBoot配置SpringBoot整合 02-SpringBoot概述 SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的…...

Python super()函数:调用父类的构造方法

Python 中子类会继承父类所有的类属性和类方法。严格来说,类的构造方法其实就是实例方法,因此毫无疑问,父类的构造方法,子类同样会继承。 但我们知道,Python 是一门支持多继承的面向对象编程语言,如果子类…...

@ConfigurationProperties在方法上的使用

文章目录1. 前言2. 先说结论3. 代码解释1. Component ConfigurationProperties2. EnableConfigurationProperties ConfigurationProperties3. Bean ConfigurationProperties1. 前言 在学习spring的时候,ConfigurationProperties应该经常被使用到,作用…...

【QT】如何查找和获取界面上的子部件(findChild 和 findChidren)

目录1. findChild()函数2. findChildren()函数3. 示例1. findChild()函数 函数原型: T QObject::findChild(const QString &name QString(), Qt::FindChildOptions options Qt::FindChildrenRecursively) const返回该对象的子对象,该子对象可以转…...

MIT 6.S081学习笔记

计划花25天时间学完6.S081课程,从2月20日-3月20日。课程主页Link   xv6 book   GDB User Manual Lecture 1: Introduction and Examples课程主题:设计和实现操作系统   OS的三大功能:多路复用、隔离和交互。 Lab: Xv6 and Unix utiliti…...

《网络安全入门到精通》 - 2.1 - Windows基础 - DOS命令Windows防火墙Windows共享文件

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「订阅专栏」:此文章已录入专栏《网络安全入门到精通》 Windows基础一、DOS命令1、目录文件操作dir 列出目录文件cd 切换目录md 创建目录rd 删除目录move 移动文件或目…...

八、Vben框架动态生成可编辑Table

开发过程中产品经理提出了一些奇怪的需求,让人很摸不着头脑,一问就是客户的需求就是这样,那么我们开发只能想各种办法啦。 最近就提出了两个需求, 第一个是需要在日期选择的时候根据时间选择的不同让底下table中增加两个时间中间的…...

浅谈ERP数据的重要性

影响一个ERP项目的因素有很多,数据无疑是其中很重要的一项,正所谓“正确的诊断源于准确的信息,准确的信息基于可靠的采集”,当我们抓住数据这个根基,大处着眼,小处着手的时候,我们距离ERP成功的日子就不会太…...

【RabbitMQ笔记06】消息队列RabbitMQ七种模式之Topics主题模式

这篇文章,主要介绍消息队列RabbitMQ七种模式之Topics主题模式。 目录 一、消息队列 1.1、主题模式(Topics) 1.2、案例代码 (1)引入依赖 (2)编写生产者 (3)编写消费…...

ChatGPT似乎有的时候并不能搞懂Java的动态分派,你懂了吗?

目录 碎碎念 ChatGPT 中出现的问题 那么正确答案应该是什么呢? 分派的相关知识点总结: 分派是什么? 静态分派与动态分派: Java语言是静态多分派,动态单分派的; 静态分派:静态重载多分派…...

【C++初阶】vector的模拟实现

大家好我是沐曦希💕 文章目录一、前言二、无参构造&析构三、基础接口1.empty和clear2.size和capacity3.[]和iterator四、reserve和resize五、尾插尾删六、其他构造1.迭代器区间构造2.拷贝构造七、memcpy问题八、完整代码一、前言 在模拟实现容器时候&#xff0…...

微信小程序、小游戏的流量主一般可以赚多少钱?

本篇文章主要科普小程序、小游戏流量主一般赚钱的实际情况,通过在下长期运营的经验汇总而成。 日期:2023年2月26日 作者:任聪聪 小程序、小程序满1000用户后即可开通流量主,但实际上很多人并没有传说中的那种日赚几千的流量收入的…...

jni-Demo-基于linux(c++ java)

跑一个jni 的最简单的Demo需要提前准备 VsCode 编译器、win10下,vscode中集成linux操作系统、c编译器(gcc、g),java编译器(jdk1.8)参考:https://mangocool.com/1653030123842.htmlJniDemo类&…...

指针的进阶——(1)

本次讲解重点: 1、字符指针 2、数组指针 3、指针数组 4、数组传参和指针传参 5、函数指针 关于指针这个知识点的主题,我们在前面已经初级阶段已经对指针有了大致的理解和应用了。我们知道了指针的概念: 1、指针就是地址,但口…...

电商平台的促销活动如何抵御大流量的ddos攻击

每一次活动大促带来的迅猛流量,对技术人而言都是一次严峻考验。如果在活动期间遭受黑产恶意 DDoS 攻击,无疑是雪上加霜。电商的特性是业务常态下通常不会遭受大流量 DDoS 攻击,且对延迟敏感,因此只需要在活动期间按需使用 DDoS 防…...

代码随想录-48-104. 二叉树的最大深度

目录前言题目1.层序迭代思路2. 本题思路分析:3. 算法实现4. pop函数的算法复杂度5. 算法坑点前言 在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 …...

【Vue3源码】第六章 computed的实现

【Vue3源码】第六章 computed的实现 上一章节我们实现了 ref 及其它配套的isRef、unRef 和 proxyRefs API。这一章开始实现computed计算属性。 认识computed 接受一个 getter 函数,返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...