JavaSE:this关键字(代码和内存图讲解)

this的含义

this代表当前对象,谁调用this所在的方法,this就代表谁

这句话非常重要

demo

以这段代码为例,setNum方法内部的this,setStr方法内部的this,还有构造方法ThisKeyword(int num, String str)内部的两个this

它们代表哪个对象?当前对象是谁?

public class ThisKeyword {
    
    private int num;
    private String str;

    public void setNum(int num) {
        this.num = num;
    }
    public void setStr(String str) {
        this.str = str;
    }

    public ThisKeyword(int num, String str) {
        this.num = num;
        this.str = str;
    }
    
    public ThisKeyword() {
        
    }
    
    public static void main(String[] args) {
        
        
    }
}

此时还不知道谁是this,

只有当真正运行这三个方法的时候,我们才能清楚到底是哪个对象

this代表当前对象,谁调用this所在的方法,this就代表谁

    public static void main(String[] args) {
        ThisKeyword t1 = new ThisKeyword();
        t1.setNum(1);
        t1.setStr("aaa");
        ThisKeyword t2 = new ThisKeyword(2, "bbb");
    }

当运行t1.setNum(1);时,this代表t1对象,t1对象调用了this所在的setNum方法,所以this代表t1对象
t1.setStr("aaa");同上,ThisKeyword t2 = new ThisKeyword(2, "bbb");同上

理解this代表当前对象是很简单的,但是这种机制的实现是很复杂的,需要结合JVM内存结构图

内存图

在这里插入图片描述
这张图的其他部分都不重要,重要的是红色的两个部分

其实每个对象其中都内置了一个隐藏的属性:this,它的值是当前对象的地址

当我们没有创建对象时,对象不存在,自然对象的堆内存地址也不存在,此时this的值也是不存在的

只有当我们在堆中创建对象之后,this才会被第一次赋值

①main方法栈帧进入虚拟机栈

在这里插入图片描述

②运行ThisKeyword t1 = new ThisKeyword();

无参构造方法ThisKeyword()入栈,在堆内存中申请空间创造对象t1,t1对象的this值是0x111

在这里插入图片描述
此时我们发现,new一个对象居然产生了两个对象引用,供外界程序调用成员变量和成员方法的t1,以及供类内部调用其成员变量和成员方法的this

我们可以将其理解为同一个人,有一个中国名字,还有一个英文名字。
在国内(类内)我们作为他的同胞(类内部成员变量和成员方法),当然要叫他中国名字this;
在国外(类外)歪果仁(外界程序)不知道他的中国名字,所以叫他英文名字t1
这是你吗?
对外我是马邦德,对内我是张牧之

③运行t1.setNum(1);(最重要的一步)

setNum()方法栈帧入栈,首先方法形参num,作为局部变量进入栈帧,然后是this入栈,通过this的地址,找到堆内存中“当前对象”的位置,进而找到t1的num变量的位置,然后赋值
在这里插入图片描述

Java就近原则

如果没有this,this.num = num;就会变成num = num;而根据Java的就近原则,编译器会认为这里的两个num都是形参num,我们通过IDEA可以很清楚的看到这一点

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

如果是等号左边的num是对象中的num,它应该是红色的,而现在全都是灰色的

就近原则的解决办法1:更改形参变量名

此时聪明的小伙伴一定会说,这是因为重名了,我们改掉形参的名字不就好了
在这里插入图片描述
这样确实可以,完全没问题

就近原则的解决办法2:this

如果我比较懒,就想让形参名和实参名相同,请问阁下会如何应对?

此时只能用this,区分形参和实参

实际上,this就是为此而诞生的,大家都懒得给形参起新名字

this的实际使用

this使用限制

this关键字不能用在static修饰的方法中,因为static代表类存储,而this代表当前对象

关于static请看我的另外一篇博客:JavaSE:static关键字详解

this与static

this关键字不能用在static修饰的方法中,因为static代表类存储,而this代表当前对象,有类不一定有对象

但是this能调用static修饰的变量和方法,原因是static修饰的变量和方法,存在对象共享机制

this的用法

this.属性名

方法的局部变量名和类的全局变量名相同时,我们用this来区分局部变量和全局变量

this代表当前对象,所以this调用的一定是对象能调用的变量,也就是成员变量

this.方法名

代表当前正在运行的对象调用该方法

this()

  1. 只能在构造器中使用,不能在构造器当中使用
  2. 而且只能在构造器的第一行使用
  3. this();表示调用无参构造,也可以调用有参构造器
  4. 不能互相调用,
    比如这种写法就是禁止使用的,互相调用没完没了了
    在这里插入图片描述
  5. 不能与super一起使用

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

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

相关文章

软件库V1.2版本开源-首页UI优化

iAppV3源码,首页的分类更换成了标签布局,各位可以参考学习,界面名称已经中文标注! 老版本和现在的版本还是有较大的区别的,建议更新一下! 新版本改动界面如下: 1、首页.iyu:分类按…

基于javassm实现的幼儿教育管理系统

开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclip…

晶核职业选择:六大角色技能揭秘,成为战斗高手!

在晶核的世界中,每一位玩家都扮演着不同角色,组成多样的团队,共同踏上探索未知的征程。而每个角色都有其独特的技能和特点,下面将为你详细介绍每个角色的技能搭配和操作技巧,让你在战斗中游刃有余,一展自己…

MPT - 原理及应用

前文回顾 Merkle原理及应用Merkle代码实现Patricia原理及应用Patricia代码实现 什么是MPT(Merkle Patricia Tree)树 MPT树是一种数据结构,用于在以太坊区块链中高效地存储和检索账户状态、交易历史和其他重要数据。MPT树的设计旨在结合Merk…

python之文件操作与管理

1、文件操作 通过open()操作,来创建文件对象,下面是open()函数语法如下: open(file,mode r,buffering -1 , encoding None ,errors None , newline None,closefd True,opener …

分布式向量数据库-安装部署

下载 GitHub - pgvector/pgvector: Open-source vector similarity search for Postgres 源码编译 ##文件解压缩 unzip pgvector-0.6.2.zip ##编译 make && make install 功能验证 #安装扩展CREATE EXTENSION vector;#创建测试表CREATE TABLE items (id bigseri…

互联网需要做安全防护吗?

互联网需要做安全防护,因为网络攻击的风险随时存在。一旦遭受大规模攻击,企业很可能会受到严重影响,甚至会造成巨大的经济损失和品牌声誉受损。因此,建议企业在安全防护方面做好以下几点: 加强网络安全意识教育&#x…

libVLC 视频窗口上叠加透明窗口

很多时候,我们需要在界面上画一些三角形、文字等之类的东西,我们之需要重写paintEvent方法,比如像这样 void Widget::paintEvent(QPaintEvent *event) 以下就是重写的代码。 void Widget::paintEvent(QPaintEvent *event) {//创建QPainte…

【Python系列】将生成的 JSON 数据写入 JSON 文件

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

直播带货行业将迎来大地震

关注卢松松,会经常给你分享一些我的经验和观点。 为什么这么多人喊着关闭直播带货?实体经济是到底因为什么萧条的?为什么大街上冷冷清清的?是房租、虚高的价格、还是直播带货引起的? 在4月9日的国务院政策吹风会上,市场监管明确指出: …

Spring Cloud学习笔记:Eureka简介,Eureka简单样例

这是本人学习的总结,主要学习资料如下 - 马士兵教育 [TOC](目录)1、Eureka 1.1、架构 Eureka是SpringCloud Nexflix的核心子模块,其中包含Server和Client。 Server提供服务注册,存储所有可用服务节点。 Client用于简化和Server的通讯复杂…

微信小程序uniapp+vue电力巡线任务故障报修管理系统2q91t

uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 前端开发:vue 语言:javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/t…

JVM修炼之路【10】- 垃圾回收器和垃圾回收算法

垃圾回收算法 我们先简要看一下 四种主要的垃圾回收算法 看到这不禁感慨一下 人家1960年 都搞出GC算法了 太强了 评价标准 既然有这么多算法 那就跟各个牌子的游戏本一样 有个比较,这里我们重点介绍一下 垃圾回收算法的评价标准 这几个标准非常重要是 是后面理解很…

初学SSRF总结

什么是SSRF SSRF是由攻击者构造通过服务端发起请求的安全漏洞。通常情况下,SSRF的攻击对象是外部无法访问的内网(因为是由服务端发起的请求所以攻击能够访问到内部系统) 由于服务端提供了从其它服务器获取数据的功能,但是有没有…

PlanUML和Mermaid哪个好?

引言 在当今信息化快速发展的时代,数据可视化和图表工具不仅对于程序员,也对于非技术背景的人士至关重要。绘图工具可以帮助我们更好地理解和表达复杂的概念或数据流。PlantUML和Mermaid是两款被广泛使用的绘图语言,它们都能够通过简洁的文本…

mynet开源库

1.介绍 个人实现的c开源网络库. 2.软件架构 1.结构图 2.基于event的自动分发机制 3.多优先级分发队列,延迟分发队列 内部event服务于通知机制的优先级为0,外部event优先级为1. 当集中处理分发的event_callback时&#xff0c…

Spring Boot 框架集成Knife4j

本次示例使用 Spring Boot 作为脚手架来快速集成 Knife4j,Spring Boot 版本2.3.5.RELEASE,Knife4j 版本2.0.7&#xff0c;完整代码可以去参考 knife4j-spring-boot-fast-demo pom.xml 完整文件代码如下 <?xml version"1.0" encoding"UTF-8"?> &l…

Terraform进阶技巧

Terraform 是管理 IaC 的强大工具&#xff0c;常用常新。在这一部分我们将探索 Terraform 的进阶技能&#xff0c;包括 Terraform 模块、远程状态存储、Terraform 工作区以及自定义 Provider。 1、Terraform 模块 Terraform 模块是可复用的 Terraform 代码包&#xff0c;其…

Scaffold-GS 代码阅读笔记

1. 系统启动部分 使用 python 中的 parser 库 为配置系统的参数设定, 和3DGS 类似&#xff0c;并且使用safe_state(args.quiet) 函数 为每一次的 log 输出加上对应的 时间戳 ## 配置参数的设定lp ModelParams(parser)op OptimizationParams(parser)pp PipelineParams(pars…

嵌入式linux系统链接腾讯云的方法

各位开发者大家好,今天主要给大家分享一个,如何使用linux系统链接腾讯云的方法,因为微信小程序越来越普遍,链接腾讯云也是日常必须掌握的一个技能。 第一:【实验目的】 1、linux 系统连接腾讯云的方法 第二:【实验原理】 涉及到原理图添加原理图 2、linux开发板 …