正式接觸Java的第一本書——因爲書本內容講的很簡單也很淺顯,所以內容就不歸納了,這裏拓展一些閱讀時引發的聯想。
目錄
1、static用法
- static作用:使得變量、方法、類、代碼塊在不創建對象時也能調用,既其是這個類的一部分。
- static原理:static修飾的東西存儲在JVM內存中的方法區/靜態區當中。
- 參考:https://baijiahao.baidu.com/s?id=1636927461989417537&wfr=spider&for=pc
- 拓展1:靜態函數爲什麼不能引用非靜態成員變量?
- 結論:由於靜態成員函數不傳入實例化對象本身【隨着類而加載】,既沒有傳入對象的this引用,因此會出錯。
- 參考:https://blog.csdn.net/kunlcw/article/details/82971292?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- 拓展2:成員內部類爲啥不能定義static修飾的變量?
- 結論:因爲,static修飾的屬性和方法在類加載的時候就會存在於內存【方法區】中,而非static的內部類需要實例化之後存入內存中【堆】才能使用,因此兩者存在於內存的時間存在衝突。
- 參考:https://blog.csdn.net/qq_41694349/article/details/79376819?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
2、boolean存儲空間大小
- 參考1:https://blog.csdn.net/qq_35181209/article/details/77016508?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- 參考2:https://blog.csdn.net/amoscn/article/details/97377833
- 結論:單獨的boolean編譯後用int代替佔4個字節,數組則編譯成byte數組各佔1個字節。
3、構造方法的魔改
- 原本的構造方法沒有返回值,加上返回值就能變身爲具有與類名同名的普通成員函數。
- 無法加上static,構造方法是在創建對象的時候調用,而不是與類共存。
- 單態設計模式需要用到private構造方法,其只能在類內部使用,既只能在類內用該構造方法實例化對象。
4、類繼承的本質
- 繼承本質上只是在子類的構造函數中調用了父類的默認構造函數(super),如果構造函數帶參則子類需要手動調用,其中父類中的public屬性或方法在實例化時只會創建一次,並使得this與super均指向其地址,除非子類中再創建了一個(覆寫),此時this與super指向就不同了。而父類中的private與子類(this)無關僅僅與super有關並且在子類中還不能調用。子類創建的對象針對的都是this。
5、向上、向下轉型深究
- 向上轉型(子->父):屬於自動轉換,只會丟失精度(不能使用子類特有的屬性或方法),但是可以通過向下轉型恢復。
- 向下轉型(父->子):屬於強制轉換,有失敗的風險(可以使用instanceof來避免出錯),只有先向上轉型過的對象才能向下轉型。
- 轉型要求:在引用數據類型中,只有有繼承關係的類型才能進行類型轉換。
- 轉換的本質:類型轉換隻是轉換指向對象的引用的類型,對象本身沒有也不可能參與轉換,對象內存一直在。
- 轉型的好處:自動轉換可以節省代碼:https://www.cnblogs.com/buptldf/p/4959480.html。
- 圖解:
6、探索迭代器Iterator的祕密
- 迭代器:迭代器(Iterator)是一個對象,它的工作就是遍歷並選擇序列中的對象,它提供了一種訪問容器(container)對象中的各個元素,而又不必暴露該對象內部細節的方法。
- 優點:Iterator總是用同一種邏輯來遍歷集合,使用時可以不用管底層數據具體是怎樣存儲的,並且其創建的代價很小,也便於代碼的複用。
- 參考:https://blog.csdn.net/q5706503/article/details/85230897
- 拓展:爲了更好的探究它指向哪兒以及更好的瞭解iterator遍歷的過程,明確迭代器指向的是誰?以及next返回的是誰?它是先後移還是先返回值?而previous又返回了誰?我特地翻出了源碼,以ListIterator爲例,來康康這中間我們的iterator經歷了啥。
- 截取了部分需要的java8代碼段:
- 圖解:
- 結論:1、迭代器指向的位置就是cursor所在的位置。2、next返回的是cursor所指向的值,然後cursor移動+1。3、先保留值,再移動,再返回值。4、previous返回的是cursor-1所指向的值,先移動,後傳值。