看Head First Java 256頁 ,書中提到“this()只能用在構造函數中,且它必須是第一行語句!”,不明白原因,查資料發現知乎已經有相關問題,搬運過來做個記錄。
https://www.zhihu.com/question/47012546/
1:
在構造函數中,如果你不指定構造器之間的調用關系,那么編譯器會給你加上super();目的是在初始化當前對象時,先保證了父類對象先初始化。所以,你指定了構造函數間的調用,那么this()必須在第一行,以保證在執行任何動作前,對象已經完成了初始化。
構造函數只能被構造函數調用,因為對象只會初始化一次。
作者:吾名崔大帥
鏈接:https://www.zhihu.com/question/47012546/answer/104001846
來源:知乎
2:
解答這個問題,首先要明確一下構造方法和普通成員方法的區別。
類似this()和super()這樣的方法被稱為構造方法,顧名思義,他的作用就是在JVM堆中構建出一個指定類型的對象,如果你調用了兩個這種形式的方法,豈不是代表着構建出了兩個對象。
同理,為了避免構建出兩個對象這種問題的出現,Java在編譯時對這種情況做了強校驗,用戶不能再同一個方法內調用多次this()或super(),同時為了避免對對象本身進行操作時,對象本身還未構建成功(也就找不到對應對象),所以對this()或super()的調用只能在構造方法中的第一行實現,防止異常。
在普通的成員方法中,如果調用super()或者this(),你是想要重新創建一個對象嗎?抱歉Java為了保證自身對象的合理性,不允許你做這樣的操作。
作者:Kifile
鏈接:https://www.zhihu.com/question/47012546/answer/104002471
來源:知乎
總結:
this()和super()為構造方法,作用是在JVM堆中構建出一個對象。因此避免多次創建對象,同一個方法內只能調用一次this()或super()。同時為了避免操作對象時對象還未構建成功,需要this()和super()的調用在第一行實現【以此來創建對象】,防止異常。