1.Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什麼意思? 重寫和重載的區別?java
答: Java中的方法重載發生在同一個類裏面兩個或者是多個方法的方法名相同可是參數不一樣的狀況。與此相對,方法覆蓋是說子類從新定義了父類的方法。方法覆蓋必須有相同的方法名,參數列表和返回類型。覆蓋者可能不會限制它所覆蓋的方法的訪問。程序員
重載(Overloading)多線程
(1) 方法重載是讓類以統一的方式處理不一樣類型數據的一種手段。多個同名函數同時存在,具備不一樣的參數個數/類型。重載Overloading是一個類中多態性的一種表現。框架
(2) Java的方法重載,就是在類中能夠建立多個方法,它們具備相同的名字,但具備不一樣的參數和不一樣的定義。調用方法時經過傳遞給它們的不一樣參數個數和參數類型來決定具體使用哪一個方法, 這就是多態性。eclipse
(3) 重載的時候,方法名要同樣,可是參數類型和個數不同,返回值類型能夠相同也能夠不相同。沒法以返回型別做爲重載函數的區分標準。 重寫(Overriding)函數
(1) 父類與子類之間的多態性,對父類的函數進行從新定義。若是在子類中定義某方法與其父類有相同的名稱和參數,咱們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不須要從新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想做必定的修改,這就須要採用方法的重寫。方法重寫又稱方法覆蓋。this
(2)若子類中的方法與父類中的某一方法具備相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可以使用super關鍵字,該關鍵字引用了當前類的父類。(3)子類函數的訪問修飾權限不能少於父類的;spa
2.Java中,什麼是構造函數?什麼是構造函數重載?什麼是複製構造函數?線程
答: 當新對象被建立的時候,構造函數會被調用。每個類都有構造函數。在程序員沒有給類提供構造函數的狀況下,Java編譯器會爲這個類建立一個默認的構造函數。設計
Java中構造函數重載和方法重載很類似。能夠爲一個類建立多個構造函數。每個構造函數必須有它本身惟一的參數列表。
Java不支持像C++中那樣的複製構造函數,這個不一樣點是由於若是你不本身寫構造函數的狀況下,Java不會建立默認的複製構造函數。
3.Java支持多繼承麼?
答: Java中類不支持多繼承,只支持單繼承(即一個類只有一個父類)。 可是java中的接口支持多繼承,,即一個子接口能夠有多個父接口。(接口的做用是用來擴展對象的功能,一個子接口繼承多個父接口,說明子接口擴展了多個功能,當類實現接口時,類就擴展了相應的功能)。
4.接口和抽象類的區別是什麼?
答: 接口(interface)能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final (這裏須要說一點,既然一個變量被final修飾了,那麼這個變量就是一個常量!!!!!變量必須初始化成常量!!!!!)
下面比較一下二者的語法區別:
1.抽象類能夠有構造方法,接口中不能有構造方法。
2.抽象類中能夠有普通成員變量,接口中沒有普通成員變量!!!!!!!(注意重點在 普通 即 非靜態 和 變量!!!!)
3.抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類中的抽象方法的訪問類型能夠是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,而且默認即爲public abstract類型。
5. 抽象類中能夠包含靜態方法(static),接口中不能包含靜態方法.
6. 抽象類和接口中均可以包含靜態成員變量(static),抽象類中的靜態成員變量的訪問類型能夠任意,但接口中定義的變量只能是public static final類型,而且默認即爲public static final類型。
7. 一個類能夠實現多個接口,但只能繼承一個抽象類。
什麼時候用接口,什麼時候用抽象類?
子類繼承抽象類就不能再繼承其餘類(java的單繼承原則),因此有抽象方法時優先使用接口定義.
若是全部方法都沒有實現,優先使用接口.
一些方法已經能夠實現,而另外一些方法沒法或不想實現時,且繼承(實現)關係很簡單時,考慮用抽象類定義,留給後代去實現。jdk8以後,也能夠在接口中定義default方法或static方法來實現.
5.什麼是值傳遞和引用傳遞?
答: 值傳遞是對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量.
引用傳遞通常是對於對象型變量而言的,傳遞的是該對象地址的一個副本, 並非原對象自己 。 因此對引用對象進行操做會同時改變原對象.
通常認爲,java內的傳遞都是值傳遞.
6.建立線程有幾種不一樣的方式?你喜歡哪種?爲何?
答: 有兩種方式能夠用來建立線程:
繼承Thread類
實現Runnable接口
實現Runnable接口這種方式更受歡迎,由於這不須要繼承Thread類。在應用設計中已經繼承了別的對象的狀況下,這須要多繼承(而Java不支持多繼承),只能實現接口。同時,線程池也是很是高效的,很容易實現和使用。
7.歸納的解釋下線程的幾種可用狀態。
答: 1. 新建( new ):新建立了一個線程對象。
2. 可運行( runnable ):線程對象建立後,其餘線程(好比 main 線程)調用了該對象 的 start ()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,獲 取 cpu 的使用權 。
3. 運行( running ):可運行狀態( runnable )的線程得到了 cpu 時間片( timeslice ) ,執行程序代碼。
4. 阻塞( block ):阻塞狀態是指線程由於某種緣由放棄了 cpu 使用權,也即讓出了 cpu timeslice ,暫時中止運行。直到線程進入可運行( runnable )狀態,纔有 機會再次得到 cpu timeslice 轉到運行( running )狀態。阻塞的狀況分三種:
(一). 等待阻塞:運行( running )的線程執行 o . wait ()方法, JVM 會把該線程放 入等待隊列( waitting queue )中。
(二). 同步阻塞:運行( running )的線程在獲取對象的同步鎖時,若該同步鎖 被別的線程佔用,則 JVM 會把該線程放入鎖池( lock pool )中。
(三). 其餘阻塞: 運行( running )的線程執行 Thread . sleep ( long ms )或 t . join ()方法,或者發出了 I / O 請求時, JVM 會把該線程置爲阻塞狀態。當 sleep ()狀態超時、 join ()等待線程終止或者超時、或者 I / O 處理完畢時,線程從新轉入可運行( runnable )狀態。
5. 死亡( dead ):線程 run ()、 main () 方法執行結束,或者因異常退出了 run ()方法,則該線程結束生命週期。死亡的線程不可再次復生。
8.同步方法和同步代碼塊的區別是什麼?
答: 區別:
同步方法默認用this或者當前類class對象做爲鎖;
同步代碼塊能夠選擇以什麼來加鎖,比同步方法要更細顆粒度,咱們能夠選擇只同步會發生同步問題的部分代碼而不是整個方法;
9.什麼是死鎖(deadlock)?如何確保N個線程能夠訪問N個資源同時又不致使死鎖?
答: 兩個線程或兩個以上線程都在等待對方執行完畢才能繼續往下執行的時候就發生了死鎖。結果就是這些線程都陷入了無限的等待中.
使用多線程的時候,一種很是簡單的避免死鎖的方式就是:指定獲取鎖的順序,並強制線程按照指定的順序獲取鎖。所以,若是全部的線程都是以一樣的順序加鎖和釋放鎖,就不會出現死鎖了。
10.Java集合類框架的基本接口有哪些?
答: 集合類接口指定了一組叫作元素的對象。集合類接口的每一種具體的實現類均可以選擇以它本身的方式對元素進行保存和排序。有的集合類容許重複的鍵,有些不容許。
Java集合類提供了一套設計良好的支持對一組對象進行操做的接口和類。Java集合類裏面最基本的接口有:
Collection:表明一組對象,每個對象都是它的子元素。
Set:不包含重複元素的Collection。
List:有順序的collection,而且能夠包含重複元素。
Map:能夠把鍵(key)映射到值(value)的對象,鍵不能重複。
11.sleep()和wait()的區別?
1.sleep方法來自Thread類,wait方法來自Object類;
2.最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得線程可使用同步控制塊或者方法。
3.wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,而sleep能夠在任何地方使用(使用範圍)
4.sleep必須捕獲異常,而wait,notify和notifyAll不須要捕獲異常。