粗粒度上來說,Java中關鍵字this主要有2個功能:
1、表示“當前對象”的引用
(1)作為參數傳入
【程序實例1】
1 public class MyObject { 2 3 public Integer val; 4 5 public MyObject() { 6 this.val = 0; 7 } 8 9 public void methodA(Integer x) { 10 this.val += x; 11 System.out.println("MethodA: val = " + this.val); 12 } 13 14 }
1 public static void main(String[] args) { 2 MyObject objA = new MyObject(); 3 MyObject objB = new MyObject(); 4 System.out.println("Main A: val = "+objA.val); 5 System.out.println("Main B: val = "+objB.val); 6 7 objA.methodA(3); 8 objB.methodA(10); 9 }
【運行結果】
1 Main A: val = 0 2 Main B: val = 0 3 MethodA: val = 3 4 MethodA: val = 10
【結果分析】
在main函數中,我們創建了兩個對象objA和objB,並它們調用了同一個方法methodA(), 但是傳入的參數是不同,那么methodA()是怎么知道它是objA、objB調用的呢?
其實,是編譯器在暗中做了一個操作:將“所操作對象”的引用作為第一個參數傳給了被調用的方法。
對應於程序實例1中代碼,就是:
objA.methodA(3) --- methodA(objA,3)
objB.methodA(10) --- methodA(objB,10)
前面說,將操作對象的引用作為第一個參數傳入到了方法中,參數傳進來是要來使用的,否則多此一舉傳到方法中干啥,那么在方法內部該怎么獲得“操作對象的引用”呢?
仔細觀察程序實例1中的MyObject類的methodA(),發現:this.val += x;
也就是說,我們要取當前對象的val值,然后與x相加,再賦值給val。沒錯,此時this就是操作對象的引用!
其實,面向對象的編程語言中,都有類似java中this的關鍵字:C++中的this、Python中的self。
(2)作為參數返回
【程序實例2】
1 public class MyObject { 2 3 public Integer val; 4 5 public MyObject() { 6 this.val = 0; 7 } 8 9 public MyObject methodA(Integer x) { 10 this.val += x; 11 return this; 12 } 13 14 public void printf(){ 15 System.out.println("print: val="+this.val); 16 } 17 18 }
1 public static void main(String[] args) { 2 MyObject objA = new MyObject(); 3 objA.methodA(3).printf(); 4 5 }
【運行結果】
1 print: val=3
【結果分析】
由於methodA()中返回的參數是this,我們才可以鏈式地調用方法printf(),否則,不能鏈式地調用。(this可以作為返回值很有用啊)
當然,此處的this仍然是當前操作對象的引用。
====================我是華麗的分割線====================
再說下,this不被建議使用的情況:
【程序實例3】
1 public class MyObject { 2 3 public Integer val; 4 5 public MyObject() { 6 this.val = 0; 7 } 8 9 public void methodA(Integer x) { 10 this.val += x; 11 this.methodB(); 12 System.out.println("MethodA: val = " + this.val); 13 } 14 15 private void methodB(){ 16 System.out.println("Run methodB !"); 17 } 18 19 }
該代碼是可以正常運行的,但是其實程序的第11行中的this是不符合規范的:如果我們想在方法內部調用另外一個方法,那么直接寫方法名即可,不需要加上this。如果非要寫上也可以,但是毫無必要。
2、在構造器中調用構造器
一個類中可能會有多個構造器,這時,如果想在一個構造器中調用另外一個構造器,則可以使用this。
【程序實例4】
1 public class MyObject { 2 3 public Integer val; 4 5 public String strVal; 6 7 public MyObject(Integer x) { 8 this.val = x; 9 } 10 11 public MyObject(String str){ 12 this.strVal = str; 13 } 14 15 public MyObject(Integer x, String str){ 16 this(x); 17 this.strVal = str; //此處不能再次使用this(str) 18 } 19 20 }
注意:
(1)可以用this調用另一個構造器,但是卻不能調用兩個;
(2)必須將構造器的調用放在方法的起始處,否則編譯器會報錯。
轉載時,請附上本文出處:http://www.cnblogs.com/acode/p/5829879.html