7.8 this關鍵字
7.8.3 深入探討this關鍵字
113
事實上,不論我們在程式中是否出現this關鍵字
,Java編譯器在編譯類別時,都會自動加上隱含 的參考變數this,並且this並不算是類別的成員
,而且只能在類別中使用。
this變數值設定的時機,是在遇到「new 類別名 稱()」時,由於new代表產生類別的物件實體,故 會有一個實體的開始位址,在Java中,我們將該 位址稱為物件的參考(reference),而當new指令 執行完畢時,this變數就被設定為該物件的參考
。
而在範例7-10中,第10行執行完畢時,不僅X被設定為 物件的參考,this也被設定為物件的參考。
7.8.3 深入探討this關鍵字
事實上,this()代表的是呼叫該類別的建構函式
,不過這樣的語法只能出現在建構函式的第一行
。
因此,當建構函式想要呼叫另一個建構函式以進行初始 化的分工時,就可以藉由this()來完成。
除此之外,this既然是編譯時期會加入的隱含變 數,故在產生物件實體時,它也是物件實體的一 部分。
而在之前的圖示中,我們有時候會看到物件實體內包含 了成員函式,但它未包含完整的成員函式內容,事實上
,它的作用只是用來呼叫程式段的成員函式實作。
7.8.3 深入探討this關鍵字
115
而由於每一個物件都可能去執行程式段的成員函式,故對於 程式段的成員函式而言,它必須知道是哪一個物件要求執行 它,以便於當它要取用成員變數時,知道要取用哪一個物件 的成員變數。如下圖示意:
7.8.3 深入探討this關鍵字
正因為程式段的成員函式需要知道是哪一個物件 呼叫它,故Java的做法是,在編譯時期,編譯器 會對所有的成員函式都加上一個隱含的final參數 this,參數的型別是類別本身,因此,this參數 是一個參考,而該this參數將會在函式呼叫時,
被設定為引數物件的參考值,故而呼叫時,會變 成是將物件本身當作引數傳遞過去,使得在呼叫 成員函式時,函式得以判斷是哪一個物件呼叫它
,並且取用到正確的成員變數。
而正由於this是被宣告為final參數,故只有在呼 叫時能被設定,之後就不能再被設定了。
因此上圖應該修改為下圖才是完整的圖示。
7.8.3 深入探討this關鍵字
117
7.8.3 深入探討this關鍵字
圖7-9 this的作用
在上圖中,如果是X的show函式要求執行程式段的 show函式,則會傳入X的參考,也就是3100,因此
,程式段的show函式在取用this.var變數時,知 道要取用處於位址3100之物件實體的成員變數var
。
現在我們算是徹底瞭解了this,以下,我們透過 一個範例來觀察,this的內容究竟為何?
【觀念範例7-11】:觀察this變數內容,以求得 物件實體的所在位址。
範例7-11:ch7_11.java(隨書光碟 myJava\ch07\ch7_11.java)
7.8.3 深入探討this關鍵字
119 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/* 檔名:ch7_12.java 功能:this的內容 */
package myJava.ch07;
import java.lang.*;
public class ch7_11 //主類別 {
public static void main(String args[]) {
CMyClass X = new CMyClass();
CMyClass Y = new CMyClass();
System.out.print("X物件實體所在位址=");
X.show_this();
System.out.print("Y物件實體所在位址=");
Y.show_this();
} }
class CMyClass {
public int var=10; //成員變數 public void show_this()
{
System.out.println(this);
} }
7.8.3 深入探討this關鍵字
執行時,this代表物件的 實體位址
執行結果:
範例說明:
從執行結果中,我們可以得知X物件的實體所在位址為
「5fa6fb3e」,而Y物件的實體所在位址為「4bb8d481
」。
X物件實體所在位址=myJava.ch07.CMyClass@5fa6fb3e Y物件實體所在位址=myJava.ch07.CMyClass@4bb8d481
7.8.3 深入探討this關鍵字
121
總結上述的介紹,我們可以將this關鍵 字的使用時機整理如下:
1.取得物件實體的參考:如同範例7-11。
2.區別成員變數與區域變數:如同範例7-10。
3.用以作為物件本身,例如進行物件的比較:請 見範例7-13。
4.在建構函式內,藉以呼叫其他的建構函式:使
用的是this(引數串)格式,語法如下,請見範例
7-12。
在文檔中
第七章第七章 物件導向設計: 物件導向設計: 類別與物件 類別與物件
(頁 56-61)