this的使用

第一篇講解

Java裏this的作用和用法

       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(變量)的方式,來調用另一個構造函數,來給變量賦值.

轉自:
http://www.cnblogs.com/livterjava/p/4709383.html

第二篇講解

this關鍵字必須放在非靜態方法裏面
this關鍵字代表自身,在程序中主要的使用用途有以下幾個方面:
? 使用this關鍵字引用成員變量
? 使用this關鍵字在自身構造方法內部引用其它構造方法
? 使用this關鍵字代表自身類的對象
? 使用this關鍵字引用成員方法
8.8.1.1 引用成員變量
在一個類的方法或構造方法內部,可以使用“this.成員變量名”這樣的格式來引用成員變量名,有些時候可以省略,有些時候不能省略。首先看一下下面的代碼:
/**
* 使用this引用成員變量
*/
public class ReferenceVariable {
private int a;
public ReferenceVariable(int a){
this.a = a;
}
public int getA(){
return a;
}
public void setA(int a){
this.a = a;
}
}
在該代碼的構造方法和setA方法內部,都是用this.a引用類的成員變量。因爲無論在構造方法還是setA方法內部,都包含2個變量名爲a的變量,一個是參數a,另外一個是成員變量a。按照Java語言的變量作用範圍規定,參數a的作用範圍爲構造方法或方法內部,成員變量a的作用範圍是類的內部,這樣在構造方法和setA方法內部就存在了變量a的衝突,Java語言規定當變量作用範圍重疊時,作用域小的變量覆蓋作用域大的變量。所以在構造方法和setA方法內部,參數a起作用。
這樣需要訪問成員變量a則必須使用this進行引用。當然,如果變量名不發生重疊,則this可以省略。
但是爲了增強代碼的可讀性,一般將參數的名稱和成員變量的名稱保持一致,所以this的使用頻率在規範的代碼內部應該很多。
8.8.1.2 引用構造方法
在一個類的構造方法內部,也可以使用this關鍵字引用其它的構造方法,這樣可以降低代碼的重複,也可以使所有的構造方法保持統一,這樣方便以後的代碼修改和維護,也方便代碼的閱讀。
下面是一個簡單的示例:
/**
* 使用this關鍵字引用構造方法
*/
public class ReferenceConstructor {
int a;
public ReferenceConstructor(){
this(0);
}
public ReferenceConstructor(int a){
this.a = a;
}
}
這裏在不帶參數的構造方法內部,使用this調用了另外一個構造方法,其中0是根據需要傳遞的參數的值,當一個類內部的構造方法比較多時,可以只書寫一個構造方法的內部功能代碼,然後其它的構造方法都通過調用該構造方法實現,這樣既保證了所有的構造是統一的,也降低了代碼的重複。
在實際使用時,需要注意的是,在構造方法內部使用this關鍵字調用其它的構造方法時,調用的代碼只能出現在構造方法內部的第一行可執行代碼。這樣,在構造方法內部使用this關鍵字調用構造方法最多會出現一次。
8.8.1.3 代表自身對象
在一個類的內部,也可以使用this代表自身類的對象,或者換句話說,每個類內部都有一個隱含的成員變量,該成員變量的類型是該類的類型,該成員變量的名稱是this,實際使用this代表自身類的對象的示例代碼如下:
/**
* 使用this代表自身類的對象
*/
public class ReferenceObject {
ReferenceObject instance;
public ReferenceObject(){
instance = this;
}
public void test(){
System.out.println(this);
}
}
在構造方法內部,將對象this的值賦值給instance,在test方法內部,輸出對象this的內容,這裏的this都代表自身類型的對象。
8.8.1.4 引用成員方法
在一個類的內部,成員方法之間的互相調用時也可以使用“this.方法名(參數)”來進行引用,只是所有這樣的引用中this都可以省略,所以這裏就不詳細介紹了。
轉自:
http://blog.csdn.net/javaniuniu/article/details/52447502

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章