前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java语言this关键

Java语言this关键

作者头像
赵哥窟
发布于 2022-11-16 10:49:06
发布于 2022-11-16 10:49:06
28100
代码可运行
举报
文章被收录于专栏:日常技术分享日常技术分享
运行总次数:0
代码可运行

学习Java编程的时候,当学到面向对象这部分内容时都会遇到一个关键字:this。很多初学者对这个关键字的都会感觉到理解不透,不明白这个神秘的”this”到底表示什么意思。按照官方正规的解释,this关键字的意义被解释为“指向当前对象的引用”。这个解释非常准确并且很精炼,但它太过学术化了,导致很多初学者有点读不懂,更谈不上深入理解它的意义。本文将用大白话的形式帮助初学Java的小伙伴来深入理解this关键字的意义,并且梳理它的各种用法。

其实,我们只要把this理解成”本对象自己的”就可以了,让我们首先来看一段代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Person {
    private String name;
    private int age;

    public Person(String n, int a){
        name = n;
        age = a;
    }

    public void introduce(){
        System.out.println("我叫:"+name+",今年"+age+"岁");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
        Person person = new Person("李四",20);
        person.introduce();
    }

运行的结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
我叫:李四,今年20

通过程序的运行结果我们可以看出,在创建对象的时候,对象的属性被赋予了正确初始值,但是大家请注意,我们在定义构造方法的时候,把表示姓名、年龄的参数分别命名为:n、a,这种命名的可读性有点差,为了提高可读性,我们把构造方法的参数名称修改为name、age,如下图所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Person(String name, int age){
        name = name;
        age = age;
}

修改之后,再次运行main方法,得到的运行结果变成了这个样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
我叫:null,今年0

为什么这一次的运行结果出现了问题呢?因为,修改了构造方法之后,当我们调用构造方法创建对象时,给构造方法所传递的2个参数值“李四”、20最终并没有赋值到对象的2个属性中。那么,既然参数值没有被赋值到对象的属性中,它们去了哪里呢?修改代码后,构造方法的参数与类所定义的属性同名,根据”同名情况下,局部变量的优先级更高”原则,在构造方法执行的过程中,虚拟机会把参数值赋给”参数本身”,而不是赋值给对象的属性!具体来说,就是我们给构造方法的name参数传递的值是”李四”,而这个”李四”在构造方法执行的过程中,当运行到”name=name;”这条语句时,并没有把”李四”赋值给对象的name属性,而是又重新赋值给了name参数自身。就是因为”李四”最终没有被赋值到对象的name属性中,才导致introduce方法中打印出的name属性是null。当然,age参数也是同样的赋值效果。

为了能够让虚拟机明白我们所期望的是:把”李四”这个字符串赋值给对象的name属性,而不是”再一次”把它赋值给构造方法的参数,就需要把构造方法中的赋值语句做出如下修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

这一次,我们在构造方法中,给”=”左边的属性前面都加上了this关键字,经过修改之后,重新运行main方法,就恢复了正常的运行效果。现在我们就来探究一下,加了this关键字之后,为什么程序能够”恢复正常”。刚才我们说过,”this”可以被解释为” 本对象自己的...”,按照这个逻辑,”this.name”就可以被解释为”本对象自己的name属性”,所以在执行”this.name=name;”这条语句的时候,虚拟机就会把name参数的值”李四”赋值给对象的name属性。也就是说在这条赋值语句中,”=”左边的”this.name”表示对象的name属性,而”=”右边的name表示方法的name参数。

讲到这里,有的小伙伴可能会问:”this.name”为什么不能被解释为”本对象自己的name参数”呢?因为”参数”这个概念是就某个方法而言的,它相当于某个方法的”局部变量”,只是这个”局部变量”比起在方法中定义的真正的局部变量来讲有点特殊,它能够接收从主调方法中传递过来的值。因此,当我们说到”参数”这个概念的时候,都是相对于一个”方法”而不是一个”对象”而言的,所以也就不会有”某个对象的参数”这一说法。因此,”this.name”只能被虚拟机认定为本对象自己的name”属性”,绝不会被当作name”参数”。

通过这个例子,希望大家能够理解this关键字的意义。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一篇文章带你了解this关键字和单例模式
前面的文章给大家介绍了Java诸多基础知识,感兴趣的小伙伴记得前往噢:Java基础入门篇——for循环、Java基础入门篇——While循环、Java基础入门篇——Switch条件语句、Java基础入门篇(七)——结构语句和if语句、Java基础入门篇(六)——Java运算符、Java基础入门篇(五)——Java变量类型的转换和运算符。接下来开始我们今天的内容吧~
Java进阶者
2021/01/22
2940
Java关键词总结
final修饰可以保证安全性,比如数组的长度属性,String类,这些都是final修饰的,保证不可变
闲花手札
2021/08/24
3110
【JAVA-Day57】深度解析Java中的this和super关键字:用途、差异和实际应用
标题: “深度解析Java中的this和super关键字:用途、差异和实际应用” 🚀📚🤔🎯🌟⏱️🔄
默 语
2024/11/20
1050
【JAVA-Day57】深度解析Java中的this和super关键字:用途、差异和实际应用
this关键字与super关键字详解
也就是说当存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量,那是因为Java采取的是就近原则访问的,要解决这个问题就需要使用this关键字;
全栈程序员站长
2022/07/02
7460
this关键字与super关键字详解
java从入门到精通四(面向对象上,类与对象的实现,代码块的执行顺序)
面向对象的方法主要是把事物对象化,包括属性和行为。而面向对象编程则比较贴近生活的实际,也就说,在程序中的编程,力图对描述的事物在现实中的形态保持一致。为了做到这一点,我们java中也就有类和对象的概念。类是对一类事物的抽象,类下就有若干对象,对象用于描述类中事物的个体。说来光看定义还是比较抽象,不容易理解。我们在下面的编程实践中可以大致理解这种思维模式。
兰舟千帆
2022/07/16
8020
java从入门到精通四(面向对象上,类与对象的实现,代码块的执行顺序)
Java中this关键字详解
(1)this调用本类中的属性,也就是类中的成员变量; (2)this调用本类中的其他方法; (3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。
全栈程序员站长
2022/07/05
4360
Java之路:this关键字的用法
最经常使用this关键字的情况,是在对象的一个属性被方法或构造器的参数屏蔽时,需要调用这个被屏蔽的属性,如下:
全栈程序员站长
2022/07/02
1840
Java之路:this关键字的用法
Java This和Super的用法
做自动化测试,写代码肯定是必须的,不管是Java还是Python,必须得会,当然,Python肯定未来作自动化测试脚本的是主流,越来越多的地方都能使用到Python,不管大数据还是机器学习,所以Python应该要好好学习。
软测小生
2019/07/05
8840
Java This和Super的用法
【09】JAVASE-面向对象-关键字【从零开始学JAVA】
Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。
用户4919348
2024/05/25
990
【09】JAVASE-面向对象-关键字【从零开始学JAVA】
夜谈Java类的定义
对于结构化程序设计:起床,洗脸,吃饭,下课,放学 对于面向对象设计,类,类中的方法
达达前端
2019/07/03
7520
夜谈Java类的定义
大数据必学Java基础(三十五):深入了解关键词this
总结:当属性名字和形参发生重名的时候,或者 属性名字 和局部变量重名的时候,都会发生就近原则,所以如果我要是直接使用变量名字的话就指的是离的近的那个形参或者局部变量,这时候如果我想要表示属性的话,在前面要加上:this.修饰
Lansonli
2022/08/01
2040
大数据必学Java基础(三十五):深入了解关键词this
java类和对象(上.2)
不能被static、final、synchronized、abstract、native修饰,不能有
一个风轻云淡
2022/11/13
2740
java类和对象(上.2)
Java易错知识点总结(二)
方法重载的意思是一个类中可以有多个方法具有相同的名字,即使方法类型不同,这些方法的参数必须不同,即参数的个数不同,或者参数的类型不同。
C_H
2022/11/15
2670
一文秒杀Java中this关键字
在这里插入图片描述 运行的结果的顺序其实很简单,关键就是要理解this到底指着谁,this表示对当前对象的引用,也就是subclass对象
润森
2019/11/24
4300
(还在没有对象而发愁吗,new出来)->Java面向对象入门
强调的是我该怎么去做。即功能的执行过程,即先干啥,后干啥。在面向过程中,我们会写很多的函数,每一个函数负责完成某一个功能。
上分如喝水
2021/08/16
8940
(还在没有对象而发愁吗,new出来)->Java面向对象入门
Java中static、final关键字【详解】
静态成员变量(被static修饰,属于类、加载一次、内存中只有一份)。直接用 类名 访问即可,因为类只有一个,所以静态成员变量在内存区域中也只有一份,所有的对象都可以共享该变量。
寻求出路的程序媛
2024/03/25
4860
Java中static、final关键字【详解】
面向对象:封装?继承?多态?
构造方法是为了创建对象而存在的,一个对象的创建肯定会执行构造方法。一般在构造方法中做初始化操作。构造方法的的特点:没有返回值,连void都不能有;方法名和类名一模一样;方法里面没有返回值(但是可以写一个单独的 return;)
阿Q说代码
2021/05/13
5590
《JAVA SE》类与对象的注意事项
1.使用 . 访问对象的字段. 2.“访问” 既包含读, 也包含写. 3.对于一个对象的字段如果没有显式设置初始值, 那么会被设置一个默认的初值.
VIBE
2022/12/02
2760
面向对象编程:从创建类到封装与构造方法的探索
在面向对象编程中,类是对一类事物的抽象,包含了静态的属性(成员变量)和动态的行为(成员方法)。在Java中,创建类的格式如下:
IT_陈寒
2023/12/13
1910
【 JavaSE 】 类和对象
作用:this表示当前对象引用(注意不是当前对象),可以借助 this 来访问对象的字段和方法
用户9645905
2022/11/30
4750
【 JavaSE 】 类和对象
相关推荐
一篇文章带你了解this关键字和单例模式
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验