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
絕不會存在於非初始化的狀態。
其實,超類和超特質初始化**的執行是在引數評估和早期字段定義之後,例項化類和特質的初始化語句之前。直接超類和混進特質是當它們出現在class
、trait
、object
定義中時按從左到右的順序初始化。
因此,考慮以下初始化方式:
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 中則沒有這個限制,即在首次使用之前,可在塊的任何位置都可以宣告變數。也就是說只要在你呼叫函式前,能讓編譯...