一、介紹
這篇文章大概有近來最粗糙的文章了。
個人一直認爲什麼東西都有自己的節律存在,代碼同樣的有自己的節律。在正式開發和深入代碼之前有必要對其基礎進行更爲深入的瞭解。本文是最近學習和反思後的一些重整理。
二、分析
<基礎概念>
你的代碼經過修改可以去適應新的東西==>可維護性
你的代碼不需要經過修改便能適應新的==>可擴展性
<繼承>
1、將子類之間相同代碼,提升到成一個相同的類,那麼這個類父類。子類繼承父類便擁有了父類的內容
2、子類對父類進行擴展
3、擁有父類的公有屬性和公有方法
4、對父類的私有變量和私有方法不能使用
5、子類可以被當成父類的擴展,如果我們傳參爲父類,那麼子類也可以被使用
<重寫>
1、子類與父類之間存在着繼承或實現關係。
2、子類對父類不滿意,對父類的方法進行覆蓋
3、方法名稱相同,方法類型相同,參數類型,參數個數相同。
4、訪問權限不能更小
5、返回類型必須是父類返回類型或者是父類返回類型的子類類型
6、不能拋出比父類範圍更大的異常
啓示:
@1、原則上父類的私有變量不能被子類直接用,那麼有兩種方式可以使用,一種是將父類的變量給改造成protected(同包及子類可見)
@2、爲父類創建一個有參的構造方法,然後子類去調用父類的構造方法,將值給到父類,父類的變量由父類自己來使用創建。
每個對象在實例化的時候都會默認創建自己的無參構造器,並且有且只有一個無參構造器。當子類繼承父類的時候,子類進行實例化會優先去對父類進行實例化。這個過程中如果父類沒有聲明的無參構造器,子類在創建無參構造器的時候同樣會去通過super()爲父類創建構造器。(父類存在有參構造器後默認不再主動創建無參構造器)
@3、當子類中存在父類的完全一樣的變量,那麼父類的變量就會被隱藏起來。父類的東西都繼承給了子類,無論私有還是公有,但如果父類私有隻能通過父類的方法區去調動。父類可以通過提供方法給子類使用。
<重載>
重載屬於一種編譯時多態,意味對同一行爲作出不同的描述。也即是方法的多樣性。他的特點是方法名稱相同,參數類型或者參數個數不同,返回類型可相同也可以不同。
<多態變量>
類的本意:類型,變量的類型,方法的類型,類的類型等等
子類:子類的父類的一種子類型。那麼也歸屬於父類的類型的範圍內
啓示1:子類的對象可以傳遞給需要父類對象的函數。子類對象也可以放進存放父類對象的容器中。
多態:在某個時刻他所管理的對象類型是會變化的。允許同一對象對同一請求做出不同響應。左聲明右編譯,同一編譯,父類變量可以指向子類對象,也可以指向父類對象,調用不同的方法。變量可以指向聲明類型的對象或者聲明類型的子類型的對象。
<向上造型>
1、cast對於基本數據類型是類型轉換,而對於引用對象類型是造型
2、把一個類型的對象賦值給另外一個類型的變量
3、子類的類型是可以賦值給父類類型的變量
4、變量的賦值是指變量去管理賦值過來的對象。而不是進行替換。
5、向上造型是可以的,但是如果向下造型則取決於父類對象原本的對象是什麼,如果父類變量當前的對象指向了子類對象。那麼再次向下造型是可以的,如果父類變量指向的就是父類對象,那麼必然會報異常。(item實際的類型是什麼,如果原本是子類型,那再次轉下也是可以的)
6、數據轉型:低層級的向高層級轉化的可以直接賦值,高層級向低層級轉化則需要強轉,但是需要註明的是最後還是使用方法去轉化
<Objects>
1、單根結構對象的頂端root,默認是一切的父類
2、toStirng返回一個對象的字符串表達形式,如果沒有重寫toString,則返回內存的地址。
3、equals :用於比較兩個對象是否相同,但是objects只是提供了方法,需要自己去實現,當進行對象間引用的時候需要進行重寫
<引用>
在計算機程序設計中,弱引用與強引用相對,是指不能確保其引用的對象不會被垃圾回收器回收的引用。一個對象若只被弱引用所引用,則被認爲是不可訪問(或弱可訪問)的,並因此默認是可以在任何時刻被回收。
<數據類型與引用類型>
堆和棧是java內存中存放數據的地方。java的類型一般分爲基本數據類型和引用對象類型。我們平時所說的棧就是指的棧幀,我們把JVM運行的空間稱之爲運行時數據區,其中方法區和堆內存是屬於線程共同佔有的,而虛擬機棧,本地方法棧。在棧中主要存放着基本數據類型和引用值變量,也就是常說的字面值。在java的機制中,字面值的變化同樣是先查找後創建,對於一個已經存在的數據,引用值會將地址指向該數據,但其指向後引用值指向的變更的不會影響到數據,有不會影響到其他同樣指向該地址的引用變量!
我們程序所創建的對象則放到對象空間裏面。java裏面將這個對象空間分成了年老區和年輕區。其中年輕區又被細分成了E區,F區,T區。程序運行時創建的對象首先被統一放置在E區,當E區放滿了則會觸發一次垃圾回收,清空E區,將E區存活的對象放置到F區。當E區再一次被放滿了則會再一次觸發垃圾回收,清空E/F區,將E/F區裏面存活的對象放置到T區。如此往返重複,對象隨着GC在FT中反覆複製,當超過某個數值,那麼對象就會被複制到年老區中。當年老區也滿的時候,則會執行Full GC,這個時候如果內存不夠則會造成數據泄漏!
對於堆棧而言,new對象,靜態資源和全局變量都放在堆中,而局部變量則是存放在棧之中。棧在程序中的體現是一個方法啓動時候分配的一個小空間,當方法釋放爲該方法賦值的棧也就走到了盡頭。包括基本數據類型以及引用值的存放等。
<String類型>
字符串均爲不可變類型,存儲於常量池或者對象空間創建。每次都會是先在堆中查找,如果查找不到在創建新的對象!並且棧中對其的每一個引用都是不可變的。這裏的不可變是指對象不可變,當引用指向其他對象的數值時候,引用就不再是屬於這個對象的了!
字符串人工的拼接底層都是通過StringBuilder去創建,相當於生成新的對象,是不放在常量池中的。
<微服務的理解>
將單體的架構拆分成很多微小的服務,服務之間通過rpc進行關聯