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

Java语言this关键

作者头像
赵哥窟
发布2022-11-16 18:49:06
2640
发布2022-11-16 18:49:06
举报
文章被收录于专栏:日常技术分享

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

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

代码语言:javascript
复制
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
复制
public static void main(String[] args) {
        Person person = new Person("李四",20);
        person.introduce();
    }

运行的结果

代码语言:javascript
复制
我叫:李四,今年20岁

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

代码语言:javascript
复制
public Person(String name, int age){
        name = name;
        age = age;
}

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

代码语言:javascript
复制
我叫:null,今年0岁

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

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

代码语言:javascript
复制
 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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档