一缘揪、概述
寫Java編程思想筆記系列的文章的初衷,是希望同小伙伴們一起探討關(guān)于Java后端開發(fā)的進(jìn)擊之路。我在讀研期間學(xué)習(xí)了兩年C++,工作初期又搞了兩年Go朴爬,然后最近一年因?yàn)檠芯康痛a領(lǐng)域用到 Flowable 框架開始轉(zhuǎn)戰(zhàn)Java。工作以后其實(shí)會(huì)發(fā)現(xiàn)以前的一句玩笑話是真的——語言不是問題橡淆。很多時(shí)候開發(fā)的項(xiàng)目要強(qiáng)依賴一個(gè)主流開源框架召噩,你是搞C++的,可是這個(gè)開源項(xiàng)目卻是用Java寫的明垢,怎么辦蚣常?只能硬著頭皮上……
我借鑒了很多業(yè)界公開的以及一些大神同事的經(jīng)驗(yàn)市咽,總結(jié)了關(guān)于學(xué)習(xí)Java的路線圖痊银,后續(xù)我會(huì)根據(jù)這張思維導(dǎo)圖去不斷豐富,同時(shí)會(huì)更新自己的學(xué)習(xí)筆記施绎,感興趣的伙伴可以一起探討溯革。
JDK其實(shí)也有很多需要研究的東西贞绳,但是由于這個(gè)東西不是很剛需,等我有時(shí)間了再補(bǔ)課吧致稀,項(xiàng)目開發(fā)都是一些CRUD冈闭,前人栽樹我來乘涼,但是很多時(shí)候感覺對(duì)Java的一些基礎(chǔ)有些模棱兩可抖单,急需補(bǔ)充一些對(duì)Java語言的認(rèn)知萎攒,那就從學(xué)習(xí)《Java編程思想》開始吧,這可是一本神書矛绘,學(xué)習(xí)Java語言有它就足夠了耍休!
二、對(duì)象
1.訪問控制
作用:讓調(diào)用者無法觸及他們不該觸及的部分货矮;讓庫設(shè)計(jì)者可以改變類內(nèi)部的工作方式羊精,而不用擔(dān)心影響到調(diào)用者。
Java 用三個(gè)關(guān)鍵字在類內(nèi)部設(shè)定邊界:
????public:任何人都可以訪問的元素
????private:類創(chuàng)建者和類內(nèi)部方法可以訪問的元素
????protected:和private相比囚玫,除了類創(chuàng)建者和類內(nèi)部方法以外喧锦,繼承的類也可訪問的元素
2.聚合和繼承
聚合指一個(gè)對(duì)象是另一個(gè)對(duì)象的成員,即二者是“has-a”(擁有)的關(guān)系抓督,例如燃少,汽車擁有引擎;繼承是指一個(gè)對(duì)象具有和另一個(gè)對(duì)象相同的功能铃在,甚至在另一個(gè)對(duì)象的基礎(chǔ)上新增了更多的屬性和方法供汛,即二者是“is-a”(是一個(gè)) 或者 “is-like-a”(像一個(gè))的關(guān)系,例如三角形繼承自幾何圖形涌穆,三角形是幾何圖形怔昨,但是三角形還有穩(wěn)定性等更多特性。
下圖是二者的UML圖表示宿稀,特別關(guān)注一下兩種關(guān)系“箭頭”的形式趁舀。
繼承體系中,被繼承的類(如幾何圖形)我們稱為基類祝沸,繼承后的類(如三角形)我們稱為導(dǎo)出類矮烹。導(dǎo)出類會(huì)繼承基類的所有成員,包括private屬性的(即使不能訪問)罩锐。
3.多態(tài)
對(duì)于多態(tài)的理解奉狈,核心是理解前期綁定和后期綁定。非面向?qū)ο缶幊痰木幾g器產(chǎn)生的函數(shù)調(diào)用就是前期綁定涩惑,在函數(shù)調(diào)用處會(huì)產(chǎn)生一個(gè)具體的函數(shù)名字仁期,然后在運(yùn)行時(shí)將這個(gè)調(diào)用解析到將要執(zhí)行的代碼的絕對(duì)地址,所以對(duì)于非面向?qū)ο缶幊蹋裁吹胤秸{(diào)用哪個(gè)函數(shù)在編譯期已經(jīng)確定了跛蛋。面向?qū)ο缶幊逃玫氖呛笃诮壎ò镜模幾g器只確保被調(diào)用的方法存在,并對(duì)調(diào)用參數(shù)和返回值執(zhí)行類型檢查(無法提供此類檢查的語言為弱類型語言)赊级,但并不知道將要執(zhí)行的確切代碼押框。
在某些面向?qū)ο笳Z言中,方法采用后期綁定不是默認(rèn)行為理逊,例如 C++ 需要使用 virtual 關(guān)鍵字來實(shí)現(xiàn)橡伞,Java 后期綁定是默認(rèn)行為,不需要添加額外的關(guān)鍵字晋被。
4.單根繼承結(jié)構(gòu)
Java中所有的類最終都繼承自單一的基類 Object骑歹。
單根繼承的優(yōu)點(diǎn):保證所有對(duì)象都具備某些功能,比如所有對(duì)象都可以很容易的在堆上創(chuàng)建墨微;垃圾回收簡單道媚;所有對(duì)象都具有類型信息,給很多系統(tǒng)級(jí)操作(如異常處理)帶來更大的靈活性翘县。
5.對(duì)象的生命周期
對(duì)象創(chuàng)建:C++創(chuàng)建對(duì)象時(shí)分配內(nèi)存比較靈活最域,可以在堆棧(stack)和堆(heap)上進(jìn)行,在堆棧上分配和釋放內(nèi)存由編譯器自動(dòng)進(jìn)行锈麸,在堆上分配和釋放內(nèi)存需要程序員手動(dòng)維護(hù)镀脂,稍有不慎就會(huì)出現(xiàn)內(nèi)存泄露。Java分配內(nèi)存完全在堆上進(jìn)行忘伞,采用動(dòng)態(tài)內(nèi)存分配方式薄翅,回收通過垃圾回收器完成,不需要程序員關(guān)注氓奈。
Java在堆上分配內(nèi)存還是很高效的翘魄,這個(gè)堆是Java虛擬機(jī)綜合考慮內(nèi)存分配和內(nèi)存回收進(jìn)行了特殊的設(shè)計(jì)。
特例:Java的基本類型(boolean舀奶、char暑竟、byte、short育勺、int但荤、long、float涧至、double 和 void)存儲(chǔ)在堆棧中腹躁。基本類型都有對(duì)應(yīng)的包裝類(如 Boolean南蓬、Long 等)纺非,可以在堆中創(chuàng)建一個(gè)非基本對(duì)象哑了。
初始化:對(duì)于未初始化的變量,很多C++編譯器都是警告铐炫,而Java則視為錯(cuò)誤垒手。
6.方法蒜焊、參數(shù)和返回值
方法名和參數(shù)列表(二者合稱“方法簽名”)唯一地標(biāo)識(shí)出某個(gè)方法倒信。
參數(shù)傳遞:Java任何傳遞對(duì)象的場景,實(shí)際傳遞的都是引用泳梆。
三鳖悠、操作符
Java的操作符和其他語言沒有太大區(qū)別,我只總結(jié)了幾個(gè)不一樣的地方优妙。
Java的基本類型比較使用 == 或者 !=乘综,對(duì)象使用 == 或者 != 比較的是引用。如果想要比較對(duì)象實(shí)際內(nèi)容是否相等套硼,要用? equals()卡辰,但是 equals() 默認(rèn)比較的仍然是引用,如果要比較真實(shí)的成員是否相等邪意,需要覆蓋 equals() 方法九妈。
在 char、byte 和 short 中雾鬼,使用算術(shù)操作符后會(huì)發(fā)生數(shù)據(jù)類型提升萌朱,變成一個(gè) int 類型結(jié)果,需要顯式轉(zhuǎn)化會(huì)原來的類型(窄化轉(zhuǎn)化可能造成信息丟失)策菜。
四晶疼、總結(jié)
上面第二節(jié)和第三節(jié)主要涵蓋了《Java編程思想》的1~4章,感覺都是一些Java語言最基礎(chǔ)的東西又憨,對(duì)于一些比較高深的東西作者也只是拋磚引玉翠霍,并沒有深入去講,我在讀這塊兒內(nèi)容時(shí)也是快速過了一遍蠢莺。
最后壶运,給大家推薦一個(gè)在線畫 UML 圖的寶藏網(wǎng)址,也可以畫思維導(dǎo)圖以及流程圖等浪秘,功能很強(qiáng)大蒋情,很多程序員都在用。上面的幾張圖都是通過它生成的:https://gitmind.com