Scala謎題 成員宣告的位置

2021-09-13 22:28:29 字數 1010 閱讀 7274

scala謎題

在許多物件導向的語言中,常常在類構造器中接受引數,目的是將引數賦值給類成員。

執行下面的**會是什麼結果呢?

trait a 

class bmember(a: string = "world") extends a

class bconstructor(val audience: string = "world") extends a

new bmember("readers")

new bconstructor("readers")

答案是:

hello null

i repeat:hello readers

hello readers

i repeat:hello readers

通常,bconstructor中的模式是首選的,因為它的行為更少可能會引起意外。這時,超類中宣告的val絕不會存在於非初始化的狀態。

其實,超類和超特質初始化**的執行是在引數評估和早期字段定義之後,例項化類和特質的初始化語句之前。直接超類和混進特質是當它們出現在classtraitobject定義中時按從左到右的順序初始化。

因此,考慮以下初始化方式:

class bmember2(a: string = "world") extends  with a 

new bmember2("readers")

它的輸出結果則為:

hello readers

i repeat:hello readers

實際生產中,最好考慮在類或物件體的括號後(這是主構造器)按照從左到右的宣告順序插入超類構造器和超特質初始化程式。

c 類資料成員的定義 宣告

c 為類中提供類成員的初始化列表 類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 2.進入建構函式後在建構函式中執行一般計算 1.類裡面的任何成員變數在定義時是不能初始化的。2.一般的資料成員可以在建構函式中初始化。3.const資料成員必須在建構函式的初始化...

靜態成員變數與靜態成員函式的宣告與定義

類的靜態成員變數在類中只能宣告,定義和初始化要在類外 class myclass int myclass a 10 類外定義和初初化,注意,這時不需要帶static也有些編譯器支援在類內定義並初始化,但大多數編譯器不支援,所以安全的做法還是類內宣告,類外定義和初始化。類的靜態成員函式的宣告和定義與普...

C 關於函式宣告定義的位置

不知道剛開始學函式這塊時,總以為要把函式宣告放在函式定義前面,甚至有一種陷入框架的感覺,所以在此對此進行一下反思 根據c89規定,在任何執行語句之前,在塊的開頭宣告所有區域性變數。在c99以及c 中則沒有這個限制,即在首次使用之前,可在塊的任何位置都可以宣告變數。也就是說只要在你呼叫函式前,能讓編譯...