除了掌握紮實的專業技能之外,你還需要一份《Java程式員面試寶典》才能在萬千面試者中殺出重圍,成功拿下offer。
小編特意整理了100道Java面試題,送給大家,希望大家都能順利通過面試,拿下高薪。趕緊碼住吧~~文末有福利
Q1:Java内部類和子類之間有什麼差別?
答案:内部類是指在一個外部類的内部再定義一個類,内部類對外部類有通路權限,可以通路類中定義的所有變量和方法。
子類是從父類(superclass)中繼承的類,子類可以通路父類所有public和protected的字段和方法。
Q2:Java語言中有哪些常見的通路說明符,有什麼意義?
答案:Java中的通路說明符是放在類名之前,用于定義通路範圍的關鍵字,常見的通路說明符有以下幾類:
Public:公共,能被項目中的任何一個Class、Method、Field通路。
Protected:受保護,能被同類或子類通路,不能從外部通路。
Default:預設,隻能被同一個包的Class、Method、Field通路。
Private:私有,隻能被本類通路。
Q3:靜态方法和靜态變量的目的是什麼?
答案:靜态變量被類的所有執行個體共用,靜态類隻能通路類的靜态變量,或調用類的靜态方法。
Q4:什麼是資料封裝及其意義?
答案:封裝是面向對象程式設計中用于在單個單元中組合屬性和方法。
封裝可以幫助程式員遵循子產品化方法進行軟體開發,每個對象都有自己的一組方法和變量,并且可以獨立于其他對象來執行其功能。另外,封裝也有資料隐藏的目的。
Q5:什麼是 singleton class(單例類)?并給出其用法的實際例子。
答案:單例類隻能有一個執行個體,必須自己建立自己的唯一執行個體,必須給所有其他對象提供這一執行個體。
單例使用場景的最佳實踐是由于某些驅動程式限制或由于許可問題的限制隻能連接配接資料庫。
Q6:什麼是循環?Java中有哪些循環?
答案:循環用于程式設計中重複執行語句,Java中的循環有三類:
1、for循環
for循環用于執行指定重複次數的語句,當程式員明确知道循環次數可以使用for循環。
2、While循環
當語句滿足條件時開始進行重複執行,直到語句不再滿足條件退出循環。While循環中在執行語句之前先檢查是否滿足條件。
3、do while循環
Do while 和while循環基本類似,唯一不同的是do while是先執行語句再檢查條件,也就是說do while循環至少會執行一次語句。
Q7:什麼是無限循環?如何聲明無限循環?
答案:無限循環是指無條件執行,無限運作。無限循環可以由定義中斷語句塊來結束。
Q8:continue和break語句有什麼差別?
答案:break和continue都是循環中的重要關鍵詞,break語句是結束整個循環過程,continue語句隻結束本次循環,而不是終止整個循環的執行。
Break:
Continue:
Q9:Java中的double和float變量有什麼差別?
答案:float是單精度浮點數,記憶體中占用4位元組,double是雙精度浮點數,記憶體中占用8位元組。
Q10:Java中的Final關鍵字是什麼意思?請舉例說明
答案:final是Java中的關鍵字,有“無法改變”、“終态”的含義,final類不能被繼承,沒有子類,final類中的方法預設是final的,且不能被子類的方法覆寫,但可以被繼承。
final成員變量表示常量,隻能被指派一次,指派後值不再改變。final不能用于修飾構造方法。
下面的例子中,const_val被聲明且指派為常量100:
Private Final int const_val=100
而當一個方法被聲明為final之後,它不能被子類覆寫,而且會比其他方法都快。
Q11:舉例說明什麼是三元運算符?
答案:三元運算符,也稱為條件運算符,根據布爾值來決定将哪個值配置設定給變量,它被表示為…?…:…
在下面的示例中,如果rank為1,status=Done,否則status=Pending
Q12:如何在Java中生成随機數?
答案:使用Math.random()可以生成0.1到1.0範圍内的随機數字,然後通過數學方法實作生成符合要求的随機數。
Q13:舉例說明什麼是default switch case?
答案:在switch語句中,如果沒有case條件比對,那麼它會就會執行default後面的語句。
在下面的例子中,當score既不是1也不是2時,就會執行default之後的語句。
Q14:Java中所有派生類的基類是什麼?
答案:java.lang.object
Q15:Java中的main()方法可以傳回任何資料嗎?
答案:java中的main()方法不能傳回任何資料,它的傳回類型始終是void。
Q16:什麼是Java Packages?其意義是什麼?
答案:為了更好地組織類,Java 提供了包機制,用于差別類名的命名空間。
包的作用:
1、把功能相似或相關的類或接口組織在同一個包中,友善類的查找和使用。
2、如同檔案夾一樣,包也采用了樹形目錄的存儲方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以差別。是以,包可以避免名字沖突。
3、包也限定了通路權限,擁有包通路權限的類才能通路某個包中的類。
Q17:我們可以聲明一個抽象類,但是沒有任何抽象方法嗎?
答案:是的,我們可以聲明一個抽象類,且不包含任何抽象方法,但是一旦一個類中含有一個抽象方法,那麼該類必須聲明為抽象。
Q18:Java中的抽象類和接口有什麼差別?
答案:抽象類和接口之間的主要差別在于,抽象類可以擁有任意範圍的成員資料,同時也可以擁有自己的非抽象方法,但是接口方式中,它僅能夠有靜态、不能修改的成員資料,同時它所有的方法都必須是抽象的。
抽象類是對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。
一個類可以實作多個接口,但它隻能擴充一個抽象類。
Q19:接口對抽象類的性能影響是什麼?
答案:與抽象類相比,接口性能較慢。一個類隻能擴充一個抽象類,卻能實作許多接口,随着接口在類中的實作,也會給開發人員帶來額外負擔。
Q20:Java中導入包時,其子包是否會被導入?
答案:在Java中導入包時,其子包不會被導入,如果有需要,開發者必須單獨導入。開發者需要單獨導入它們。
Q21:類中的main方法可以聲明為private?
答案:Java中main方法必須是public,如果是private,那麼它雖然在編譯時不會出錯,但是在運作時會出錯。
Q22:我們能不能通過引用向函數傳遞參數?
答案:不能,我們隻能通過引用将值傳遞給函數。
Q23:對象在java中如何序列化?
答案:序列化是指把Java對象轉換為位元組序列的過程,隻能将支援 java.io.Serializable 接口的對象寫入流中,每個 serializable 對象的類都被編碼。
Q24:Java中的try…catch是用于異常處理嗎?
答案:try後面往往會跟着catch或finally,try抛出的任何異常都會被捕獲在catch中,在代碼終止前的要執行的任務放在finally中。
Q25:有沒有什麼辦法在出現異常時跳過finally?
答案:當在try中出現異常時,如果存在catch,會先被catch捕獲,否則會執行到finally。異常發生時肯定會執行finally,除非在try的末尾有強制中止代碼:System.exit(0);
Q26:什麼時候類的構造函數會被調用?
答案:每次用new來建立對象時,都會調用構造函數。
例如,下例中new建立了兩個對象,構造函數也被調用了兩次。
Q27:一個類可以有多個構造函數嗎?
答案:是的,一個類可以有多個具有不同參數的構造函數,建立對象的構造函數取決于建立對象時傳遞的參數。
Q28:我們可以覆寫類的靜态方法嗎?
答案:我們不能覆寫靜态方法,靜态方法屬于一個類而不是單個對象,并且在編譯時解析(而不是在運作時)。
Q29:在下面的例子中,輸出是什麼?
答案: 輸出為:
Displaying from subclass
Displaying from superclass
Q30:String是Java的資料類型嗎?
答案:String不是Java的原始資料類型,Java中建立一個string時,實際上是建立了Java.Lang.String類的對象,這個對象可以使用String類的所有内置方法。
Q31:下面的示例中,共建立了多少個String對象?
答案:共建立了兩個java.Lang.String類的對象。s1和s3是對同一個對象的引用。
Q32:為什麼Java中的String被稱為Immutable?
答案:Java中,string對象是不可變的,一旦指派不可更改,如果更改,則會建立一個新對象。
在下面的示例中,str是值為“Value One”的字元串對象:
當配置設定一個新值時,将建立一個新的String對象,并将引用移動到新對象。:
Q33:數組和向量之間有什麼差別?
答案:數組是對相同原始類型的資料進行組合,本質上是靜态的,而矢量本質上是動态的,并且可以容納不同資料類型的資料。
Q34:什麼是多線程?
答案:多線程是一個程式設計概念,可以在單個程式中以并發方式執行多個任務。同一個程序的多個線程堆棧共享,有助于程式的性能改進。
Q35:為什麼在ava中使用Runnable Interface?
答案:Runnable接口在Java中用于實作多線程應用程式,Java.Lang.Runnable接口由一個支援多線程的類來實作。
Q36:Java中實作多線程的兩種方法是什麼?
答案:
1、通過使用Java.Lang.Runnable Interface,通過Run()方法來啟用多線程。
2、編寫一個擴充Java.Lang.Thread類的類。
Q37:當資料需要進行大量更改時, String和StringBuffer誰是更好的選擇?
答案:StringBuffers本質上是動态的,我們可以改變StringBuffer對象的值,而String是不可變的,每次資料更改都會建立一個新的String對象,增加額外開銷,是以在資料更改很多的情況下,StringBuffer是一個更好的選擇。
Q38:每個switch語句後使用break的目的是什麼?
答案:switch使用break可以在執行完這個語句後中斷,如果不使用break,那麼它将把所有情況都執行一遍。
Q39:如何在Java中完成垃圾回收?
答案:Java中,對象不被引用時,垃圾回收就會發生,對象會被自動銷毀,調用System.gc()方法或Runtime.gc()方法。
Q40:可以在Main()方法前執行代碼?
答案:如果我們要在類加載時,對象建立之前執行語句,可以在類中使用靜态代碼塊,這樣即使在main方法中建立對象之前,此靜态代碼塊中的語句都将在加載類時執行一次。
Q41:一個類可以同時既是父類也是子類嗎?請舉例說明?
答案:如果使用了繼承層次結構,那麼這個類就可能既是一個類的父類也是另一個類的子類,如下例中的大陸類既是世界類的子類,同時也是國家類的父類。
Q42:如果類中沒有定義構造函數,那麼類的對象将會怎麼建立?
答案:即使類沒有定義顯式構造函數,對象在建立時也會執行隐式構造函數,且該構造函數沒有參數。
Q43:在多線程中,如何確定資源不會同時被多個線程使用?
答案:在多線程中,可以通過使用同步的概念來控制對多個線程之間共享的資源的通路。使用synchronized關鍵字,我們可以確定隻有一個線程可以一段時間内使用共享資源。
Q44:我們是否可以為對象多次調用類的構造函數?
答案:使用new建立對象時,會自動調用構造函數,對象建立之後,則無法再調用該構造函數。
Q45:兩個類classA和classB都在同一個包中,那麼classA的私有成員可以被classB的對象通路嗎?
答案:類的私有成員在該類的範圍之外是不可通路的,即使在同一個包中也不能通路任何其他類。
Q46:同一類中可以定義重名的方法嗎?
答案:可以定義重名的方法,但是其參數的數量和類型是不同的,調用哪個方法取決于傳遞的參數。
例如在下面的類中,我們有兩個具有相同名稱但不同參數的列印方法。根據參數,将調用适當的參數:
Q47:如何制作一個Java對象的副本?
答案:使用克隆,我們可以建立具有對象的實際狀态的副本。Clone()是Cloneable interface的方法,是以需要實作Cloneable interface來進行對象拷貝。
Q48:使用繼承有什麼好處?
答案:使用繼承的主要優點是代碼的可重用性,因為繼承使子類能夠重用其父類的代碼。多态性(可擴充性)是另一個好處,允許引入新的功能而不影響現有的派生類。
Q49:類的變量和方法的預設通路說明符是什麼?
答案:變量和方法的預設通路說明符是protected,即變量和類可用于同一個包中的任何其他類。
Q50:舉一個在Java類中使用指針的例子。
答案:Java中沒有指針。
Q51:如何限制一個類不被繼承?
答案:使用關鍵字Final。
在下面的例子中,Stone類就不能被繼承了。
Q52:通路說明符的通路範圍是什麼?
答案:
Q53:棧和隊列之間有什麼差別?
答案:棧和隊列之間的主要差別在于,棧基于“後進先出(LIFO)”原則,而隊列基于FIFO(先進先出)原則。
Q54:在Java中,我們如何禁止序列化變量?
答案:想要某些變量不被序列化,那麼可以在聲明時使用關鍵字transient。例如,下面的變量trans_var是一個臨時變量,不能被序列化:
Q55:我們如何使用原始資料類型作為對象?
答案:Java提倡“一切皆為對象”,引用資料類型可以執行個體化為對象,基本資料類型卻無法變為對象,針對這一不足,JAVA中設定了包裝類,例如,Integer是原始資料類型int的包裝類。
Q56:編譯時會遇到哪些類型的異常?
答案:程式編譯時可以捕獲被檢查的異常,為了成功編譯代碼,異常會通過try…catch來處理。
Q57:請描述一下線程的不同狀态。
答案:Java中的線程往往是處于下面的某一種狀态
NEW:通過New關鍵字建立了Thread類(或其子類)的對象
RUNNABLE:這種情況指的是Thread類的對象調用了start()方法,線程處于就緒狀态。
RUNNING:線程獲得了CPU,處于運作狀态。
DEAD:處于RUNNING狀态的線程,在執行完run方法之後,就變成了DEAD狀态了。
BLOCKED:這種狀态指的是處于RUNNING狀态的線程,出于某種原因,比如調用了sleep方法、等待使用者輸入等而讓出目前的CPU給其他的線程。
Q58:定義了類的顯式構造函數之後,還可以使用預設構造函數嗎?
答案:如果沒有定義顯式構造函數,那麼Java将提供一個預設的無參數構造函數,但是如果定義了顯式構造函數之後,就不能再調用預設構造函數。
Q59:可以有兩個方法,它們方法名和參數都相同,但傳回值類型不同?
答案:相同的方法指的是方法名、參數以及傳回類型都相同,是以傳回類型不同的兩個方法是可以并存的。
Q60:以下代碼的輸出是什麼?
答案:輸出為4
Q61:在沒有執行main()的情況下,成功編譯了一個Java類,這一說法正确嗎?
答案:正确,雖然Java編譯器規定程式的入口點為staticmain,但是沒有main()還是能夠編譯,隻是不能運作。
Q62:我們可以在靜态方法中調用非靜态方法?
答案:非靜态方法歸類的對象所有,且具有對象的級别範圍,是以如果想要在靜态方法中調用非靜态方法,首先要建立類的對象,然後使用對象引用,調用這些方法。
Q63:為了運作Java程式,必須設定兩個環境變量是什麼?
答案:PATH變量和CLASSPATH變量。
Q64:Java中變量沒有初始化可以使用嗎?
答案:Java不會給變量配置設定預設值,是以變量沒有初始化的情況下,程式會編譯失敗并給出錯誤提示。
Q65:Java中的類可以繼承多個類嗎?
答案:Java不支援多重繼承。
Q66:Java中,構造函數可以與類名不同嗎?
答案:不可以,Java的構造函數必須與類名相同,如果不同,它将被視作普通函數。
Q67:Round(3.7)和Ceil(3.7)的輸出分别是什麼?
答案:它們的輸出都是4。Round()遵循四舍五入,Ceil()遵循向上舍入。
Q68:Java中可以使用goto來轉到特定行嗎?
答案:不可以,Java中沒有goto關鍵字。
Q69:已經死亡的線程可以再次啟動嗎?
答案:不可以。
Q70:以下類的聲明是否正确?
答案:不正确,抽象類不能被聲明為Final。
Q71:每個機器都需要JDK來運作Java程式?
答案:JDK是Java的開發工具包,不是必需的,JRE才是必需的。
Q72:Equals()和==有什麼差別?
答案:Java中,==操作比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量在堆中存儲的位址是否相同,即棧中的内容是否相同。
equals操作表示的兩個變量是否是對同一個對象的引用,即堆中的内容是否相同
下例中,equals()傳回true,而==操作符則傳回false:
Q73:Java類中定義方法,可否使用其他語言代碼實作,如C語言?
答案:可以,在基于原生開發的情況下,我們可以在Java類中定義公共靜态方法,但是不執行,然後用另外一種語言(如C)實作。
Q74:如何在Java中定義析構函數?
答案:Java類中沒必要定義析構函數,它有自己的垃圾回收機制,當不再引用對象時,會自動執行。
Q75:Java中變量可以既是局部變量又是靜态變量嗎?
答案:不能,将局部變量定義為靜态變量會導緻編譯錯誤。
Q76:Interface中可以有靜态方法嗎?
答案:Interface中的靜态方法是沒有意義的,靜态方法在類中不能被覆寫,而Interface中的方法預設都是抽象的,是以隻能在實作Interface的類中實作。
Q77:在實作接口的類中,我們可以更改接口中定義的變量的值嗎?
答案:不能,接口中定義的變量大多都預設是public、static和final等不可更改的常量。
Q78:Java中的垃圾回收機制能夠確定程式永遠不會超出記憶體?
答案:即使Java提供自動垃圾回收,也不能確定程式不會超出記憶體,因為與垃圾回收相比,Java對象的建立速度更快。
Q79:main()能否有除void之外的傳回類型?
答案:不可以,main()必須傳回值為void,程式才能成功執行。
Q80:垃圾回收之後,還能否重新觸發并使用該對象?
答案:不能,一旦對象被回收之後,就不再存在于堆棧上,也就不能再次通路和引用了。
Q81:在Java線程程式設計中,哪個方法是所有線程必須實作的?
答案:Run()是一個Runnable接口的方法,必須由所有線程實作。
Q82:如何在程式中控制資料庫連接配接,且每次隻有一個線程可以進行資料庫連接配接?
答案:應用同步的概念來實作,将資料庫相關代碼hs synchronized關鍵字的方法中,以便一次隻有一個線程可以通路它。
Q83:程式員手動抛出異常怎麼辦?
答案:為了處理手動抛出的異常,我們可以使用throw關鍵字,并在catch中捕獲和處理異常。
Q84:如何實作一個類不允許其他類(甚至派生類)建立其對象?
答案:将該類的構造函數聲明為private,那麼它就不會被其他類通路。
Q85:對象如何存儲在Java中?
答案:每個對象在建立時都會從堆棧中擷取記憶體空間,被垃圾回收器銷毀之後,其空間将被釋放重新配置設定給其它對象。
Q86:如何确定堆棧上對象的實際大小?
答案:Java中,沒辦法确定對象的确切大小。
Q87:以下哪個類将配置設定更多的記憶體?
A類:三種方法,四個變量,無對象
B類:五個方法,三個變量,無對象
答案:在建立對象之前,不會配置設定記憶體,是以這兩個類都沒有配置設定記憶體。
Q88:如果程式中沒有處理異常,會發生什麼?
答案:如果沒有異常處理,那麼程式将中止,且不會執行異常抛出之後的語句。
Q89:如果定義了一個類定義了多個構造函數,那麼是否可以在一個構造函數中調用另一個構造函數?
答案:如果一個類有多個構造函數,那麼可以使用this()在一個構造函數中調用另一個構造函數。
Q90:什麼是匿名類?
答案:匿名類是不能有名字的類,它們不能被引用,隻能在建立時用New語句來聲明它們。
下例中,我們定義了一個匿名類:
Q91:數組聲明之後是否還可以改變其大小?
答案:數組是靜态的,一旦指定了大小,就不能改變。
Q92:應用程式中有多個類,但隻有一個main()可以嗎?
答案:可以,main()方法是Java應用程式的入口方法,代碼總是從特定類的main方法開始。
Q93:如果我想要保留對象的資料以供以後使用,最好的做法是什麼?
答案:使用序列化。
Q94:什麼是局部類?
答案:如果我們在Java的特定塊中定義一個新類,那麼這個類就被稱為局部類,它在局部範圍内可用,在其定義的塊之外不可用。
Q95:String和StringBuffer都表示String對象,這兩個對象之間可以互相比較嗎?
答案:不可以。
Q96:Java提供了哪些API用于集合類的操作?
答案:Java提供了Collection API,可應用于一組對象的,Collection API支援的重要類包括ArrayList、HashMap、TreeSet和TreeMap。
Q97:Java的類型轉換可以将所有其他類轉換為布爾類型嗎?
答案:不可以,其它原始類型不能轉換為布爾類型,布爾類型也不能轉換為其它原始資料類型。
Q98:方法的重寫允許傳回類型不同嗎?
答案:方法的重寫要求子類的方法的名稱及參數必須和所覆寫的方法相同,傳回類型可以不同但必須是所覆寫方法的子類。
Q99:所有異常類的基類是什麼?
答案:Java.Lang.throwable。
Q100:構造函數在繼承中的調用順序是什麼?
答案:在繼承的情況下,建立派生類的新對象時,首先調用父類的構造函數,然後調用派生類的構造函數。
以上就是整理的100道Java程式員面試問題和答案,希望同學們在學好技術的基礎上,也能了解和掌握這些知識,祝大家早日拿到滿意的offer!
總結了一些2020年的面試題,這份面試題的包含的子產品分為19個子產品,分别是: Java 基礎、容器、多線程、反射、對象拷貝、Java Web異常、網絡、設計模式、Spring/Spring MVC、Spring Boot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 。
【點選這裡,暗号CSDN !!】擷取以上的學習資料~