• 沒有找到結果。

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。

相關文件