this关键字的理解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
this 关键字的理解
一、this 关键字的理解
public class Person{
}
public class TestPerson{
public static void main(String[] args){
Person p = new Person(“
zhang3”); p.aa(); p.bb(); } }
private String name; public Person(){ } public Person(String name){ = name; }
public void aa(){ this.bb(); }
public void bb(){
System.out.println(“test …”); }
分析:
1、当执行:Person p = new Person(“zhang3”);代码后,内存图如下所示:
p
我们通过上图可以看出,栈内存中的引用变量p引用着(指向)堆内存中的这个Person对象,在堆内存中的这个Person对象身体内部的this也代表(指向)的是这个Person对象,这时this指向的这个Person对象和引用变量p指向的这个Person对象,是同一个Person对象。
好了,现在我们通过Person p = new Person(“zhang3”),这行代码来进一步解释this关键字的用法,为了更好的分析,我们现在需要进入到Person对象身体的内部:首先我们看到Person对象的身体内部有一个属性name(绿色字部分),当执行new Person(“zhang3”)时,表示Java虚拟机(JVM)要调用带一个参数的构造方法,就是public Person(String name)这个构造方法,这个构造方法有一个参数叫name,这时,name这个参数就存储(指向)了“zhang3”这个字符串,构造方法的用途就是给对象的属性赋值用的,所以这个构造方法是将传递进来的这个字符串(即“zhang3”),赋给当前这个Person对象的name(绿色字部分)属性,但是我们发现Person对象的属性叫name,而
public Person(String name)这个构造方法中的参数名也叫name,现在我们怎么才能区分出这两个name:一个代表的是Person对象的属性,一个代表的是构造方法中的参数呢?
可能我们会认为Person对象你不是起了一个名字嘛:就是栈内存中的p,然后在构造方法中写上这样不就代表了Person对象的name属性了吗,但是这里你要注意:栈内存中的这个p 是在Person对象身体外面的,所以我们根本没有办法在Person对象身体内部来用!那么我们怎么才能在Person对象的身体内部来表示这个Person对象自己呢?为了解决这个问题,Java给我们提供了一个关键字:this,它就代表了当前对象自己。当我们写成:时,this就代表了当前Person对象,name代表了属性,所以合到一起就表示:当前Person对象的name属性。当我们写成: = name就表示把参数name的值赋给当前Person对象的name属性。
还记不记得我们给堆内存中的这个Person对象起了个名字,就是栈内存中:p,现在我们在Person对象的身体内部使用了this,这个this也代表了当前的这个Person对象,所以通过上图可以看出:栈内存中的p变量,和Person对象身体内部的this,它们都代表的是同一个Person对象。如果要在Person对象的身体外部引用(代表)这个Person对象,就使用p这个名字,如果要在Person 对象身体内部引用(代表)这个Person对象,就只能使用this了,因为p这个名字没有在Person 对象的身体内部,this只能在对象的身体内部使用,代表当前对象自己。
2、当执行p.aa();代码时,由于p.aa()是Person对象的身体外部的代码,所以为了引用堆内存中的这个Person对象,所以只能使用了p这个名字,所以通过变量p找到Person这个对象,然后再调用Person这个对象的aa()方法,当执行aa()方法内部的代码时,发现代码为:this.bb(),JVM通过this又找到当前的这个Person对象,然后再调用Person对象的bb()方法。
虽然上图中变量p和this指向的是同一个Person对象,并且p.bb()和this.bb()执行结果是一样的,但是表示的含义却不同:
p.bb()表示的是在Person对象的身体外面来引用Person对象并且调Person对象的bb()方法this.bb()表示的是在Person对象的身体内部来引用Person对象并且调Person对象的bb()方法
扩展:还是使用上面的Person类的代码,TestPerson类中的main方法改为如下代码:
堆存内中有两个Person对象,每个Person的身体内部都有this,这时这个this代表的含义仍然是当前对象自己。
如:p1指向的Person对象,在这个Person对象的内部中的this所代表的对象就是p1所指向的Person对象。
如:p2所指向的Person对象,在这个Person对象的内部中的this所代表的对象就是p2所指向的Person对象。
总结:每一个对象的身体内部都会有一个this,来代表自己,将来在对象身体内部使用this就代表自己的意思!