java基础系列(十一) this关键字

一 . 概念

    this关键字的本质到底是什么呢?

    其实,JVM在堆空间给对象分配空间时,每个对象都有一个隐藏的属性this,this指向该对象本身。即,如果用C语言来解释的话,this就是一个指向堆空间中对象本身的指针,只不过在Java中没有指针,叫做引用而已。this自己是对象的一部分,它也在堆空间,但是它又指向了它自己。

来张内存图直观的表示一下,如下图

图解  : 

二. 经典例子

一看图就明白了,就是这么回事儿。当然,我们还可以通过另一种直观的方法来理解this,我们可以分别输出创建的Phone类对象和this对象的哈希码值,并进行比较。进行该操作需要用到hasCode方法(之后我们会讲到hasCode)。

package com.this_test;

public class Phone {
    //成员变量:
    private String brand;   //手机品牌
    private String model;   //手机型号
    private String name;    //手机持有人

    //setter,getter方法
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getModel() {
        return model;
    }
    public void setModel(String model) {
        this.model = model;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    //定义一个方法,用来输出当前this对象的哈希码值。
    public void printThisHasCode() {
        System.out.println(this.hashCode());
    }

}
package com.this_test;

public class TestPhone {
    public static void main(String[] args) {
        //1.创建对象
        Phone phone1 = new Phone();
        Phone phone2 = new Phone();
        //2.调用成员变量,并打印
        //给成员变量赋值
        phone1.setBrand("Huawei");
        phone1.setModel("Mate40");
        phone1.setName("world");
        System.out.println("输出phone1对象的哈希码值 : " + phone1.hashCode());
        System.out.print("输出this对象的哈希码值 : ");
        phone1.printThisHasCode();
        System.out.println("------------------------------------");

        phone2.setBrand("Huawei");
        phone2.setModel("p40");
        phone2.setName("Five");

        System.out.println("输出phone2对象的哈希码值 : " + phone2.hashCode());
        System.out.print("输出this对象的哈希码值 : ");
        phone2.printThisHasCode();
        
    }
}

输出打印:

输出phone1对象的哈希码值 : 366712642
输出this对象的哈希码值 : 366712642
------------------------------------
输出phone2对象的哈希码值 : 1829164700
输出this对象的哈希码值 : 1829164700

三. 参考

java 面向对象三大特性之封装 万字详解(超详细)_java基础——面向对象三大特征之封装-CSDN博客