一皂甘,八種基本數(shù)據(jù)類型
二廓握,方法
方法就是具有特定功能的代碼塊伴鳖,增加代碼的復(fù)用性鸿市,減少代碼冗余
方法重載(overloading method)
在類中可以創(chuàng)建多個(gè)方法锯梁,它們具有相同的名字,但具有不同的參數(shù)和不同的定義焰情;返回值不能作為重載的條件陌凳。
如:
public void method(int a){}
public void method(char c){}
三,數(shù)組
1. 數(shù)組是一種線性數(shù)據(jù)存儲(chǔ)的結(jié)構(gòu)内舟,具有存取效率高合敦,內(nèi)存空間連續(xù)的特點(diǎn),數(shù)組必須具有固定長度验游,是最常用的數(shù)據(jù)結(jié)構(gòu)之一充岛。
2. 數(shù)組內(nèi)存結(jié)構(gòu)分析:數(shù)組是引用類型,會(huì)存放在堆內(nèi)存中耕蝉。
棧:大小固定崔梗,存儲(chǔ)局部,臨時(shí)變量(即基本數(shù)據(jù)類型)垒在,和引用變量的地址
堆:大小不固定蒜魄,存儲(chǔ)真實(shí)數(shù)據(jù)
3. 冒泡排序
一組數(shù)列,第一個(gè)和第二個(gè)比較,如果第一個(gè)比第二個(gè)大就交換位置权悟,第二個(gè)和第三個(gè)比較砸王,第二個(gè)比第三個(gè)大就交換,以此類推峦阁。相同元素的前后順序并沒有改變谦铃,所以冒泡排序是一種穩(wěn)定排序算法
心法:N個(gè)數(shù)字來排隊(duì),兩兩相比小靠前榔昔;外層循環(huán)N-1,內(nèi)層循環(huán)N-1-i
3. 選擇排序
每一趟從待排序的數(shù)據(jù)元素中選出最芯匀颉(或最大)的一個(gè)元素,順序放在已排好順序的數(shù)列的最后撒会,直到全部待排序的數(shù)據(jù)元素排完嘹朗。選擇排序是不穩(wěn)定的排序方法
選擇算法是必記的基礎(chǔ)算法,數(shù)據(jù)規(guī)模越小越好诵肛,好處是不占用額外的內(nèi)存空間
4.?直接插入排序算法
?基本思想:每步將一個(gè)待排序的記錄屹培,按其順序碼大小插入到前面已經(jīng)排序的子序列的合適位置。(從后往前找到合適位置后)怔檩,直到全部插入排序完為止褪秀。
四,面向?qū)ο?/h4>
面向過程:一步一步的完成某一個(gè)具體事情
面向?qū)ο螅和ㄟ^調(diào)度組合不同的對象來完成某一件事
1. 什么是面向?qū)ο?/b>
1). 面向?qū)ο笫且环N編程思想
2). 面向?qū)ο笫且环N思考問題的思維方式
2. 建立面向?qū)ο蟮乃季S方式
1). 先整體薛训,再局部
2). 先抽象媒吗,再具體
3). 能做什么,再怎么做
3. 如何學(xué)習(xí)面向?qū)ο?/b>
1). 掌握一門面向?qū)ο笳Z言的語法
2). 熟悉面向?qū)ο蟮脑O(shè)計(jì)規(guī)則
3). 熟悉面向?qū)ο蟮脑O(shè)計(jì)模式
4. 類與對象
什么是類乙埃?
1). 類是:分類闸英,類別
2). 通過分類:我們可以區(qū)分不同的事物種類,在日常生活中介袜,我們常常這樣做甫何,所以,類是一組具有相同特性(屬性)與行為(方法)的事物集合
5. 類與對象的關(guān)系
1). 類表示一個(gè)共性的產(chǎn)物米酬,是一個(gè)綜合特征沛豌,而對象,是一個(gè)個(gè)性的產(chǎn)物赃额,是一個(gè)個(gè)體的特征
2). 類由屬性和方法組成
? ? * 屬性:就相當(dāng)于一個(gè)個(gè)的特征
? ? * 方法:就相當(dāng)于一個(gè)個(gè)的行為:例如:說話加派,吃飯,唱歌跳芳,睡覺
6. 類與對象小結(jié)
1). new關(guān)鍵字芍锦,表示向內(nèi)存申請空間,也表示實(shí)例化一個(gè)對象飞盆,創(chuàng)建一個(gè)對象
2). 一個(gè)對象在內(nèi)存中的大小娄琉,由該對象的所有屬性所占的內(nèi)存大小的總和(引用類型變量在32位系統(tǒng)上占4個(gè)字節(jié)次乓,在64位系統(tǒng)上占8個(gè)字節(jié)),加上額外的對象隱性數(shù)據(jù)所占的大小
3). 相同的類型才可以賦值
4). 不同的引用孽水,指向同一個(gè)對象票腰,任何一個(gè)引用改變對象的值,其他引用都會(huì)反映出來
5). 編程時(shí)要注意的問題女气,在確定不使用對象時(shí)杏慰,要盡早釋放對象:引用=null
6). 當(dāng)一個(gè)堆中的對象沒有被任何引用變量所指向時(shí),該對象會(huì)被JVM的GC程序認(rèn)為是垃圾對象炼鞠,從而被回收
7. 封裝性
* 封裝性是面向?qū)ο笕筇匦灾辉道模庋b的本質(zhì)是隱藏細(xì)節(jié),僅對外提供統(tǒng)一訪問接口谒主,一個(gè)個(gè)封裝的東西又組成了另一個(gè)東西.
8.? 封裝屬性的類
private關(guān)鍵字:訪問權(quán)限操作符朝扼,public表示公有的,private表示私有的屬性和方法霎肯,只能在本類中訪問擎颖。
公有的屬性和方法,可以被類外部的其他類訪問姿现,想要在類外部訪問私有屬性肠仪,我們需要提供公有的方法來間接訪問。通常在一個(gè)類中备典,屬性都私有化,并對外提供getter and getter方法
9.? 成員變量和局部變量
1). 在類中的位置不同
*? 成員變量:在類中定義
*? 局部變量:在方法中定義或者方法的參數(shù)
2). 在內(nèi)存中的位置不同
*? 成員變量:在堆內(nèi)存(成員變量屬于對象意述,對象進(jìn)堆內(nèi)存)
*? 局部變量:在棧內(nèi)存(局部變量屬于方法提佣,方法進(jìn)棧內(nèi)存)
3). 生命周期不同
*? 成員變量:隨著對象的創(chuàng)建而存在,隨著對象的銷毀而消失
*? 局部變量:隨著方法的調(diào)用而存在荤崇,隨著方法的調(diào)用完畢而消失
4). 初始化值不同
*? 成員變量:有默認(rèn)初始化值拌屏,引用類型默認(rèn)為null
*? 局部變量:沒有默認(rèn)初始化值,必須定義賦值术荤,然后才能使用
注意:
*? 局部變量名稱可以和成員變量名稱一樣倚喂,在方法中使用的時(shí)候,采用的是就近原則
總結(jié):成員變量屬于類瓣戚,局部變量在方法
10. 構(gòu)造方法
構(gòu)造方法是在類中定義的端圈,構(gòu)造方法的定義格式:方法名稱與類名相同,無返回值類型的聲明
1). 構(gòu)造方法就是類構(gòu)造對象時(shí)調(diào)用的方法子库,用于對象的初始化工作
2). 構(gòu)造方法是實(shí)例化一個(gè)類的對象時(shí)舱权,也就是new的時(shí)候,最先調(diào)用的方法
* 構(gòu)造方法小結(jié):
1). 構(gòu)造方法名稱與類名相同仑嗅,沒有返回值聲明(包括void)
2). 構(gòu)造方法用于初始化數(shù)據(jù)(屬性)
3). 每一個(gè)類中都會(huì)有一個(gè)默認(rèn)的無參的構(gòu)造方法
4). 如果類中有顯示的構(gòu)造方法宴倍,那么默認(rèn)的構(gòu)造方法將無效
5). 如果類中有顯示的構(gòu)造方法张症,還想保留默認(rèn)構(gòu)造方法,需要顯示的寫出來
6). 構(gòu)造方法可以有多個(gè)鸵贬,但參數(shù)不一樣俗他,稱為構(gòu)造方法的重載
7). 在構(gòu)造方法中調(diào)用另一個(gè)構(gòu)造方法,使用this(...)阔逼,該句代碼必須在第一句
8). 構(gòu)造方法之間的調(diào)用兆衅,必須要有出口(否則會(huì)死循環(huán))
9). 給對象初始化數(shù)據(jù)可以使用構(gòu)造方法或setter方法,通常情況下颜价,兩者都會(huì)保留
10). 一個(gè)好的編程習(xí)慣時(shí)保留默認(rèn)的構(gòu)造方法涯保。(為了方便一些框架代碼使用反射來創(chuàng)造對象)
11). private Dog(){}, 構(gòu)造方法私有化,當(dāng)我們的需求時(shí)為了保證該類只有一個(gè)對象時(shí)周伦。(不能new)
什么時(shí)候一個(gè)類只需要一個(gè)對象夕春?比如:工具類(沒有屬性的類,只有行為)并且該工具類對象被頻繁使用专挪。權(quán)衡只用一個(gè)對象與產(chǎn)生多個(gè)對象的內(nèi)存使用及志,來確定該類是否要定義為只需要一個(gè)對象。
11. this關(guān)鍵字
1). 調(diào)用類中的屬性
2). 調(diào)用類中的方法或構(gòu)造方法
3). 表示當(dāng)前對象:在方法被調(diào)用的過程中 寨腔,哪個(gè)對象調(diào)用了方法速侈,在方法內(nèi)中的this就代表哪個(gè)對象
12. 對象的一對一關(guān)系
* 雙向一對一
* 單向一對一
* 表達(dá)對象的一對一關(guān)系,其實(shí)就是把對象類型作為屬性定義
*?對象內(nèi)存分析
在開發(fā)中迫卢,定義靜態(tài)數(shù)據(jù)需要充分考慮數(shù)據(jù)的生命周期倚搬,如果靜態(tài)數(shù)據(jù)太多,必然會(huì)占用更多的內(nèi)存空間
13. static關(guān)鍵字
1). 使用static關(guān)鍵字修飾一個(gè)屬性
聲明為static的變量實(shí)質(zhì)上就是全局變量
2). 使用static關(guān)鍵字修飾一個(gè)方法
通常乾蛤,在一個(gè)類中定義一個(gè)方法為static, 那就是說無需類的對象即可調(diào)用該方法每界。
聲明static的方法有一下幾條限制
* 它們僅能調(diào)用其他的static方法
* 它們只能訪問static數(shù)據(jù)
* 它們不能以任何方式引用this或super
3). 使用static修飾一個(gè)類(內(nèi)部類)
什么時(shí)候使用static?
所有對象共同的屬性或方法,那么我們可以定義為靜態(tài)的
static作用大家卖,內(nèi)存只有獨(dú)一份眨层,同類對象都共享,三種用法各不同上荡,謹(jǐn)記靜態(tài)初始化趴樱,它與對象創(chuàng)建沒關(guān)系。
14. 靜態(tài)(static)
1). 靜態(tài)變量或方法不屬于對象酪捡,依賴類
2). 靜態(tài)變量是全局變量叁征,生命周期從類被加載后一直到程序結(jié)束
3). 靜態(tài)變量只存一份,在靜態(tài)方法區(qū)中存儲(chǔ)
4). 靜態(tài)變量是本類所有對象共享一份
5). 建議不要使用對象名去調(diào)用靜態(tài)數(shù)據(jù)沛善,建議使用類名調(diào)用
6). static修飾一個(gè)方法航揉,那么該方法屬于類,不屬于對象金刁,直接用類名調(diào)用
7). 靜態(tài)方法不能訪問非靜態(tài)的屬性和方法帅涂,只能訪問靜態(tài)的
15. 代碼塊
1). 普通代碼塊:在方法中寫的代碼塊
2). 構(gòu)造代碼塊:在類中定義的代碼塊议薪,在創(chuàng)建對象時(shí)被調(diào)用,優(yōu)于構(gòu)造方法執(zhí)行(一般用的不多)
3). 靜態(tài)代碼塊:在類中使用static聲明的代碼塊稱為靜態(tài)代碼塊
* 在第一次使用的時(shí)候被調(diào)用(創(chuàng)建對象)媳友,只會(huì)執(zhí)行一次斯议,優(yōu)于構(gòu)造塊執(zhí)行
* 我們在項(xiàng)目開發(fā)中通常會(huì)使用靜態(tài)代碼塊來初始化只調(diào)用一次的數(shù)據(jù),比如說程序一啟動(dòng)就想將配置信息取出來醇锚,放在內(nèi)存中
4). 同步代碼塊(多線程)
* 小結(jié):項(xiàng)目中重點(diǎn)會(huì)使用的是靜態(tài)代碼塊>普通代碼塊>同步代碼塊>構(gòu)造代碼塊
理解代碼塊的作用以及初始化的過程哼御,注意,靜態(tài)代碼塊可在未來開發(fā)中焊唬,用來作啟動(dòng)項(xiàng)目時(shí)需要初始化數(shù)據(jù)的工作
16.?單例模式
單例設(shè)計(jì)模式:保證一個(gè)類僅有一個(gè)實(shí)例恋昼,并提供一個(gè)訪問它的全局訪問點(diǎn)
1). 構(gòu)造方法私有化
2). 聲明一個(gè)本類對象
3). 給外部提供一個(gè)靜態(tài)方法獲取對象實(shí)例
* 兩種實(shí)現(xiàn)方法
1). 餓漢式:在類被加載后,對象被創(chuàng)建赶促,到程序結(jié)束后釋放液肌。占用內(nèi)存的時(shí)間長,提高效率鸥滨。
2). 懶漢式:在第一次調(diào)用getInstance方法時(shí)蒋纬,對象被創(chuàng)建昔驱,到程序結(jié)束后釋放。占用內(nèi)存的時(shí)間短泼舱,效率低宪睹。多線程訪問會(huì)有安全問題
在項(xiàng)目中為什么要使用單例厉萝,單例有什么好處鸥拧?
* 1). 在設(shè)計(jì)一些工具類的時(shí)候(通常工具類茉稠,只有功能方法,沒有屬性)
* 2). 工具類可能會(huì)頻繁調(diào)用
目的是為了節(jié)省重復(fù)創(chuàng)建對象所帶來的內(nèi)存消耗卿吐,從而提供效率
能不能使用構(gòu)造方法私有化+靜態(tài)方法來替代單例约郁?
* 從內(nèi)存上看:私有單例會(huì)有個(gè)入棧的過程,構(gòu)造方法私有化+靜態(tài)方法是程序一開始就加載到內(nèi)存里
17. 對象數(shù)組
對象數(shù)組就是數(shù)組里的每個(gè)元素都是類的對象賦值時(shí)先定義對象但两,然后將對象直接賦值給數(shù)組
* 動(dòng)態(tài)數(shù)組
* 1). 數(shù)組是一種線性數(shù)據(jù)結(jié)構(gòu)
* 2). 數(shù)組不適合做刪除插入等操作,適合添加供置,查找谨湘,遍歷
18. 繼承
繼承:從已有的類創(chuàng)建新類的過程
1). 繼承是面向?qū)ο笕筇卣髦?/p>
2). 被繼承的類稱為父類(超類),繼承父類的類稱為子類(派生類)
3). 繼承是指一個(gè)對象直接使用另一個(gè)對象的屬性和方法
4). 通過繼承可以實(shí)現(xiàn)代碼重用
繼承無處不再芥丧,繼承不僅是代碼復(fù)用紧阔,精髓之處在于抽象思維編寫代碼,以達(dá)到程序更強(qiáng)的可擴(kuò)展性
* 繼承一個(gè)父類续担,只能繼承非私有的數(shù)據(jù)(屬性和方法)
* protected:訪問權(quán)限修飾符擅耽,在繼承關(guān)系中使用,在父類中使用protected修飾的屬性或方法可以被子類繼承
繼承的限制約定:
1). Java只能實(shí)現(xiàn)單繼承物遇,也就是一個(gè)類只能有一個(gè)父類
2). 允許多層繼承乖仇,即:一個(gè)子類可以有一個(gè)父類憾儒,一個(gè)父類還可以有其他的父類
3). 繼承只能繼承非私有的屬性和方法
4). 構(gòu)造函數(shù)不能被繼承
創(chuàng)建子類對象時(shí),父類的構(gòu)造方法也會(huì)被調(diào)用乃沙。為什么起趾?
* 因?yàn)樽宇愐褂酶割惖臄?shù)據(jù),那么就要通過父類的構(gòu)造方法來初始化數(shù)據(jù)
繼承小結(jié):
1). 繼承是發(fā)生在多個(gè)類之間
2). 繼承使用關(guān)鍵字extends
3). JAVA只能單繼承警儒,允許多繼承
4). 被繼承的類叫父類(超類)训裆,繼承父類的類叫子類(派生類)
5). 在父類中的非私有屬性和方法可以被子類繼承
6). protected(受保護(hù)的訪問權(quán)限修飾符),修飾的屬性或方法可以被子類繼承
7). 構(gòu)造方法不能被繼承
8). 創(chuàng)建對象會(huì)調(diào)用構(gòu)造方法蜀铲,調(diào)用構(gòu)造方法不一定就是創(chuàng)建對象
9). 實(shí)例化子類對象边琉,會(huì)先調(diào)用父類的構(gòu)造方法,如果父類中沒有默認(rèn)的構(gòu)造方法记劝,那么子類必須顯示的通過super(...)來調(diào)用父類的帶參構(gòu)造方法变姨,super也只能在子類構(gòu)造方法中的第一句。
* 繼承的好處
* 1). 提高代碼的復(fù)用性
* 2). 提高代碼的維護(hù)性
* 3). 讓類與類之間產(chǎn)生關(guān)系隆夯,是多態(tài)的前提
* 繼承的缺點(diǎn)
* 1). 增強(qiáng)了類與類之間的耦合性
子類的實(shí)例化過程:
* 子類實(shí)例化時(shí)先調(diào)用父類的構(gòu)造方法
* 如果父類中沒有默認(rèn)的構(gòu)造方法钳恕,在子類的構(gòu)造方法中必須顯示的調(diào)用父類的構(gòu)造方法
* 結(jié)論:
* 構(gòu)造方法只是用于初始化類中的字段以及執(zhí)行一些初始化代碼
* 調(diào)用構(gòu)造方法并不代表生成對象
19. 方法的重寫
在Java中,子類可繼承父類中的方法蹄衷,而不需要重新編寫相同的方法忧额,但有時(shí)子類并不想原封不動(dòng)地繼承父類的方法,而是想做一定的修改愧口,這就需要采用方法的重寫睦番,方法重寫又稱方法覆蓋。
在子類和父類中耍属,重寫方法后托嚣,在調(diào)用時(shí),以創(chuàng)建的對象類型為準(zhǔn)厚骗,會(huì)調(diào)用誰的方法示启。
* 關(guān)于方法重寫的一些特性
* 1). 發(fā)生在子父類中,方法重寫的兩個(gè)方法返回值领舰,方法名夫嗓,參數(shù)列表必須完全一致(子類重寫父類的方法)
* 2). 子類拋出的異常不能超過父類相應(yīng)方法排除的異常(子類異常不能大于父類異常)
* 3). 子類方法的訪問級別不能低于父類相應(yīng)方法的訪問級別(public protected private)
* 4). 父類中的方法若使用private, static, final任意修飾符修飾,那么冲秽,不能被子類重寫
* 為什么要重寫方法舍咖?或者方法重寫的目的是什么?
* 1). 若子類從父類中繼承過來的方法锉桑,不能滿足子類特有的需求時(shí)排霉,子類就需要重寫父類中相應(yīng)的方法。
* 2). 方法的重寫也是程序擴(kuò)展的體現(xiàn)民轴。
面試題:overloading與overriding的區(qū)別攻柠?
* overloading: 方法的重載球订,發(fā)生在同一個(gè)類中,方法名相同辙诞,參數(shù)列表不同辙售,返回值無關(guān)
* overriding: 方法的重寫,發(fā)生在子父類中飞涂,方法名相同旦部,參數(shù)列表相同,返回值相同较店。子類的訪問修飾符要大于或等于父類的訪問修飾符士八。子類的異常聲明必須小于或等于父類的異常聲明。如果方法被private, static, final修飾梁呈,那么不能被重寫婚度。
20. super
super可以完成以下的操作
1). 使用super調(diào)用父類中的屬性,可以從父類實(shí)例處獲得信息
2). 使用super調(diào)用父類中的方法官卡,可以委托父類對象幫助完成某件事情
3). 使用super調(diào)用父類中的構(gòu)造方法(super(實(shí)參列表))蝗茁,必須在子類構(gòu)造方法的第一條語句, 調(diào)用父類中相應(yīng)的構(gòu)造方法寻咒,若不顯示的寫出來哮翘,默認(rèn)調(diào)用父類的無參構(gòu)造方法,比如:super()
* this與super的區(qū)別
* this表示當(dāng)前對象
* 使用super來調(diào)用父類的屬性毛秘,方法和構(gòu)造方法
21.?final關(guān)鍵字
使用final關(guān)鍵字完成以下的操作:
1). 使用final關(guān)鍵字聲明一個(gè)常量饭寺,常量的命名規(guī)則建議使用全大寫。修飾屬性或者修飾局部變量(最終變量)叫挟,也稱為常量艰匙。
2). 使用final關(guān)鍵字聲明一個(gè)方法
該方法為最終方法,且只能被子類繼承抹恳,但是不能被子類重寫员凝。
3). 使用final關(guān)鍵字聲明一個(gè)類
該類就轉(zhuǎn)變?yōu)樽罱K類,沒有子類的類奋献,final修飾的類無法繼承绊序。
4). 在方法參數(shù)中使用final,在該方法內(nèi)部不能修改參數(shù)的值(在內(nèi)部類中詳解)
* 常用類(工具類):在實(shí)際項(xiàng)目開發(fā)中秽荞,常量類通常用于定義項(xiàng)目中一些公共的,不變的抚官。
22. 抽象類
定義一個(gè)抽象類
* 抽象類:abstract關(guān)鍵字聲明的類稱為抽象類
類與抽象類:
* 很多具有相同特征和行為的對象可以抽象為一個(gè)類
* 很多具有相同特征和行為的類可以抽象為一個(gè)抽象類
抽象類的特點(diǎn):
1). 抽象類可以沒有抽象方法扬跋,又抽象方法的類必須是抽象類
2). 非抽象類繼承抽象類必須實(shí)現(xiàn)所有抽象方法
3). 抽象類可以繼承抽象類,可以不實(shí)現(xiàn)父類抽象方法
4). 抽象類可以有方法實(shí)現(xiàn)和屬性
5). 抽象類不能被實(shí)例化
6). 抽象類不能聲明為final
7). 抽象類可以有構(gòu)造方法
23. 接口
1). 接口是標(biāo)準(zhǔn)的規(guī)范:比如合同凌节,法律钦听,校規(guī)等
2). 接口的定義格式:
????interface 接口名稱{
????? ? ? 全局常量;
? ????? ? 抽象方法;
????}
3). 接口的使用原則:
* 1. 定義一個(gè)接口洒试,使用interface關(guān)鍵字
* 2. 在一個(gè)接口中,只能定義常量朴上,抽象方法垒棋,JDK1.8可以定義默認(rèn)的實(shí)現(xiàn)方法
* 3. 接口可以繼承多個(gè)接口:extends xxxx,xxxx
* 4. 一個(gè)具體類實(shí)現(xiàn)接口使用implements關(guān)鍵字
* 5. 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口
* 6. 抽象類實(shí)現(xiàn)接口可以不實(shí)現(xiàn)接口的方法
* 7. 在接口中定義的方法沒有聲明訪問修飾符,默認(rèn)為public
* 8. 接口不能有構(gòu)造方法
* 9. 接口不能被實(shí)例化
*?10. 實(shí)現(xiàn)接口的類痪宰,可以實(shí)現(xiàn)多個(gè)接口叼架,具體類實(shí)現(xiàn)接口,必須實(shí)現(xiàn)接口給的所有方法
24. 多態(tài)
多態(tài)是面向?qū)ο笕筇匦灾?/p>
* 什么是多態(tài)性衣撬?
* 對象在運(yùn)行過程中的多種形態(tài)
多態(tài)我們大概可以分為兩類
1). 方法的重載和重寫
2). 對象的多態(tài)性
* 例如:
* 用父類的引用指向子類對象(用大的類型去接受小的類型乖订,向上轉(zhuǎn)型,自動(dòng)轉(zhuǎn)換)
* 結(jié)論:在編程時(shí)針對抽象類型的編寫代碼具练,稱為面向?qū)ο缶幊蹋ɑ蛎嫦蚪涌诰幊蹋?/p>
* 父類通常都定義為抽象類乍构,接口
對象的多態(tài)性:對象多態(tài)性是從繼承關(guān)系中的多個(gè)類而來
1). 向上轉(zhuǎn)型:將子類實(shí)例轉(zhuǎn)為父類引用
* 格式:父類 父類對象 = 子類實(shí)例;? (自動(dòng)轉(zhuǎn)換)
以基本數(shù)據(jù)類型操作為例:int i = 'a'; (因?yàn)閏har的容量比int小,所以可以自動(dòng)完成)
2). 向下轉(zhuǎn)型:將父類實(shí)例轉(zhuǎn)為子類實(shí)例
* 格式:子類 子類對象 = (子類)父類實(shí)例; (強(qiáng)制轉(zhuǎn)換)
?以基本數(shù)據(jù)類型操作為例:char c = (char)97; (因?yàn)檎褪?個(gè)字節(jié)扛点,比char2個(gè)字節(jié)要大哥遮,所以需要強(qiáng)制完成)
多態(tài)性小結(jié):
1). 方法的重載與重寫就是方法的多態(tài)性的表現(xiàn)
2). 多個(gè)子類就是父類中的多種形態(tài)
3). 父類引用可以指向子類對象,自動(dòng)轉(zhuǎn)換
4). 子類對象指向父類引用需要強(qiáng)制轉(zhuǎn)換(注意:類型不對會(huì)報(bào)異常)
5). 在實(shí)際開發(fā)中盡量使用父類引用(更利于擴(kuò)展)
* 多態(tài)時(shí)面向?qū)ο笕筇匦灾涣昃浚敲嫦驅(qū)ο缶幊趟季S的精髓所在眠饮,用抽象的思維寫代碼。在運(yùn)行過程中再傳入具體的對象畔乙,同面向接口編程如出一轍君仆。
25.?instanceof
instanceof 是用于檢查對象是否為指定的類型,通常把父類引用強(qiáng)制轉(zhuǎn)換為子類引用時(shí)要使用牲距,以避免發(fā)生類型轉(zhuǎn)換異常(ClassCastException)
* 語法格式如下:
對象 instanceof 類型? //返回boolean類型值
該語句一般用于判斷一個(gè)對象是否為某個(gè)類的實(shí)例返咱,是返回 true, 否返回false
* 父類的設(shè)計(jì)法則
通過instanceof關(guān)鍵字,我們可以很方便的檢查對象的類型牍鞠,但如果一個(gè)父類的子類過多咖摹,這樣的判斷還是顯得很繁瑣,那么如何去設(shè)計(jì)一個(gè)父類呢难述?
* 1). 通常情況下萤晴,父類都設(shè)計(jì)為抽象類或接口類,其中優(yōu)先考慮接口胁后,如接口不能滿足才考慮抽象類
* 2). (推薦)一個(gè)具體的類盡可能不去繼承另一個(gè)具體類店读,這樣的好處是無需檢查對象是否為父類的對象
* 模板方法模式(Template Method):定義一個(gè)操作中的算法的骨架,而將一些可變部分的實(shí)現(xiàn)延遲到子類中攀芯。
模板方法模式使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可以重新定義該算法的某些特定的步驟
26. 策略模式(Strategy Pattern)
定義了一系列算法屯断,將每一種算法封裝起來并可以互相替換使用。 策略模式讓算法獨(dú)立于使用它的客戶應(yīng)用,而獨(dú)立變化殖演。
把可變的行為抽象出來氧秘,這樣的好處是這些行為可以在真正使用時(shí)相互替換。策略模式是非常常用的趴久,一個(gè)接口有多個(gè)實(shí)現(xiàn)丸相,不同的實(shí)現(xiàn)獨(dú)立封裝,可以按運(yùn)行時(shí)需求相互替換彼棍,可維護(hù)性就強(qiáng)了灭忠,新增接口也不會(huì)影響其他實(shí)現(xiàn)其他類。
27. Object類
Object類是類層次結(jié)構(gòu)的根類滥酥,每個(gè)類都使用Object作為超類更舞,所有對象(包括數(shù)組)都實(shí)現(xiàn)這個(gè)類的方法。所有類都是Object類的子類坎吻。
*例如
*1). public String toString()方法:返回該對象的字符串表示
通常缆蝉,toString方法返回一個(gè)“以文本方式表示”此對象的字符串,結(jié)果應(yīng)是一個(gè)簡明易于讀懂的信息表法式(建議所有子類都重寫此方法)瘦真。
*2). public boolean equals(Objec obj)
指示其他某個(gè)對象是否與此對象“相等”刊头,equals方法在非空對象引用上實(shí)現(xiàn)相等關(guān)系。
*3). protected void finalize() throws Throwable
當(dāng)垃圾回收器確定不存在對該對象的更多引用時(shí)诸尽,由對象的垃圾回收器調(diào)用此方法原杂,子類重寫finalize方法,以配置系統(tǒng)資源或執(zhí)行其他清除您机。
*4). public final class <?> getClass()
返回此Object的運(yùn)行時(shí)類
28. 幾種設(shè)計(jì)模式
1. 簡單工廠模式
簡單工廠模式是由一個(gè)工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例穿肄。簡單工廠模式時(shí)工廠模式家族中最簡單實(shí)用的模式。
2. 代理模式(Proxy):為其他對象提供一種代理以控制對這個(gè)對象的訪問际看。代理模式說白了就是“真實(shí)對象”的代表咸产,在訪問對象時(shí)引入一定程度的間接性
* 因?yàn)檫@種間接性可以附加多種用途。比如說代購仲闽,律師脑溢,中介
3. 適配器模式(Adapter):將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口。
* 適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作
適配器模式的另一種用法:
* 具體類在實(shí)現(xiàn)接口的時(shí)候赖欣,需要把所有的方法都實(shí)現(xiàn)屑彻,
* 可以建立一個(gè)適配器類,實(shí)現(xiàn)接口中的方法顶吮,空方法體社牲,具體類再繼承這個(gè)方法,需要實(shí)現(xiàn)哪個(gè)方法都可以
29. 內(nèi)部類
內(nèi)部類就是在一個(gè)類的內(nèi)部定義的類
1). 成員內(nèi)部類:直接在類中定義的類(成員)
成員內(nèi)部類格式如下:
* class Outer{
*? class inner{}
* }
編譯上述代碼會(huì)產(chǎn)生兩個(gè)文件: Outer.class和Outer$Inner.class
在外部創(chuàng)建內(nèi)部類對象
內(nèi)部類除了可以在外部類中實(shí)現(xiàn)實(shí)例化對象悴了,也可以在外部類的外部來實(shí)例化膳沽。那么汗菜,根據(jù)內(nèi)部類產(chǎn)生的“.class”文件,Outer.class挑社, "$"符號(hào)在程序運(yùn)行時(shí)將替換成".",所以內(nèi)部類的訪問巡揍,通過“外部類.內(nèi)部類”的形式表示痛阻。
2). 方法內(nèi)部類:在一個(gè)類中的方法中定義的類(局部)
內(nèi)部類可以作為一個(gè)類的成員外,還可以把類放在方法內(nèi)定義腮敌。
注意:
* 1. 方法內(nèi)部類只能定義在該內(nèi)部類的方法內(nèi)實(shí)例化阱当,不可以在此方法外對其實(shí)例化
* 2. 方法內(nèi)部類對象不能使用該內(nèi)部類所在方法的非final局部變量
3). 靜態(tài)內(nèi)部類(成員)
* 在一個(gè)類內(nèi)部定義一個(gè)靜態(tài)內(nèi)部類:
* 靜態(tài)的含義是該內(nèi)部類可以像其他靜態(tài)成員一樣,沒有外部類對象時(shí)糜工,也能夠訪問它弊添。
* 靜態(tài)嵌套類僅能訪問外部類的靜態(tài)成員和方法
4). 匿名內(nèi)部類(局部)
匿名內(nèi)部類就是沒有名字的內(nèi)部類,匿名內(nèi)部類有三種情況
* 1). 繼承式的匿名內(nèi)部類
* 2). 接口式的匿名內(nèi)部類
* 3). 參數(shù)式的匿名內(nèi)部類
在使用匿名內(nèi)部類時(shí)捌木,要記住以下幾個(gè)原則
* 1). 不能有構(gòu)造方法油坝,只能有一個(gè)實(shí)例
* 2). 不能定義任何靜態(tài)成員,靜態(tài)方法
* 3). 不能時(shí)public, protected, private,static
* 4). 一定是在new的后面刨裆,用其隱含實(shí)現(xiàn)一個(gè)接口或?qū)崿F(xiàn)一個(gè)類
* 5). 匿名內(nèi)部類為局部的澈圈,所以內(nèi)部類的所有限制都對其生效
問題:局部內(nèi)部類訪問局部變量必須用final修飾,為什么帆啃?
* 當(dāng)調(diào)用這個(gè)方法時(shí)瞬女,局部變量如果沒有用final修飾,他的生命周期和方法的生命周期是一樣的努潘,當(dāng)方法被調(diào)用時(shí)會(huì)入棧诽偷,方法結(jié)束后即彈棧,這個(gè)局部變量也會(huì)消失疯坤,那么如果局部內(nèi)部類對象還沒有馬上消失报慕,想用這個(gè)局部變量,顯然已無法使用了贴膘。如果用final修飾卖子,會(huì)在類加載的時(shí)候進(jìn)入常量池,即使方法彈棧刑峡,常量池的常量還在洋闽,也就可以繼續(xù)使用了。
* 注意:在jdk1.8取消了在局部內(nèi)部類中使用的變量必須顯示的使用final修飾突梦,編譯器默認(rèn)會(huì)為這個(gè)變量加上final
* 內(nèi)部類的概念在一定程度上打破了類的定義诫舅,但在一些叫復(fù)雜的類設(shè)計(jì)中,內(nèi)部類解決了Java不能多繼承的問題
* 依賴外部類對象:成員內(nèi)部類宫患,方法內(nèi)部類刊懈,匿名內(nèi)部類
* 不依賴外部類對象:靜態(tài)內(nèi)部類
* 所以我們在項(xiàng)目中,優(yōu)先考慮選擇靜態(tài)內(nèi)部類(不會(huì)產(chǎn)生內(nèi)存泄漏)
30. 鏈表
鏈表:一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表虚汛,但是并不會(huì)按線性的順序存儲(chǔ)數(shù)據(jù)匾浪,而是在每個(gè)節(jié)點(diǎn)里存到是下一個(gè)節(jié)點(diǎn)的指針(pointer)
* 鏈表和數(shù)組:線性數(shù)據(jù)結(jié)構(gòu)
* 數(shù)組適合查找,遍歷卷哩,固定長度
* 鏈表適合插入蛋辈,刪除,不固定長度将谊,但不宜過程冷溶,否則導(dǎo)致遍歷性能下降
掌握數(shù)組和鏈表的優(yōu)缺點(diǎn),才直到使用時(shí)如何選擇尊浓,基于數(shù)組實(shí)現(xiàn)的動(dòng)態(tài)數(shù)組有ArrayList等逞频,基于鏈表實(shí)現(xiàn)的有LinkedList等
在鏈表數(shù)據(jù)結(jié)構(gòu)中,我們需要使用到遞歸算法
遞歸算法是一種直接或簡潔調(diào)用自身算法的過程
* 在計(jì)算機(jī)編寫程序中栋齿,遞歸算法對解決一大類問題是十分有效的
* 它往往使算法的描述簡潔而且易于理解
遞歸算法苗胀,方法本身調(diào)用自己
1). 遞歸必須要有出口
2). 遞歸內(nèi)存消耗大,容易發(fā)生內(nèi)存溢出(每次都有方法的入棧褒颈,變量柒巫,對象引用都需要占用內(nèi)存)
3). 層次調(diào)用越多,越危險(xiǎn)
31. 基本數(shù)據(jù)類型包裝類
在Java中有一個(gè)設(shè)計(jì)的原則“一切皆對象”谷丸,Java中的基本數(shù)據(jù)類型就完全不符合這種設(shè)計(jì)思想堡掏,因?yàn)榘朔N基本數(shù)據(jù)類型并不是引用數(shù)據(jù)類型,所以java中為了解決這樣的問題刨疼,JDK1.5以后引入了八種基本數(shù)據(jù)類型的包裝類
1). 八種包裝類分為兩大類型:
* Number: Integer, Short, Long, Double, Float, Byte都是Number的子類泉唁,表示一個(gè)數(shù)字
* Object: Character, Boolean都是Object的直接子類
2). 裝箱及拆箱操作
* 將一個(gè)基本數(shù)據(jù)類型轉(zhuǎn)換為包裝類,那么這樣的操作被稱為裝箱操作揩慕,將一個(gè)包裝類轉(zhuǎn)換為一個(gè)基本數(shù)據(jù)類型亭畜,這樣的操作稱為拆箱操作。
3). 轉(zhuǎn)型操作:在包裝類中迎卤,可以將一個(gè)字符串變?yōu)橹付ǖ幕緮?shù)據(jù)類型拴鸵,一般在輸入數(shù)據(jù)時(shí)會(huì)使用較多
* 在Integer類中,將string變?yōu)閕nt型數(shù)據(jù):public static int parseInt(String s)
* 在Float類中蜗搔,將string變?yōu)閒loat型數(shù)據(jù):public static int parseFloat(String s)
注意:轉(zhuǎn)型操作時(shí)劲藐,字符串必須由數(shù)字組成,否則會(huì)出現(xiàn)錯(cuò)誤
4). 享元模式(Flyweight Pattern):
使用共享對象樟凄,用來盡可能減少內(nèi)存使用量聘芜,以及分享咨詢給盡可能多的相似對象,它適用于當(dāng)大量對象只是重復(fù)缝龄,導(dǎo)致無法令人接受的使用大量內(nèi)存汰现,通常對象中的部分狀態(tài)是可以分享挂谍,常見做法是它們放在外部數(shù)據(jù)結(jié)構(gòu),當(dāng)需要使用時(shí)再將它們傳遞給享元瞎饲。
* 運(yùn)用共享計(jì)數(shù)有效的支持大量細(xì)粒度的對象
一個(gè)字節(jié)的數(shù)字以內(nèi)口叙,可以共享一個(gè)內(nèi)存地址:-128~127
5). 包與訪問修飾符
包用于對多個(gè)java源文件的管理,就像我們的文件目錄一樣
* 定義一個(gè)包:package com.vince
(該語句只能出現(xiàn)在代碼中的第一句)
6). 訪問修飾符
32. OO原則
1). 開閉原則
一個(gè)軟件實(shí)體嗅战,如類庐扫、模塊和函數(shù)應(yīng)該對擴(kuò)展開放,對修改關(guān)閉仗哨。
2). 合成/聚合復(fù)用原則
新對象的某些功能在已創(chuàng)建好的對象已實(shí)現(xiàn),那么盡量用以用對象提供的功能铅辞,使之成為新對象的一部分厌漂,而不要再重新創(chuàng)建
3). 依賴倒置原則
高層模塊不應(yīng)該依賴高層模塊,二者都應(yīng)該依賴其抽象斟珊,抽象不應(yīng)該依賴細(xì)節(jié)苇倡,細(xì)節(jié)應(yīng)該依賴抽象。
4). 接口隔離原則
客戶端不應(yīng)該依賴它不需要的接口囤踩;一個(gè)類對另一個(gè)類的依賴應(yīng)該建立中最小的接口上旨椒。
5). 迪米特法則
一個(gè)對象應(yīng)該對其他對象保持最少的了解。
6). 里氏替換原則
所有引用基類的地方必須能透明地使用其子類的對象堵漱。
7). 單一職責(zé)原則
不要存在多于一個(gè)導(dǎo)致類變更的原因综慎,即一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)。
33. class文件加載到內(nèi)存的結(jié)構(gòu)圖