Java中this引用详解

文章目录

  • 一、 为什么要有this引用
  • 二、什么是this引用
  • 三、this引用的特性
  • 四、如何用好this关键字

一、 为什么要有this引用

我们先看一段代码

class Data {public int year;public int month;public int day;public void setDay(int y,int m,int d) {year = y;month = m;day = d;}public void printDay() {System.out.println(year + "/" + month + "/" +day);}
}
public class Test2 {public static void main(String[] args) {//构造三个日期的实例Data data1 = new Data();Data data2 = new Data();Data data3 = new Data();//对三个日期进行设置初始化data1.setDay(2004,8,12);data2.setDay(2004,8,19);data1.printDay();data2.printDay();}
}

如上代码,我们定义了一个Data类,然后实例化两个日期对象。随后我们设置日期(初始化)。我们有两个对象,但是只有一个共同的方法,编译器怎么知道是给那个对象赋值初始化呢?其实就是this这个关键词起到的作用。如下代码所示,其实方法中自带一个隐藏参数this(一般我们自己不写,我们知道就可以)。

public void setDay(Data this,int y,int m,int d) {year = y;month = m;day = d;}

有了这个this,编译器就知道调用各自对象的方法。
this引用的是调用成员方法的对象
还有一个原因,当大家形参名不小心和成员变量名相同时,那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了。如下代码。

    public void setDay1(int year,int month,int day) {year = year;month = month;day = day;}public static void main(String[] args) {Data data = new Data();data.setDay1(2023,10,21);data.printDay();}

在这里插入图片描述

我们会发现结果全是0。为什么呢?
因为在这个方法中,year,month,day其实都是形参变量,相当于形参自己在给自己赋值,并不是在给对象里面的变量赋值,因为局部变量优先,所以在这个方法中根本拿不到我们对象中的成员变量,也就无法满足我们的需求。
所以需要this关键字来划清他们之间的界限。

二、什么是this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
在这里插入图片描述
根据上图我们就会发现,this引用的其实就是调用成员方法的对象。

三、this引用的特性

  • this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型。
  • this只能在"成员方法"中使用。
  • 在"成员方法"中,this只能引用当前对象,不能再引用其他对象。
  • this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。(如下图所示)
  • 在这里插入图片描述

四、如何用好this关键字

就拿上面代码为例子,我们的需求和目的是,用形参变量来给对象中的成员变量赋值初始化。那么我们就要借助this关键字来区分他们。用this关键字课拿到对象中的成员变量。如下代码。

class Data {public int year;public int month;public int day;public void setDay1(int year,int month,int day) {this.year = year;this.month = month;this.day = day;}public void printDay() {System.out.println(year + "/" + month + "/" +day);}
}
public class Test2 {public static void main(String[] args) {Data data = new Data();data.setDay1(2023,10,21);data.printDay();}
}

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

这样运行就可以满足我们的需求。
总结:当形参变量和对象成员变量的名字相同时,需要借用this来区分
如何形参变量和对象成员变量的名字不同时,用不用this都没有问题,小编这里的建议是不管名字相同还是不同,都使用this。当然,在实际运用中,我们应该根据自己的需求来编写相对应的代码。

以上就是this关键字的详细介绍,相信这篇文章能给大家带来帮助。如果觉得博主写的不错的,可以留下你们的关注和点赞,和博主一起共同进步,一起努力。谢谢大家!也欢迎大家到评论下留言讨论。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《动手学深度学习(PyTorch版)》笔记4.7

Chapter4 Multilayer Perceptron 4.7 Forward/Backward Propagation and Computational Graphs 本节将通过一些基本的数学和计算图,深入探讨反向传播的细节。首先,我们将重点放在带权重衰减( L 2 L_2 L2​正则化)的单隐藏层多层…

【教学类-44-04】20240128汉字字帖的字体(一)——文艺空心黑体

背景需求: 【教学类-XX -XX 】20240128名字字卡1.0(15CM正方形手工纸、黑体,说明是某个孩子的第几个名字)-CSDN博客文章浏览阅读254次,点赞4次,收藏2次。【教学类-XX -XX 】20240128名字字卡1.0&#xff0…

12.Elasticsearch应用(十二)

Elasticsearch应用(十二) 1.单机ES面临的问题 海量数据存储问题单点故障问题 2.ES集群如何解决上面的问题 海量数据存储解决问题: 将索引库从逻辑上拆分为N个分片(Shard),存储到多个节点单点故障问题&a…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之CheckboxGroup组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之CheckboxGroup组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、CheckboxGroup组件 提供多选框组件,通常用于某选项的打开或关…

【python】GtkWindow程序

一、多个GtkWindow 在GTK中,并不推荐使用多个GtkWindow来创建多文档界面(MDI),而是推荐使用单个GtkWindow内嵌入的小部件(如GtkNotebook)来实现类似的效果。然而,如果确实想要创建多个窗口的例…

教育能打破阶层固化吗

中式教育以应试为核心,强调知识的灌输和学生被动接受。随着社会的发展,中式教育的短板逐渐显现,创新能力的缺乏、对记忆的过度依赖、忽视个体差异等问题日益突出。 建议所有大学生都能去看看《上海交通大学生存手册》,它道出了中…

日常学习之:vue + django + docker + heroku 对后端项目 / 前后端整体项目进行部署

文章目录 使用 docker 在 heroku 上单独部署 vue 前端使用 docker 在 heroku 上单独部署 django 后端创建 heroku 项目构建 Dockerfile设置 settings.pydatabase静态文件管理安全设置applicaiton & 中间件配置 设置 requirements.txtheroku container 部署应用 前后端分别部…

(自用)learnOpenGL学习总结-高级OpenGL-模板测试

模板测试 模板测试简单来说就是一个mask,根据你的mask来保留或者丢弃片段。 那么可以用来显示什么功能呢?剪切,镂空、透明度等操作。 和深度缓冲的关系是: 先片段着色器,然后进入深度测试,最后加入模板测…

2023年中国工控自动化市场现状及竞争分析,美日占主角,国产品牌初崭头角

工控自动化是一种运用控制理论、仪器仪表理论、计算机和信息技术,对工业生产过程实现检测、控制、优化、调度、管理和决策,达到增加产量、提高质量、降低消耗、确保安全等目的综合性技术。产品应用领域广泛,可分为OEM型行业和项目型行业。 近…

2024年最新 MySQL的下载、安装、启动与停止

一、MySQL的下载 MySQL最常用的2个版本: 社区版:免费开源,自由下载,不提供官方技术支持,大多数普通用户选择这个即可。企业版:需要付费,不能在线下载,可以使用30天,提供…

aio-max-nr达到上限导致数据库性能问题

问题说明: rac数据库节点一表面上看由于归档等待事件导致业务性能问题。 问题分析过程: 查看awr报告top事件,等待事件主要为归档切换问题: 查看事件,归档等待达到20多分钟 检查节点alert日志发现,最…

Linux第37步_解决“Boot interface 6 not supported”之问题

在使用USB OTG将“自己移植的固件”烧写到eMMC中时,串口会输出“Boot interface 6 not supported”,发现很多人踩坑,我也一样。 见下图: 解决办法: 1、打开终端 输入“ls回车”,列出当前目录下所有的文件…

SpringCloud-高级篇(十六)

前面学习了Lua的语法,就可以在nginx去做编程,去实现nginx类里面的业务,查询Redis,查询tomcat等 ,业务逻辑的编写依赖于其他组件,这些组件会用到OpenResty的工具去实现 (1)安装OpenRe…

C++(16)——vector的模拟实现

前面的文章中,给出了对于的模拟实现,本篇文章将给出关于的模拟实现。 目录 1.基本框架: 2. 返回值与迭代器: 2.1 返回值capacity与size: 2.2 两种迭代器iterator和const_iterator: 3. 扩容与push_back与pop_back&#xff1a…

后端学习:数据库MySQL学习

数据库简介 数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库。   接下来,我们来学习Mysql的数据模型,数据库是如何来存储和管理数据的。在介绍 Mysql的数据模型之前,需要先了解一个概念&#xf…

log4j2 配置入门介绍

配置 将日志请求插入到应用程序代码中需要进行大量的计划和工作。 观察表明,大约4%的代码专门用于日志记录。因此,即使是中等规模的应用程序也会在其代码中嵌入数千条日志记录语句。 考虑到它们的数量,必须管理这些日志语句,而…

【QT+QGIS跨平台编译】之十三:【giflib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、giflib介绍二、文件下载三、文件分析四、pro文件五、编译实践一、giflib介绍 GIFlib(又称为Libgif)是一个开源的C语言库,用于处理GIF图像格式。它提供了一组函数和工具,使得开发者可以读取、写入和操作GIF图像文件。 GIFlib支持GIF87a和GIF89a两种版本的GIF格…

【项目管理】CMMI-管理性能与度量

管理性能与度量 (Managing Performance and Measurement, MPM)的目的在于开发和维持度量能力来管理开发过程性能,以实现公司业务目标,更直接来说,将管理和改进工作集中在成本、进度表和质量性能上,最大限度地提高业务投资回报。 1…

linux(进程概念)

目录 前言: 正文 冯诺依曼体系结构 操作系统 (Operator System) 概念 目的 定位 如何理解“管理” 进程组织 基本概念 内核数据结构 代码和数据 查看进程 ps指令 top指令 父子进程 fork创建进程 小结: 前…

【Redis】Redis有哪些适合的场景

🍎个人博客:个人主页 🏆个人专栏:Redis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 (1)会话缓存(Session Cache) (2)全页缓存(FPC…