this, 一個官方的說法是,this首先是一個對象,它代表調用這個函數的對象。
根據面向對象的基本語法,每當調用變量或者函數的時候,都要按照類名.變量(函數)的格式來調用,意即每個變量或函數都必須屬於某一個實際的對象而不是一個類(static的除外).
在不會產生混淆的地方, this是可以省略的,但一般都會加上,(Think in Java里面說最好不要加,因為大家都不加)
例如,下面的程序中,類"Person"里面加與不加 this 編譯運行后的結果是一樣的:
1 package testThis; 2
3 public class Test { 4 public static void main(String args[]){ 5 Person p1 = new Person(); 6 p1.name = "zhangsan"; 7 Person p2 = new Person(); 8 p2.name = "lisi"; 9
10 p1.talk(); 11 p2.talk(); 12 } 13 } 14
15 class Person{ 16 String name; 17 void talk(){ 18 System.out.println("My name is " + this.name); 19 } 20 }
上面的代碼里第18行,不管是"this.name"還是"name",運行的結果都是:
My name is zhangsan
My name is lisi
因為前面已經把p1和p2里面的name變量賦值,所以執行方法的時候,都會打印出它們各自的數據.
但是,當函數里面有參數時,如果函數的參數和成員變量一樣,這時不加this的話,程序就會根據"就近原則",自動調用最近的值,如下面的代碼: 上面已經把對象p1和p2里面的變量name分別賦值為"zhangsan"和"lisi",但類"Person"里面的方法"talk"現在有了參數"String name",而且沒有加"this",這時如果運行這個方法,方法就會接收后面參數傳送給它的值,分別是"zhang"和"li",這時運行結果就會是:
My name is zhang
My name is li
所以,這里雖然對象p1和p2各有自己的變量 name,但它們調用的方法接收的卻是參數里面的值,(從系統里各變量的顏色背景也可心看出對應的變量),而不是它們自己本身的值.所以這里輸出的結果跟它們自己內部的值無關.
如果想要在它們各自調用talk()方法時分別輸出自己內部的值,則需要在類 "Person"里面的方法"talk"里加上"this",這樣,當它們各自調用這個方法時,輸出的結果都是它們各自內部變量的值了:
上面介紹的是用this來調用本身對象的變量和函數,this還有一個重要的作用就是用來調用構造函數.可以用來精簡代碼.比如下例,如果我們的類里面有多個構造函數,分別給不同的變量賦值,就可能會產生重復代碼,為了解決這些重復代碼,就可以用this(變量)的方式,來調用另一個構造函數,來給變量賦值.