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