Java中this的功能與作用


粗粒度上來說,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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM