美文网首页
Java语言this关键

Java语言this关键

作者: 赵哥窟 | 来源:发表于2022-11-03 14:56 被阅读0次

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

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

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+"岁");
    }
}
public static void main(String[] args) {
        Person person = new Person("李四",20);
        person.introduce();
    }

运行的结果

我叫:李四,今年20岁

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

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

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

我叫:null,今年0岁

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

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

 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关键字的意义。

相关文章

  • Java语言this关键

    学习Java编程的时候,当学到面向对象这部分内容时都会遇到一个关键字:this。很多初学者对这个关键字的都会感觉到...

  • 锁的艺术

    锁,在JAVA语言中,也就是synchronized关键字。 synchronized 是 Java 在语言层面提...

  • 变量与常量

    变量与常量 @(Java学习) 一、关键字 Java语言中具有特殊用途的词称为关键字。 Java中常用的关键字如下...

  • java数据类型01_常量和变量

    1.关键字和保留字 关键字:java语言事先定义好,具有特殊含义的单词! 保留字:java语言现在还未使用,可能今...

  • Java简介

    Java是一门面向对象的语言JVM:Java虚拟机简称(是java平台无关性实现的关键)JDK(java语言软件开...

  • 谈谈JavaScript中的this关键字

    前言:Java 语言当中也有this关键字,而 JavaScript 语言当中的this关键字因为具有运行期绑定的...

  • Java 入门之变量和常量

    Java中的关键字,关键字的含义:Java 语言中有一些具有特殊用途的词被称为关键字。Java 关键字是区分大小写...

  • java终极菜鸟总结1

    1.java的关键字: Java 语言中有一些具有特殊用途的词被称为关键字。 所谓关键字,通过一个学期对C语言的学...

  • Java 学习笔记33 - 有没有goto关键字?

    问:Java语言有没有goto关键字?答:goto是java语言中的保留字,目前还没有在java中使用。goto关...

  • 2.java基本语法

    一.关键字&标识符 1.关键字:被java语言赋予特殊含义的字符串(或单词), 2.保留字:被java语言占用,但...

网友评论

      本文标题:Java语言this关键

      本文链接:https://www.haomeiwen.com/subject/rmketdtx.html