1. Override 和 Overload 的含義去區(qū)別
- Override(重寫)
重寫(Overriding)是父類與子類之間多態(tài)性的一種表現(xiàn)株茶。
覆蓋的方法的標(biāo)志必須要和被覆蓋的方法的標(biāo)志完全匹配院促,才能達(dá)到覆蓋的效果;
覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
方法被定義為final不能被重寫喷市。
對(duì)于繼承來說,如果某一方法在父類中是訪問權(quán)限是private威恼,那么就不能在子類對(duì)其進(jìn)行重寫覆蓋东抹,如果定義的話,也只是定義了一個(gè)新方法沃测,而不會(huì)達(dá)到重寫覆蓋的效果缭黔。
- Overload(重載)
重載(Overloading)是一個(gè)類中多態(tài)性的一種表現(xiàn)。
在使用重載時(shí)只能通過不同的參數(shù)樣式蒂破。例如馏谨,不同的參數(shù)類型,不同的參數(shù)個(gè)數(shù)附迷,不同的參數(shù)順序(當(dāng)然惧互,同一方法內(nèi)的幾個(gè)參數(shù)類型必須不一樣,例如可以是fun(int, float)喇伯, 但是不能為fun(int, int))喊儡;
不能通過訪問權(quán)限、返回類型稻据、拋出的異常進(jìn)行重載惹恃;
方法的異常類型和數(shù)目不會(huì)對(duì)重載造成影響拷肌;
重載事件通常發(fā)生在同一個(gè)類中姨俩,不同方法之間的現(xiàn)象鸟赫。
存在于同一類中,但是只有虛方法和抽象方法才能被覆寫今缚。
2. Interface 與 abstract 類的區(qū)別
接口(interface)可以說成是抽象類的一種特例算柳,接口中的所有方法都必須是抽象的。接口中的方法定義默認(rèn)為public abstract類型姓言,接口中的成員變量類型默認(rèn)為public static final瞬项。
下面比較一下兩者的語法區(qū)別:
1.抽象類可以有構(gòu)造方法蔗蹋,接口中不能有構(gòu)造方法。
2.抽象類中可以有普通成員變量囱淋,接口中沒有普通成員變量
3.抽象類中可以包含非抽象的普通方法纸颜,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法绎橘。
4.抽象類中的抽象方法的訪問類型可以是public,protected唠倦,但接口中的抽象方法只能是public類型的称鳞,并且默認(rèn)即為public abstract類型。
5.抽象類中可以包含靜態(tài)方法稠鼻,接口中不能包含靜態(tài)方法
6.抽象類和接口中都可以包含靜態(tài)成員變量冈止,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型候齿,并且默認(rèn)即為public static final類型熙暴。
7.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類慌盯。
3. static class 與 non static class 的區(qū)別
static class | non static class |
---|---|
內(nèi)部靜態(tài)類不需要有指向外部類的引用 | 非靜態(tài)內(nèi)部類需要持有對(duì)外部類的引用 |
靜態(tài)類只能訪問外部類的靜態(tài)成員周霉,不能訪問外部類的非靜態(tài)成員 | 非靜態(tài)內(nèi)部類能夠訪問外部類的靜態(tài)和非靜態(tài)成員 |
- | 一個(gè)非靜態(tài)內(nèi)部類不能脫離外部類實(shí)體被創(chuàng)建 |
- | 一個(gè)非靜態(tài)內(nèi)部類可以訪問外部類的數(shù)據(jù)和方法 |
4. Java 多態(tài)的實(shí)現(xiàn)原理
子類Child繼承父類Father,我們可以編寫一個(gè)指向子類的父類類型引用,該引用既可以處理父類Father對(duì)象,也可以處理子類Child對(duì)象。
當(dāng)相同的消息發(fā)送給子類或者父類對(duì)象時(shí),該對(duì)象就會(huì)根據(jù)自己所屬的引用而執(zhí)行不同的行為,這就是多態(tài)亚皂。
即多態(tài)性就是相同的消息使得不同的類做出不同的響應(yīng)俱箱。
5. 實(shí)現(xiàn)多線程的兩種方法:Thread 與 Runable
- 繼承 Thread 類
1.定義類繼承Thread;
2.覆寫Threa類的run方法灭必。 自定義代碼放在run方法中狞谱,讓線程運(yùn)行;
3.調(diào)用線程的star方法禁漓。
- 實(shí)現(xiàn) Runable 接口
1.定義類實(shí)現(xiàn) Runnable 接口跟衅;
2.覆蓋 Runnable 接口中的 run 方法,運(yùn)行的代碼放入run方法中播歼;
3.通過 Thread 類建立線程對(duì)象伶跷;
4.將 Runnable 接口的子類對(duì)象作為實(shí)際參數(shù)傳遞給 Thread 類的構(gòu)造函數(shù);
因?yàn)槊啬远x的 run 方法所屬的對(duì)象是 Runnable 接口的子類對(duì)象撩穿。所以要讓線程去執(zhí)行指定對(duì)象的 run 方法。就必須明確該 run 方法所屬對(duì)象谒撼;
5.調(diào)用 Thread 類的 start 方法開啟線程并調(diào)用 Runnable 接口子類的 run 方法食寡。
6. 線程同步的方法:sychronized、lock廓潜、reentrantLock 等
- sychronized
Java 中最基本同步互斥的手段抵皱,可以修飾代碼塊善榛、方法、類;
在修飾代碼塊的時(shí)候需要一個(gè) reference 對(duì)象作為鎖的對(duì)象;
在修飾方法的時(shí)候默認(rèn)是當(dāng)前對(duì)象作為鎖的對(duì)象;
在修飾類時(shí)候默認(rèn)是當(dāng)前類的 Class 對(duì)象作為鎖的對(duì)象呻畸。
synchronized 會(huì)在進(jìn)入同步塊的前后分別形成 monitorenter 和 monitorexit 字節(jié)碼指令移盆;
在執(zhí)行 monitorenter 指令時(shí)會(huì)嘗試獲取對(duì)象的鎖,如果此對(duì)象沒有被鎖或者已經(jīng)被當(dāng)前線程鎖住伤为,那么鎖的計(jì)數(shù)器加一咒循;
每當(dāng) monitorexit 被鎖的對(duì)象的計(jì)數(shù)器減一,直到為 0 就釋放該對(duì)象的鎖绞愚。
由此 synchronized 是可重入的叙甸,不會(huì)出現(xiàn)自己把自己鎖死。
可重入鎖位衩,也叫做遞歸鎖裆蒸,指的是同一線程 外層函數(shù)獲得鎖之后 ,內(nèi)層遞歸函數(shù)仍然有獲取該鎖的代碼糖驴,但不受影響
- lock
lock 是一個(gè)類僚祷,通過這個(gè)類可以實(shí)現(xiàn)同步訪問;
必須要用戶去手動(dòng)釋放鎖,如果沒有主動(dòng)釋放鎖贮缕,就有可能導(dǎo)致出現(xiàn)死鎖現(xiàn)象;
- reentrantLock
對(duì)象的方式來操作對(duì)象鎖.相對(duì)于 sychronized 需要在 finally 中去釋放鎖;
1.等待可中斷辙谜。在持有鎖的線程長時(shí)間不釋放鎖的時(shí)候,等待的線程可以選擇放棄等待感昼。tryLock(long timeout, TimeUnit unit)筷弦;
2.公平鎖。按照申請(qǐng)鎖的順序來一次獲得鎖稱為公平鎖抑诸。synchronized 的是非公平鎖烂琴,ReentrantLock 可以通過構(gòu)造函數(shù)實(shí)現(xiàn)公平鎖。new RenentrantLock(boolean fair)蜕乡;
3.綁定多個(gè) Condition奸绷。通過多次 new Condition 可以獲得多個(gè) Condition 對(duì)象,可以簡(jiǎn)單的實(shí)現(xiàn)比較復(fù)雜的線程同步的功能层玲。通過 await()号醉、signal()。
7. 鎖的等級(jí):方法鎖辛块、對(duì)象鎖畔派、類鎖
在修飾代碼塊的時(shí)候需要一個(gè) reference 對(duì)象作為鎖的對(duì)象;
在修飾方法的時(shí)候默認(rèn)是當(dāng)前對(duì)象作為鎖的對(duì)象;
在修飾類時(shí)候默認(rèn)是當(dāng)前類的 Class 對(duì)象作為鎖的對(duì)象。
8. 寫出生產(chǎn)者消費(fèi)者模式
準(zhǔn)確說應(yīng)該是“生產(chǎn)者-消費(fèi)者-倉儲(chǔ)”模型润绵,離開了倉儲(chǔ)线椰,生產(chǎn)者消費(fèi)者模型就顯得沒有說服力了。
對(duì)于此模型尘盼,應(yīng)該明確一下幾點(diǎn):
1.生產(chǎn)者僅僅在倉儲(chǔ)未滿時(shí)候生產(chǎn)憨愉,倉滿則停止生產(chǎn)烦绳;
2.消費(fèi)者僅僅在倉儲(chǔ)有產(chǎn)品時(shí)候才能消費(fèi),倉空則等待配紫;
3.當(dāng)消費(fèi)者發(fā)現(xiàn)倉儲(chǔ)沒產(chǎn)品可消費(fèi)時(shí)候會(huì)通知生產(chǎn)者生產(chǎn)径密;
4.生產(chǎn)者在生產(chǎn)出可消費(fèi)產(chǎn)品時(shí)候,應(yīng)該通知等待的消費(fèi)者去消費(fèi)躺孝。
https://www.cnblogs.com/linjiqin/p/3217050.html
https://www.cnblogs.com/chentingk/p/6497107.html