有时会遇到this做为返回值的状况,那么此时返回的究竟是什么呢?this
返回的是调用this所处方法的那个对象的引用,读起来有点绕口哈,有没有想起小学语文分析句子成份的试题,哈哈。3d
一点点分析的话,主干是“返回的是引用”;cdn
什么引用呢?“那个对象的引用”;对象
哪一个对象呢?“调用方法的那个对象”;blog
调用的哪一个方法呢?“调用的是this所位于的方法”;这样就清楚了。内存
再总结一下就是,this做为返回值时,返回的是调用某方法的对象的引用,这个方法正是包含“return this;”这行命令的那个方法;更简单点说,就是谁调用返回的就是谁。it
为了更清楚、直观的理解问题,下面以简单的例子说明。io
包human中定义了Person类,代码以下:class
package human;test
public class Person { String name; int age;
public Person() {
} public Person(String n, String g) { name = n; gender = g; }
//test:this做返回值 Person reThis1() { Person per = new Person("lu","female"); System.out.println("reThis1 per:" + per.name); return this; } Person reThis2() { Person per = reThis1(); System.out.println("reThis2 per:" + per.name); return this; } Person reThis3() { name = "ma"; return this; } static void equRefer(Person per1, Person per2) { if(per1 == per2) System.out.println("per1指向的对象没有改变,仍与per2指向同一个对象"); else System.out.println("per1指向的对象已改变,与per2指向不一样的对象"); System.out.println("per1:" + per1.name); System.out.println("per2:" + per2.name); }
public static void main(String[] args) { Person per1 = new Person("liu","female"); Person per2 = per1;
per1 = per1.reThis1(); Person.equRefer(per1, per2);
per1 = per1.reThis2(); Person.equRefer(per1, per2);
System.out.println("调用reThis3以前,per1.name=" + per1.name); per1 = per1.reThis3(); System.out.println("调用reThis3以后,per1.name=" + per1.name); } } 输出结果以下:
reThis1 per:lu per1指向的对象没有改变,仍与per2指向同一个对象 per1:liu per2:liu reThis1 per:lu reThis2 per:liu per1指向的对象没有改变,仍与per2指向同一个对象 per1:liu per2:liu 调用reThis3以前,per1.name=liu 调用reThis3以后,per1.name=ma 逐句分析执行过程:
(1).第1句:Person per1 = new Person("liu","female");
建立一个Person对象,将name初始化为“liu”,gender初始化为“female”,并让per1指向该对象。
(2).第2句:Person per2 = per1;
定义一个Person类的对象引用,并与per1指向同一个对象;具体内存分配见图1:
(3).第3句:per1 = per1.reThis1();
由per1调用reThis1()方法,并将返回值赋给per1;reThis1()方法体内定义了一个局部变量per,并建立一个对象,由per指向它;具体内存分配见图2:
紧接着输出reThis1 per:lu;最后返回this,并把返回的值赋给per1。
(4).第4句:Person.equRefer(per1, per2);
调用equRefer(per1,per2)来验证per1的值并未改变;根据下面的输出结果也可知per1仍与per2指向原来的对象,也就是说此时this的值与per1的值是一致的;也能够说,谁调用的返回的就是谁。
输出结果:
per1指向的对象没有改变,仍与per2指向同一个对象 per1:liu per2:liu
此时的内存图如图3:
(5).第5句:per1 = per1.reThis2();
per1调用reThis2(),由(4)可推测,此时per1的值也不会变,是由per1调用的this所处的方法,因此返回的也是per1;具体来分析的话,reThis2()定义了一个局部变量per,并给其赋值为reThis1(),也就是说reThis2()调用了reThis1(),由(3)、(4)可推知,此时的内存结构是下面这样的:
局部变量per指向的对象与per1是一致的,由于调用reThis1的对象是per1所指的对象,因此返回值也是per1。
此处的输出结果为:
reThis1 per:lu reThis2 per:liu
(6).第6句:Person.equRefer(per1, per2);
验证上面的结论,per1指向没变,此时的内存分配图如图4所示:
(7).第七、八、9句:
System.out.println("调用reThis3以前,per1.name=" + per1.name); per1 = per1.reThis3(); System.out.println("调用reThis3以后,per1.name=" + per1.name);
per1调用reThis3();reThis3()中修改了namer的值,由"liu"改成"ma",而后返回this。
调用先后的内存结构分别如图六、图7所示:
输出结果:
调用reThis3以前,per1.name=liu 调用reThis3以后,per1.name=ma
再一次验证了上述的结论。
关于为何使用this,我是这么理解的:因为定义类的时候还没有建立对象,因此不能肯定对象到底叫什么,就用this来统一表示,等到具体调用时就能够知道对象的名字了,而后就用对象的引用替换this;因此为了便于记忆,能够理解成谁调用返回的就是谁。
至于返回this有什么意义,个人理解是:记返回this的方法为A,可能A的方法体中对对象的属性作了某些操做或调用了某些方法完成了某些动做,总之,作完这些操做后就把原对象的引用返回,返回后的状态是对象最新的状态,可能与对象调用方法A前不一样。