必看!100道Java程序员面试题(含答案)!
除了掌握扎實(shí)的專業(yè)技能之外,你還需要一份《Java程序員面試寶典》才能在萬千面試者中殺出重圍,成功拿下offer。
?
Q1:Java內(nèi)部類和子類之間有什么區(qū)別?
?
答案:內(nèi)部類是指在一個(gè)外部類的內(nèi)部再定義一個(gè)類,內(nèi)部類對外部類有訪問權(quán)限,可以訪問類中定義的所有變量和方法。
?
子類是從父類(superclass)中繼承的類,子類可以訪問父類所有public和protected的字段和方法。
?
Q2:Java語言中有哪些常見的訪問說明符,有什么意義?
?
答案:Java中的訪問說明符是放在類名之前,用于定義訪問范圍的關(guān)鍵字,常見的訪問說明符有以下幾類:
Public:公共,能被項(xiàng)目中的任何一個(gè)Class、Method、Field訪問。
Protected:受保護(hù),能被同類或子類訪問,不能從外部訪問。
Default:默認(rèn),只能被同一個(gè)包的Class、Method、Field訪問。
Private:私有,只能被本類訪問。
?
Q3:靜態(tài)方法和靜態(tài)變量的目的是什么?
?
答案:靜態(tài)變量被類的所有實(shí)例共用,靜態(tài)類只能訪問類的靜態(tài)變量,或調(diào)用類的靜態(tài)方法。
?
Q4:什么是數(shù)據(jù)封裝及其意義?
?
答案:封裝是面向?qū)ο缶幊讨杏糜谠趩蝹€(gè)單元中組合屬性和方法。
?
封裝可以幫助程序員遵循模塊化方法進(jìn)行軟件開發(fā),每個(gè)對象都有自己的一組方法和變量,并且可以獨(dú)立于其他對象來執(zhí)行其功能。另外,封裝也有數(shù)據(jù)隱藏的目的。
?
Q5:什么是 singleton class(單例類)?并給出其用法的實(shí)際例子。
?
答案:單例類只能有一個(gè)實(shí)例,必須自己創(chuàng)建自己的唯一實(shí)例,必須給所有其他對象提供這一實(shí)例。
?
單例使用場景的最佳實(shí)踐是由于某些驅(qū)動(dòng)程序限制或由于許可問題的限制只能連接數(shù)據(jù)庫。
?
Q6:什么是循環(huán)?Java中有哪些循環(huán)?
?
答案:循環(huán)用于編程中重復(fù)執(zhí)行語句,Java中的循環(huán)有三類:
?
1、for循環(huán)
for循環(huán)用于執(zhí)行指定重復(fù)次數(shù)的語句,當(dāng)程序員明確知道循環(huán)次數(shù)可以使用for循環(huán)。
?
2、While循環(huán)
當(dāng)語句滿足條件時(shí)開始進(jìn)行重復(fù)執(zhí)行,直到語句不再滿足條件退出循環(huán)。While循環(huán)中在執(zhí)行語句之前先檢查是否滿足條件。
?
3、do while循環(huán)
Do while 和while循環(huán)基本類似,唯一不同的是do while是先執(zhí)行語句再檢查條件,也就是說do while循環(huán)至少會(huì)執(zhí)行一次語句。
?
Q7:什么是無限循環(huán)?如何聲明無限循環(huán)?
?
答案:無限循環(huán)是指無條件執(zhí)行,無限運(yùn)行。無限循環(huán)可以由定義中斷語句塊來結(jié)束。
?
Q8:continue和break語句有什么區(qū)別?
?
答案:break和continue都是循環(huán)中的重要關(guān)鍵詞,break語句是結(jié)束整個(gè)循環(huán)過程,continue語句只結(jié)束本次循環(huán),而不是終止整個(gè)循環(huán)的執(zhí)行。
?
Break:
?
Continue:
?
Q9:Java中的double和float變量有什么區(qū)別?
?
答案:float是單精度浮點(diǎn)數(shù),內(nèi)存中占用4字節(jié),double是雙精度浮點(diǎn)數(shù),內(nèi)存中占用8字節(jié)。
?
Q10:Java中的Final關(guān)鍵字是什么意思?請舉例說明
?
答案:final是Java中的關(guān)鍵字,有“無法改變”、“終態(tài)”的含義,final類不能被繼承,沒有子類,final類中的方法默認(rèn)是final的,且不能被子類的方法覆蓋,但可以被繼承。
?
final成員變量表示常量,只能被賦值一次,賦值后值不再改變。final不能用于修飾構(gòu)造方法。
?
下面的例子中,const_val被聲明且賦值為常量100:
Private Final int const_val=100
而當(dāng)一個(gè)方法被聲明為final之后,它不能被子類覆蓋,而且會(huì)比其他方法都快。
?
Q11:舉例說明什么是三元運(yùn)算符?
?
答案:三元運(yùn)算符,也稱為條件運(yùn)算符,根據(jù)布爾值來決定將哪個(gè)值分配給變量,它被表示為...?...:...
?
在下面的示例中,如果rank為1,status=Done,否則status=Pending
?
?
Q12:如何在Java中生成隨機(jī)數(shù)?
?
答案:使用Math.random()可以生成0.1到1.0范圍內(nèi)的隨機(jī)數(shù)字,然后通過數(shù)學(xué)方法實(shí)現(xiàn)生成符合要求的隨機(jī)數(shù)。
?
Q13:舉例說明什么是default switch case?
?
答案:在switch語句中,如果沒有case條件匹配,那么它會(huì)就會(huì)執(zhí)行default后面的語句。
?
在下面的例子中,當(dāng)score既不是1也不是2時(shí),就會(huì)執(zhí)行default之后的語句。
?
?
Q14:Java中所有派生類的基類是什么?
?
答案:java.lang.object
?
Q15:Java中的main()方法可以返回任何數(shù)據(jù)嗎?
?
答案:java中的main()方法不能返回任何數(shù)據(jù),它的返回類型始終是void。
?
Q16:什么是Java Packages?其意義是什么?
?
答案:為了更好地組織類,Java 提供了包機(jī)制,用于區(qū)別類名的命名空間。
?
包的作用:
?
1、把功能相似或相關(guān)的類或接口組織在同一個(gè)包中,方便類的查找和使用。
?
2、如同文件夾一樣,包也采用了樹形目錄的存儲(chǔ)方式。同一個(gè)包中的類名字是不同的,不同的包中的類的名字是可以相同的,當(dāng)同時(shí)調(diào)用兩個(gè)不同包中相同類名的類時(shí),應(yīng)該加上包名加以區(qū)別。因此,包可以避免名字沖突。
?
3、包也限定了訪問權(quán)限,擁有包訪問權(quán)限的類才能訪問某個(gè)包中的類。
?
Q17:我們可以聲明一個(gè)抽象類,但是沒有任何抽象方法嗎?
?
答案:是的,我們可以聲明一個(gè)抽象類,且不包含任何抽象方法,但是一旦一個(gè)類中含有一個(gè)抽象方法,那么該類必須聲明為抽象。
?
Q18:Java中的抽象類和接口有什么區(qū)別?
?
答案:抽象類和接口之間的主要區(qū)別在于,抽象類可以擁有任意范圍的成員數(shù)據(jù),同時(shí)也可以擁有自己的非抽象方法,但是接口方式中,它僅能夠有靜態(tài)、不能修改的成員數(shù)據(jù),同時(shí)它所有的方法都必須是抽象的。
?
抽象類是對類抽象,而接口是對行為的抽象。抽象類是對整個(gè)類整體進(jìn)行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進(jìn)行抽象。
一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但它只能擴(kuò)展一個(gè)抽象類。
?
Q19:接口對抽象類的性能影響是什么?
?
答案:與抽象類相比,接口性能較慢。一個(gè)類只能擴(kuò)展一個(gè)抽象類,卻能實(shí)現(xiàn)許多接口,隨著接口在類中的實(shí)現(xiàn),也會(huì)給開發(fā)人員帶來額外負(fù)擔(dān)。
?
Q20:Java中導(dǎo)入包時(shí),其子包是否會(huì)被導(dǎo)入?
?
答案:在Java中導(dǎo)入包時(shí),其子包不會(huì)被導(dǎo)入,如果有需要,開發(fā)者必須單獨(dú)導(dǎo)入。開發(fā)者需要單獨(dú)導(dǎo)入它們。
?
Q21:類中的main方法可以聲明為private?
?
答案:Java中main方法必須是public,如果是private,那么它雖然在編譯時(shí)不會(huì)出錯(cuò),但是在運(yùn)行時(shí)會(huì)出錯(cuò)。
?
Q22:我們能不能通過引用向函數(shù)傳遞參數(shù)?
?
答案:不能,我們只能通過引用將值傳遞給函數(shù)。
?
Q23:對象在java中如何序列化?
?
答案:序列化是指把Java對象轉(zhuǎn)換為字節(jié)序列的過程,只能將支持 java.io.Serializable 接口的對象寫入流中,每個(gè) serializable 對象的類都被編碼。
?
Q24:Java中的try...catch是用于異常處理嗎?
?
答案:try后面往往會(huì)跟著catch或finally,try拋出的任何異常都會(huì)被捕獲在catch中,在代碼終止前的要執(zhí)行的任務(wù)放在finally中。
?
Q25:有沒有什么辦法在出現(xiàn)異常時(shí)跳過finally?
?
答案:當(dāng)在try中出現(xiàn)異常時(shí),如果存在catch,會(huì)先被catch捕獲,否則會(huì)執(zhí)行到finally。異常發(fā)生時(shí)肯定會(huì)執(zhí)行finally,除非在try的末尾有強(qiáng)制中止代碼:System.exit(0);
?
Q26:什么時(shí)候類的構(gòu)造函數(shù)會(huì)被調(diào)用?
?
答案:每次用new來創(chuàng)建對象時(shí),都會(huì)調(diào)用構(gòu)造函數(shù)。
例如,下例中new創(chuàng)建了兩個(gè)對象,構(gòu)造函數(shù)也被調(diào)用了兩次。
?
?
Q27:一個(gè)類可以有多個(gè)構(gòu)造函數(shù)嗎?
?
答案:是的,一個(gè)類可以有多個(gè)具有不同參數(shù)的構(gòu)造函數(shù),創(chuàng)建對象的構(gòu)造函數(shù)取決于創(chuàng)建對象時(shí)傳遞的參數(shù)。
?
Q28:我們可以覆蓋類的靜態(tài)方法嗎?
?
答案:我們不能覆蓋靜態(tài)方法,靜態(tài)方法屬于一個(gè)類而不是單個(gè)對象,并且在編譯時(shí)解析(而不是在運(yùn)行時(shí))。
?
Q29:在下面的例子中,輸出是什么?
?
?
答案: 輸出為:
Displaying from subclass
Displaying from superclass
?
Q30:String是Java的數(shù)據(jù)類型嗎?
?
答案:String不是Java的原始數(shù)據(jù)類型,Java中創(chuàng)建一個(gè)string時(shí),實(shí)際上是創(chuàng)建了Java.Lang.String類的對象,這個(gè)對象可以使用String類的所有內(nèi)置方法。
?
Q31:下面的示例中,共創(chuàng)建了多少個(gè)String對象?
?
?
答案:共創(chuàng)建了兩個(gè)java.Lang.String類的對象。s1和s3是對同一個(gè)對象的引用。
?
Q32:為什么Java中的String被稱為Immutable?
?
答案:Java中,string對象是不可變的,一旦賦值不可更改,如果更改,則會(huì)創(chuàng)建一個(gè)新對象。
?
在下面的示例中,str是值為“Value One”的字符串對象:
?
當(dāng)分配一個(gè)新值時(shí),將創(chuàng)建一個(gè)新的String對象,并將引用移動(dòng)到新對象。:
?
Q33:數(shù)組和向量之間有什么區(qū)別?
?
答案:數(shù)組是對相同原始類型的數(shù)據(jù)進(jìn)行組合,本質(zhì)上是靜態(tài)的,而矢量本質(zhì)上是動(dòng)態(tài)的,并且可以容納不同數(shù)據(jù)類型的數(shù)據(jù)。
?
Q34:什么是多線程?
?
答案:多線程是一個(gè)編程概念,可以在單個(gè)程序中以并發(fā)方式執(zhí)行多個(gè)任務(wù)。同一個(gè)進(jìn)程的多個(gè)線程堆棧共享,有助于程序的性能改進(jìn)。
?
Q35:為什么在ava中使用Runnable Interface?
?
答案:Runnable接口在Java中用于實(shí)現(xiàn)多線程應(yīng)用程序,Java.Lang.Runnable接口由一個(gè)支持多線程的類來實(shí)現(xiàn)。
?
Q36:Java中實(shí)現(xiàn)多線程的兩種方法是什么?
?
答案:
1、通過使用Java.Lang.Runnable Interface,通過Run()方法來啟用多線程。
2、編寫一個(gè)擴(kuò)展Java.Lang.Thread類的類。
?
Q37:當(dāng)數(shù)據(jù)需要進(jìn)行大量更改時(shí), String和StringBuffer誰是更好的選擇?
?
答案:StringBuffers本質(zhì)上是動(dòng)態(tài)的,我們可以改變StringBuffer對象的值,而String是不可變的,每次數(shù)據(jù)更改都會(huì)創(chuàng)建一個(gè)新的String對象,增加額外開銷,所以在數(shù)據(jù)更改很多的情況下,StringBuffer是一個(gè)更好的選擇。
?
Q38:每個(gè)switch語句后使用break的目的是什么?
?
答案:switch使用break可以在執(zhí)行完這個(gè)語句后中斷,如果不使用break,那么它將把所有情況都執(zhí)行一遍。
?
Q39:如何在Java中完成垃圾回收?
?
答案:Java中,對象不被引用時(shí),垃圾回收就會(huì)發(fā)生,對象會(huì)被自動(dòng)銷毀,調(diào)用System.gc()方法或Runtime.gc()方法。
?
Q40:可以在Main()方法前執(zhí)行代碼?
?
答案:如果我們要在類加載時(shí),對象創(chuàng)建之前執(zhí)行語句,可以在類中使用靜態(tài)代碼塊,這樣即使在main方法中創(chuàng)建對象之前,此靜態(tài)代碼塊中的語句都將在加載類時(shí)執(zhí)行一次。
?
Q41:一個(gè)類可以同時(shí)既是父類也是子類嗎?請舉例說明?
?
答案:如果使用了繼承層次結(jié)構(gòu),那么這個(gè)類就可能既是一個(gè)類的父類也是另一個(gè)類的子類,如下例中的大陸類既是世界類的子類,同時(shí)也是國家類的父類。
?
?
Q42:如果類中沒有定義構(gòu)造函數(shù),那么類的對象將會(huì)怎么創(chuàng)建?
?
答案:即使類沒有定義顯式構(gòu)造函數(shù),對象在創(chuàng)建時(shí)也會(huì)執(zhí)行隱式構(gòu)造函數(shù),且該構(gòu)造函數(shù)沒有參數(shù)。
?
Q43:在多線程中,如何確保資源不會(huì)同時(shí)被多個(gè)線程使用?
?
答案:在多線程中,可以通過使用同步的概念來控制對多個(gè)線程之間共享的資源的訪問。使用synchronized關(guān)鍵字,我們可以確保只有一個(gè)線程可以一段時(shí)間內(nèi)使用共享資源。
?
Q44:我們是否可以為對象多次調(diào)用類的構(gòu)造函數(shù)?
?
答案:使用new創(chuàng)建對象時(shí),會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),對象創(chuàng)建之后,則無法再調(diào)用該構(gòu)造函數(shù)。
?
Q45:兩個(gè)類classA和classB都在同一個(gè)包中,那么classA的私有成員可以被classB的對象訪問嗎?
?
答案:類的私有成員在該類的范圍之外是不可訪問的,即使在同一個(gè)包中也不能訪問任何其他類。
?
Q46:同一類中可以定義重名的方法嗎?
?
答案:可以定義重名的方法,但是其參數(shù)的數(shù)量和類型是不同的,調(diào)用哪個(gè)方法取決于傳遞的參數(shù)。
?
例如在下面的類中,我們有兩個(gè)具有相同名稱但不同參數(shù)的打印方法。根據(jù)參數(shù),將調(diào)用適當(dāng)?shù)膮?shù):
?
?
Q47:如何制作一個(gè)Java對象的副本?
?
答案:使用克隆,我們可以創(chuàng)建具有對象的實(shí)際狀態(tài)的副本。Clone()是Cloneable interface的方法,因此需要實(shí)現(xiàn)Cloneable interface來進(jìn)行對象拷貝。
?
Q48:使用繼承有什么好處?
?
答案:使用繼承的主要優(yōu)點(diǎn)是代碼的可重用性,因?yàn)槔^承使子類能夠重用其父類的代碼。多態(tài)性(可擴(kuò)展性)是另一個(gè)好處,允許引入新的功能而不影響現(xiàn)有的派生類。
?
Q49:類的變量和方法的默認(rèn)訪問說明符是什么?
?
答案:變量和方法的默認(rèn)訪問說明符是protected,即變量和類可用于同一個(gè)包中的任何其他類。
?
Q50:舉一個(gè)在Java類中使用指針的例子。
?
答案:Java中沒有指針。
?
Q51:如何限制一個(gè)類不被繼承?
?
答案:使用關(guān)鍵字Final。
在下面的例子中,Stone類就不能被繼承了。
?
?
Q52:訪問說明符的訪問范圍是什么?
?
答案:
?
?
Q53:棧和隊(duì)列之間有什么區(qū)別?
?
答案:棧和隊(duì)列之間的主要區(qū)別在于,棧基于“后進(jìn)先出(LIFO)”原則,而隊(duì)列基于FIFO(先進(jìn)先出)原則。
?
Q54:在Java中,我們?nèi)绾谓剐蛄谢兞?#xff1f;
?
答案:想要某些變量不被序列化,那么可以在聲明時(shí)使用關(guān)鍵字transient。例如,下面的變量trans_var是一個(gè)臨時(shí)變量,不能被序列化:
?
?
Q55:我們?nèi)绾问褂迷紨?shù)據(jù)類型作為對象?
?
答案:Java提倡“一切皆為對象”,引用數(shù)據(jù)類型可以實(shí)例化為對象,基本數(shù)據(jù)類型卻無法變?yōu)閷ο?#xff0c;針對這一不足,JAVA中設(shè)置了包裝類,例如,Integer是原始數(shù)據(jù)類型int的包裝類。
?
Q56:編譯時(shí)會(huì)遇到哪些類型的異常?
?
答案:程序編譯時(shí)可以捕獲被檢查的異常,為了成功編譯代碼,異常會(huì)通過try...catch來處理。
?
Q57:請描述一下線程的不同狀態(tài)。
?
答案:Java中的線程往往是處于下面的某一種狀態(tài)
-
NEW:通過New關(guān)鍵字創(chuàng)建了Thread類(或其子類)的對象
-
RUNNABLE:這種情況指的是Thread類的對象調(diào)用了start()方法,線程處于就緒狀態(tài)。
-
RUNNING:線程獲得了CPU,處于運(yùn)行狀態(tài)。
-
DEAD:處于RUNNING狀態(tài)的線程,在執(zhí)行完run方法之后,就變成了DEAD狀態(tài)了。
-
BLOCKED:這種狀態(tài)指的是處于RUNNING狀態(tài)的線程,出于某種原因,比如調(diào)用了sleep方法、等待用戶輸入等而讓出當(dāng)前的CPU給其他的線程。
?
Q58:定義了類的顯式構(gòu)造函數(shù)之后,還可以使用默認(rèn)構(gòu)造函數(shù)嗎?
?
答案:如果沒有定義顯式構(gòu)造函數(shù),那么Java將提供一個(gè)默認(rèn)的無參數(shù)構(gòu)造函數(shù),但是如果定義了顯式構(gòu)造函數(shù)之后,就不能再調(diào)用默認(rèn)構(gòu)造函數(shù)。
?
Q59:可以有兩個(gè)方法,它們方法名和參數(shù)都相同,但返回值類型不同?
?
答案:相同的方法指的是方法名、參數(shù)以及返回類型都相同,因此返回類型不同的兩個(gè)方法是可以并存的。
?
Q60:以下代碼的輸出是什么?
?
?
答案:輸出為4
?
Q61:在沒有執(zhí)行main()的情況下,成功編譯了一個(gè)Java類,這一說法正確嗎?
?
答案:正確,雖然Java編譯器規(guī)定程序的入口點(diǎn)為staticmain,但是沒有main()還是能夠編譯,只是不能運(yùn)行。
?
Q62:我們可以在靜態(tài)方法中調(diào)用非靜態(tài)方法?
?
答案:非靜態(tài)方法歸類的對象所有,且具有對象的級(jí)別范圍,所以如果想要在靜態(tài)方法中調(diào)用非靜態(tài)方法,首先要?jiǎng)?chuàng)建類的對象,然后使用對象引用,調(diào)用這些方法。
?
Q63:為了運(yùn)行Java程序,必須設(shè)置兩個(gè)環(huán)境變量是什么?
?
答案:PATH變量和CLASSPATH變量。
?
Q64:Java中變量沒有初始化可以使用嗎?
?
答案:Java不會(huì)給變量分配默認(rèn)值,因此變量沒有初始化的情況下,程序會(huì)編譯失敗并給出錯(cuò)誤提示。
?
Q65:Java中的類可以繼承多個(gè)類嗎?
?
答案:Java不支持多重繼承。
?
Q66:Java中,構(gòu)造函數(shù)可以與類名不同嗎?
?
答案:不可以,Java的構(gòu)造函數(shù)必須與類名相同,如果不同,它將被視作普通函數(shù)。
?
Q67:Round(3.7)和Ceil(3.7)的輸出分別是什么?
?
答案:它們的輸出都是4。Round()遵循四舍五入,Ceil()遵循向上舍入。
?
Q68:Java中可以使用goto來轉(zhuǎn)到特定行嗎?
?
答案:不可以,Java中沒有g(shù)oto關(guān)鍵字。
?
Q69:已經(jīng)死亡的線程可以再次啟動(dòng)嗎?
?
答案:不可以。
?
Q70:以下類的聲明是否正確?
?
?
答案:不正確,抽象類不能被聲明為Final。
?
Q71:每個(gè)機(jī)器都需要JDK來運(yùn)行Java程序?
?
答案:JDK是Java的開發(fā)工具包,不是必需的,JRE才是必需的。
?
Q72:Equals()和==有什么區(qū)別?
?
答案:Java中,==操作比較的是兩個(gè)變量的值是否相等,對于引用型變量表示的是兩個(gè)變量在堆中存儲(chǔ)的地址是否相同,即棧中的內(nèi)容是否相同。
?
equals操作表示的兩個(gè)變量是否是對同一個(gè)對象的引用,即堆中的內(nèi)容是否相同
?
下例中,equals()返回true,而==操作符則返回false:
?
?
Q73:Java類中定義方法,可否使用其他語言代碼實(shí)現(xiàn),如C語言?
?
答案:可以,在基于原生開發(fā)的情況下,我們可以在Java類中定義公共靜態(tài)方法,但是不執(zhí)行,然后用另外一種語言(如C)實(shí)現(xiàn)。
?
Q74:如何在Java中定義析構(gòu)函數(shù)?
?
答案:Java類中沒必要定義析構(gòu)函數(shù),它有自己的垃圾回收機(jī)制,當(dāng)不再引用對象時(shí),會(huì)自動(dòng)執(zhí)行。
?
Q75:Java中變量可以既是局部變量又是靜態(tài)變量嗎?
?
答案:不能,將局部變量定義為靜態(tài)變量會(huì)導(dǎo)致編譯錯(cuò)誤。
?
Q76:Interface中可以有靜態(tài)方法嗎?
?
答案:Interface中的靜態(tài)方法是沒有意義的,靜態(tài)方法在類中不能被覆蓋,而Interface中的方法默認(rèn)都是抽象的,所以只能在實(shí)現(xiàn)Interface的類中實(shí)現(xiàn)。
?
Q77:在實(shí)現(xiàn)接口的類中,我們可以更改接口中定義的變量的值嗎?
?
答案:不能,接口中定義的變量大多都默認(rèn)是public、static和final等不可更改的常量。
?
Q78:Java中的垃圾回收機(jī)制能夠確保程序永遠(yuǎn)不會(huì)超出內(nèi)存?
?
答案:即使Java提供自動(dòng)垃圾回收,也不能確保程序不會(huì)超出內(nèi)存,因?yàn)榕c垃圾回收相比,Java對象的創(chuàng)建速度更快。
?
Q79:main()能否有除void之外的返回類型?
?
答案:不可以,main()必須返回值為void,程序才能成功執(zhí)行。
?
Q80:垃圾回收之后,還能否重新觸發(fā)并使用該對象?
?
答案:不能,一旦對象被回收之后,就不再存在于堆棧上,也就不能再次訪問和引用了。
?
Q81:在Java線程編程中,哪個(gè)方法是所有線程必須實(shí)現(xiàn)的?
?
答案:Run()是一個(gè)Runnable接口的方法,必須由所有線程實(shí)現(xiàn)。
?
Q82:如何在程序中控制數(shù)據(jù)庫連接,且每次只有一個(gè)線程可以進(jìn)行數(shù)據(jù)庫連接?
?
答案:應(yīng)用同步的概念來實(shí)現(xiàn),將數(shù)據(jù)庫相關(guān)代碼hs synchronized關(guān)鍵字的方法中,以便一次只有一個(gè)線程可以訪問它。
?
Q83:程序員手動(dòng)拋出異常怎么辦?
?
答案:為了處理手動(dòng)拋出的異常,我們可以使用throw關(guān)鍵字,并在catch中捕獲和處理異常。
?
?
Q84:如何實(shí)現(xiàn)一個(gè)類不允許其他類(甚至派生類)創(chuàng)建其對象?
?
答案:將該類的構(gòu)造函數(shù)聲明為private,那么它就不會(huì)被其他類訪問。
?
Q85:對象如何存儲(chǔ)在Java中?
?
答案:每個(gè)對象在創(chuàng)建時(shí)都會(huì)從堆棧中獲取內(nèi)存空間,被垃圾回收器銷毀之后,其空間將被釋放重新分配給其它對象。
?
Q86:如何確定堆棧上對象的實(shí)際大小?
?
答案:Java中,沒辦法確定對象的確切大小。
?
Q87:以下哪個(gè)類將分配更多的內(nèi)存?
?
A類:三種方法,四個(gè)變量,無對象
B類:五個(gè)方法,三個(gè)變量,無對象
?
答案:在創(chuàng)建對象之前,不會(huì)分配內(nèi)存,所以這兩個(gè)類都沒有分配內(nèi)存。
?
Q88:如果程序中沒有處理異常,會(huì)發(fā)生什么?
?
答案:如果沒有異常處理,那么程序?qū)⒅兄?#xff0c;且不會(huì)執(zhí)行異常拋出之后的語句。
?
Q89:如果定義了一個(gè)類定義了多個(gè)構(gòu)造函數(shù),那么是否可以在一個(gè)構(gòu)造函數(shù)中調(diào)用另一個(gè)構(gòu)造函數(shù)?
?
答案:如果一個(gè)類有多個(gè)構(gòu)造函數(shù),那么可以使用this()在一個(gè)構(gòu)造函數(shù)中調(diào)用另一個(gè)構(gòu)造函數(shù)。
?
Q90:什么是匿名類?
?
答案:匿名類是不能有名字的類,它們不能被引用,只能在創(chuàng)建時(shí)用New語句來聲明它們。
?
下例中,我們定義了一個(gè)匿名類:
?
?
Q91:數(shù)組聲明之后是否還可以改變其大小?
?
答案:數(shù)組是靜態(tài)的,一旦指定了大小,就不能改變。
?
Q92:應(yīng)用程序中有多個(gè)類,但只有一個(gè)main()可以嗎?
?
答案:可以,main()方法是Java應(yīng)用程序的入口方法,代碼總是從特定類的main方法開始。
?
Q93:如果我想要保留對象的數(shù)據(jù)以供以后使用,最好的做法是什么?
?
答案:使用序列化。
?
Q94:什么是局部類?
?
答案:如果我們在Java的特定塊中定義一個(gè)新類,那么這個(gè)類就被稱為局部類,它在局部范圍內(nèi)可用,在其定義的塊之外不可用。
?
Q95:String和StringBuffer都表示String對象,這兩個(gè)對象之間可以互相比較嗎?
?
答案:不可以。
?
Q96:Java提供了哪些API用于集合類的操作?
?
答案:Java提供了Collection API,可應(yīng)用于一組對象的,Collection API支持的重要類包括ArrayList、HashMap、TreeSet和TreeMap。
?
Q97:Java的類型轉(zhuǎn)換可以將所有其他類轉(zhuǎn)換為布爾類型嗎?
?
答案:不可以,其它原始類型不能轉(zhuǎn)換為布爾類型,布爾類型也不能轉(zhuǎn)換為其它原始數(shù)據(jù)類型。
?
Q98:方法的重寫允許返回類型不同嗎?
?
答案:方法的重寫要求子類的方法的名稱及參數(shù)必須和所覆蓋的方法相同,返回類型可以不同但必須是所覆蓋方法的子類。
?
?
Q99:所有異常類的基類是什么?
?
答案:Java.Lang.throwable。
?
Q100:構(gòu)造函數(shù)在繼承中的調(diào)用順序是什么?
?
答案:在繼承的情況下,創(chuàng)建派生類的新對象時(shí),首先調(diào)用父類的構(gòu)造函數(shù),然后調(diào)用派生類的構(gòu)造函數(shù)。
?
以上就是整理的100道Java程序員面試問題和答案,希望同學(xué)們在學(xué)好技術(shù)的基礎(chǔ)上,也能理解和掌握這些知識(shí),祝大家早日拿到滿意的offer!
?
最后
我建了一個(gè)qq群,正在學(xué)習(xí)Java的小伙伴可以進(jìn)群:127522921 ,純技術(shù)討論裙(你需要的PDF電子書,練習(xí)題,開發(fā)工具,練手項(xiàng)目,面試題,學(xué)習(xí)路線圖等都已經(jīng)給你準(zhǔn)備好了,群內(nèi)每天分享各種Java學(xué)習(xí)資料,鏈接容易失效,請自行進(jìn)群下載)
總結(jié)
以上是生活随笔為你收集整理的必看!100道Java程序员面试题(含答案)!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vbs整人小程序
- 下一篇: 企业网站应用模式之—LAMP架构的源码编