通常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()一次。 }