回覆列表
  • 1 # IT人劉俊明

    這是一個比較好的問題,在學習Java的過程中,透過對各種呼叫方式進行發問,從而能越來越深入的瞭解Java的執行機制。

    要想解釋為什麼this()可以再次呼叫構造方法,我們首先需要看一下這種呼叫是如何產生的,要產生this()呼叫構造方法,需要先完成一個構造方法的過載,看一個例子:

    透過這個例子,我們可以看到this()完成了對構造方法的多次呼叫,最終的結果是三個構造方法都執行了。

    這裡面有一點是需要被重點關注的,那就是this()呼叫一定是位於構造方法中的第一條可執行語句的位置,這是一個硬性規定。為什麼有這個規定呢?下面我們沿著這個思路來探究一下,這些構造器在執行過程中都經歷了哪些過程。

    首先當呼叫CTest(int a)這個構造方法時,由於其中的this(a,b)呼叫從而開始呼叫CTest(int a,int b),同樣由於this(a,b,0)從而呼叫第一個構造方法,也就是CTest(int a,int b,int c),這是一個非常好理解的流程。但是這個流程中有一個明顯的問題,就是構造器被呼叫了3次,那麼是不是會產生三個不同的物件呢?看一個例子:

    透過這個例子,我們發現,雖然呼叫了3次構造器,但是隻創建出了一個物件。Java的學習過程中一定要搞清楚一件事情,那就是構造方法的作用是初始化物件,而不是建立物件,建立物件的動作是new完成的!可以簡單的說(不太嚴謹),呼叫了幾次new就建立了幾個物件,和呼叫多少次構造器沒有必然的聯絡。

    在Java語言中,能完成對構造方法呼叫的,除了this還有super,其實我們在構造物件的時候,構造方法中往往都會有一個super呼叫,它的作用是呼叫父類構造器,那麼是不是super呼叫會導致再創建出一個父類物件呢?當然不是!看一個例子:

    透過這個例子,更能說明構造器的作用是初始化。在呼叫期間涉及到靜態繫結和動態繫結,動態繫結發生在建立父類屬性期間,而子類在呼叫父類方法時是靜態繫結。

    如果有程式設計方面的問題,也可以諮詢我。

  • 中秋節和大豐收的關聯?
  • 有句歌詞什麼聲東擊西?