除了掌握扎實的專業技能之外,你還需要一份《Java程序員面試寶典》才能在萬千面試者中殺出重圍,成功拿下offer。
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:棧和隊列之間有什么區別?
答案:棧和隊列之間的主要區別在于,?;凇昂筮M先出(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!