Java 拾遺三

1. Override 和 Overload 的含義去區(qū)別

  • Override(重寫)

重寫(Overriding)是父類與子類之間多態(tài)性的一種表現。
覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
方法被定義為final不能被重寫。
對于繼承來說,如果某一方法在父類中是訪問權限是private,那么就不能在子類對其進行重寫覆蓋,如果定義的話,也只是定義了一個新方法,而不會達到重寫覆蓋的效果。

  • Overload(重載)

重載(Overloading)是一個類中多態(tài)性的一種表現。
在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));
不能通過訪問權限、返回類型、拋出的異常進行重載;
方法的異常類型和數目不會對重載造成影響;
重載事件通常發(fā)生在同一個類中,不同方法之間的現象。
存在于同一類中,但是只有虛方法和抽象方法才能被覆寫。

2. Interface 與 abstract 類的區(qū)別

接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認為public abstract類型,接口中的成員變量類型默認為public static final。

下面比較一下兩者的語法區(qū)別:
1.抽象類可以有構造方法,接口中不能有構造方法。
2.抽象類中可以有普通成員變量,接口中沒有普通成員變量
3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4.抽象類中的抽象方法的訪問類型可以是public,protected,但接口中的抽象方法只能是public類型的,并且默認即為public abstract類型。
5.抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法
6.抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認即為public static final類型。
7.一個類可以實現多個接口,但只能繼承一個抽象類。

3. static class 與 non static class 的區(qū)別

static class non static class
內部靜態(tài)類不需要有指向外部類的引用 非靜態(tài)內部類需要持有對外部類的引用
靜態(tài)類只能訪問外部類的靜態(tài)成員,不能訪問外部類的非靜態(tài)成員 非靜態(tài)內部類能夠訪問外部類的靜態(tài)和非靜態(tài)成員
- 一個非靜態(tài)內部類不能脫離外部類實體被創(chuàng)建
- 一個非靜態(tài)內部類可以訪問外部類的數據和方法

4. Java 多態(tài)的實現原理

子類Child繼承父類Father,我們可以編寫一個指向子類的父類類型引用,該引用既可以處理父類Father對象,也可以處理子類Child對象。
當相同的消息發(fā)送給子類或者父類對象時,該對象就會根據自己所屬的引用而執(zhí)行不同的行為,這就是多態(tài)。
即多態(tài)性就是相同的消息使得不同的類做出不同的響應。

5. 實現多線程的兩種方法:Thread 與 Runable

  • 繼承 Thread 類

1.定義類繼承Thread;
2.覆寫Threa類的run方法。 自定義代碼放在run方法中,讓線程運行;
3.調用線程的star方法。

  • 實現 Runable 接口

1.定義類實現 Runnable 接口;
2.覆蓋 Runnable 接口中的 run 方法,運行的代碼放入run方法中;
3.通過 Thread 類建立線程對象;
4.將 Runnable 接口的子類對象作為實際參數傳遞給 Thread 類的構造函數;
因為,自定義的 run 方法所屬的對象是 Runnable 接口的子類對象。所以要讓線程去執(zhí)行指定對象的 run 方法。就必須明確該 run 方法所屬對象;
5.調用 Thread 類的 start 方法開啟線程并調用 Runnable 接口子類的 run 方法。

6. 線程同步的方法:sychronized、lock、reentrantLock 等

  • sychronized

Java 中最基本同步互斥的手段,可以修飾代碼塊、方法、類;
在修飾代碼塊的時候需要一個 reference 對象作為鎖的對象;
在修飾方法的時候默認是當前對象作為鎖的對象;
在修飾類時候默認是當前類的 Class 對象作為鎖的對象。

synchronized 會在進入同步塊的前后分別形成 monitorenter 和 monitorexit 字節(jié)碼指令;
在執(zhí)行 monitorenter 指令時會嘗試獲取對象的鎖,如果此對象沒有被鎖或者已經被當前線程鎖住,那么鎖的計數器加一;
每當 monitorexit 被鎖的對象的計數器減一,直到為 0 就釋放該對象的鎖。
由此 synchronized 是可重入的,不會出現自己把自己鎖死。

可重入鎖,也叫做遞歸鎖,指的是同一線程 外層函數獲得鎖之后 ,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響

  • lock

lock 是一個類,通過這個類可以實現同步訪問;
必須要用戶去手動釋放鎖,如果沒有主動釋放鎖,就有可能導致出現死鎖現象;

  • reentrantLock

對象的方式來操作對象鎖.相對于 sychronized 需要在 finally 中去釋放鎖;
1.等待可中斷。在持有鎖的線程長時間不釋放鎖的時候,等待的線程可以選擇放棄等待。tryLock(long timeout, TimeUnit unit);
2.公平鎖。按照申請鎖的順序來一次獲得鎖稱為公平鎖。synchronized 的是非公平鎖,ReentrantLock 可以通過構造函數實現公平鎖。new RenentrantLock(boolean fair);
3.綁定多個 Condition。通過多次 new Condition 可以獲得多個 Condition 對象,可以簡單的實現比較復雜的線程同步的功能。通過 await()、signal()。

7. 鎖的等級:方法鎖、對象鎖、類鎖

在修飾代碼塊的時候需要一個 reference 對象作為鎖的對象;
在修飾方法的時候默認是當前對象作為鎖的對象;
在修飾類時候默認是當前類的 Class 對象作為鎖的對象。

8. 寫出生產者消費者模式

準確說應該是“生產者-消費者-倉儲”模型,離開了倉儲,生產者消費者模型就顯得沒有說服力了。
對于此模型,應該明確一下幾點:
1.生產者僅僅在倉儲未滿時候生產,倉滿則停止生產;
2.消費者僅僅在倉儲有產品時候才能消費,倉空則等待;
3.當消費者發(fā)現倉儲沒產品可消費時候會通知生產者生產;
4.生產者在生產出可消費產品時候,應該通知等待的消費者去消費。
https://www.cnblogs.com/linjiqin/p/3217050.html
https://www.cnblogs.com/chentingk/p/6497107.html

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,673評論 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,812評論 0 11
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,256評論 0 62
  • 轉自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,804評論 3 93
  • 2017年閱讀35本,跟別人比,跟以前的自己比,都不算多。 然而讀書不單求數量,也求質量。 今年閱讀上最大的收獲:...
    若辰讀書閱讀 872評論 1 13

友情鏈接更多精彩內容