- 最後登錄
- 2022-8-19
- 在線時間
- 0 小時
- 註冊時間
- 2009-3-1
- 閱讀權限
- 20
- 精華
- 0
- UID
- 5937142
- 帖子
- 235
- 積分
- 153 點
- 潛水值
- 19415 米
| 本帖最後由 RainieYang 於 2018-10-24 05:56 PM 編輯
1.關於 String ,小弟知道他實作了 CharSequence介面, 但toString並沒有實作,去看CharSequence原始碼看到下面這段:- /**
- * Returns a string containing the characters in this sequence in the same
- * order as this sequence. The length of the string will be the length of
- * this sequence.
- *
- * @return a string consisting of exactly this sequence of characters
- */
- public String toString();
複製代碼
這樣我不知道算是有實作還是沒實作?
但如果有實作,卻看不到進一步的實作程式碼,這讓小弟有點困惑。
String的toString method(), 或應該說, CharSequence的 toString method() 到底被實作在哪呢?
---------------------------------------------------------------------------------------------------------
補充及更正,小弟自己繼續研究的發現及推測:
String 實作了 CharSequence, 然後String 是有自己實作toString的,小弟的問題說toString沒有在String被實作說錯了,他是有的,方法內直接返回本身 (return this)
但繼續實驗觀察會發現一些有趣的現象:
小弟自己建一個class去實作 CharSequence,結果發現,他強迫你實作的method 一共只有3個(不含toString),他沒有強制要求你實作toString,可是這就奇怪啦,因為CharSequence裡toString並沒有實作,所以應該要被implent他的class實作出來才對,為什麼你不實作是可以被接受的呢?
最後小弟自己做了一些實驗,得出一個推測,因為任何class均繼承Object,所以就算你沒定義toString,你的class依然有toString方法(來自Object),所以他就當作你已經實作toString了... 不會再強迫要求你要實作toString...
這是小弟經過實驗得出的推測。
但這其中還有奇怪的地方是,既然任何class都一定有toString方法,也就是任何class必然已實作toString,那CharSequence的toString介面豈不是形同虛設? 反正一定會被實作出來...
對此有人有任何看法嗎? 小弟猜測這是一個失誤? Java官方那時實作此介面,希望開發者必須實作toString來將字符串轉成等價的String,但卻沒想到任何class因為已繼承Object,所以必然有toString方法,也就是可以根本不用甩CharSequence提供的toString介面。
此外還有個神奇的小現象,就是當我自己繼承CharSequence後,還是去覆寫toString(當然不覆寫也行,會沿用Object.toString),結果上方跳提醒,希望我加上@NonNull,但是我去檢查不論CharSequence還是Object的toString都沒有@NonNull字樣,那為什麼繼承後卻建議我加上呢?
... |
|