初探java中this的用法

通常this在各種語言中都表示「調用當前函數的對象」,java中也存在這種用法:java

 1 public class Leaf {
 2     int i = 0;
 3     Leaf increment(){
 4         i++;
 5         return this;    //this指代調用increment()函數的對象
 6     }
 7     void print(){
 8         System.out.println("i = " + i);
 9     }
10     public static void main(String[] args) {
11         Leaf x = new Leaf();
12         x.increment().increment().increment().print();
13     }
14 
15 }
16 //////////out put///////////
17 //i = 3

在上面的代碼中,咱們在main()函數裏首先定義了Leaf類的一個對象:x 。而後經過這個對象來調用increment()方法, 在這個increment()方法中返回了this--也就是指代調用它的當前對象x (經過這種方式就實現了鏈式表達式的效果)。函數

咱們經過x.increment()來表示經過x來調用increment()函數,實際上在java語言內部這個函數的調用形式是這樣子的:this

Leaf.increment(x);

固然,這種轉換隻存在與語言內部,而不能這樣寫碼。spa

 

另一種狀況是在構造函數中調用構造函數時,this指代一個構造函數,來看一個簡單的例子:code

 1 public class Flower {
 2     int petalCount = 0;
 3     String s = "initial value";
 4     Flower(int petals){
 5         petalCount = petals;
 6         System.out.println("Constructor w/ int arg only, petalCount = " + petalCount);
 7     }
 8     
 9     Flower(String ss){
10         System.out.println("Constructor w/ string arg only, s = " + ss);
11         s = ss;
12     }
13     
14     Flower(String s, int petals){
15         this(petals);    //這裏的"this"指代的Flower構造器
16         this.s = s;
17         System.out.println("string and int args");
18     }
19     
20     Flower(){
21         this("hi", 47);    //這裏的"this"指代的Flower構造器
22         System.out.println("default (no args)");
23     }
24     public static void main(String[] args) {
25         // TODO Auto-generated method stub
26         new Flower();
27     }
28 }
29 ////////Out put/////////////
30 //Constructor w/ int arg only, petalCount = 47
31 //string and int args
32 //default (no args)

Flower類有四個構造函數,在這寫構造函數內部的this表示也是Flower類的構造函數,並且this()中的參數的個數也指代對應的構造函數,這樣就實現了在構造函數中調用其餘的構造函數。對象

可是須要注意的一點就是:雖然咱們能夠經過this在一個構造函數中調用另外一個構造函數,可是咱們頂多只能用這種方法調用一次,並且對另外一個構造函數的調用動做必須置於最起始處,不然編譯器會發出錯誤消息。比方說,下面這樣是不行的:blog

Flower(String s, int petals){
        this(petals);
        this(s);  //error! 頂多只能調用this()一次。
    }
相關文章
相關標籤/搜索