除了掌握扎實(shí)的專業(yè)技能之外嗽元,你還需要一份《Java程序員面試寶典》才能在萬千面試者中殺出重圍,成功拿下offer喂击。
Q1:Java內(nèi)部類和子類之間有什么區(qū)別剂癌?
答案:內(nèi)部類是指在一個(gè)外部類的內(nèi)部再定義一個(gè)類,內(nèi)部類對(duì)外部類有訪問權(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è)對(duì)象都有自己的一組方法和變量蜈敢,并且可以獨(dú)立于其他對(duì)象來執(zhí)行其功能辜荠。另外,封裝也有數(shù)據(jù)隱藏的目的抓狭。
Q5:什么是 singleton class(單例類)伯病?并給出其用法的實(shí)際例子。
答案:單例類只能有一個(gè)實(shí)例否过,必須自己創(chuàng)建自己的唯一實(shí)例午笛,必須給所有其他對(duì)象提供這一實(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)鍵字是什么意思?請(qǐng)舉例說明
答案: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í)它所有的方法都必須是抽象的嗽仪。
抽象類是對(duì)類抽象荒勇,而接口是對(duì)行為的抽象。抽象類是對(duì)整個(gè)類整體進(jìn)行抽象闻坚,包括屬性沽翔、行為,但是接口卻是對(duì)類局部(行為)進(jìn)行抽象窿凤。
一個(gè)類可以實(shí)現(xiàn)多個(gè)接口仅偎,但它只能擴(kuò)展一個(gè)抽象類。
Q19:接口對(duì)抽象類的性能影響是什么雳殊?
答案:與抽象類相比橘沥,接口性能較慢。一個(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:對(duì)象在java中如何序列化赏酥?
答案:序列化是指把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過程喳整,只能將支持 java.io.Serializable 接口的對(duì)象寫入流中,每個(gè) serializable 對(duì)象的類都被編碼裸扶。
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)建對(duì)象時(shí)戒傻,都會(huì)調(diào)用構(gòu)造函數(shù)。例如蜂筹,下例中new創(chuàng)建了兩個(gè)對(duì)象需纳,構(gòu)造函數(shù)也被調(diào)用了兩次。
Q27:一個(gè)類可以有多個(gè)構(gòu)造函數(shù)嗎艺挪?
答案:是的不翩,一個(gè)類可以有多個(gè)具有不同參數(shù)的構(gòu)造函數(shù),創(chuàng)建對(duì)象的構(gòu)造函數(shù)取決于創(chuàng)建對(duì)象時(shí)傳遞的參數(shù)麻裳。
Q28:我們可以覆蓋類的靜態(tài)方法嗎口蝠?
答案:我們不能覆蓋靜態(tài)方法,靜態(tài)方法屬于一個(gè)類而不是單個(gè)對(duì)象津坑,并且在編譯時(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類的對(duì)象,這個(gè)對(duì)象可以使用String類的所有內(nèi)置方法耿币。
Q31:下面的示例中梳杏,共創(chuàng)建了多少個(gè)String對(duì)象?
答案:共創(chuàng)建了兩個(gè)java.Lang.String類的對(duì)象。s1和s3是對(duì)同一個(gè)對(duì)象的引用十性。
Q32:為什么Java中的String被稱為Immutable叭莫?
答案:Java中,string對(duì)象是不可變的烁试,一旦賦值不可更改雇初,如果更改,則會(huì)創(chuàng)建一個(gè)新對(duì)象减响。在下面的示例中靖诗,str是值為“Value One”的字符串對(duì)象:
當(dāng)分配一個(gè)新值時(shí),將創(chuàng)建一個(gè)新的String對(duì)象支示,并將引用移動(dòng)到新對(duì)象刊橘。:
Q33:數(shù)組和向量之間有什么區(qū)別?
答案:數(shù)組是對(duì)相同原始類型的數(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對(duì)象的值萍桌,而String是不可變的宵溅,每次數(shù)據(jù)更改都會(huì)創(chuàng)建一個(gè)新的String對(duì)象,增加額外開銷上炎,所以在數(shù)據(jù)更改很多的情況下恃逻,StringBuffer是一個(gè)更好的選擇雏搂。
Q38:每個(gè)switch語句后使用break的目的是什么?
答案:switch使用break可以在執(zhí)行完這個(gè)語句后中斷寇损,如果不使用break凸郑,那么它將把所有情況都執(zhí)行一遍。
Q39:如何在Java中完成垃圾回收矛市?
答案:Java中芙沥,對(duì)象不被引用時(shí),垃圾回收就會(huì)發(fā)生浊吏,對(duì)象會(huì)被自動(dòng)銷毀而昨,調(diào)用System.gc()方法或Runtime.gc()方法。
Q40:可以在Main()方法前執(zhí)行代碼找田?
答案:如果我們要在類加載時(shí)歌憨,對(duì)象創(chuàng)建之前執(zhí)行語句,可以在類中使用靜態(tài)代碼塊墩衙,這樣即使在main方法中創(chuàng)建對(duì)象之前务嫡,此靜態(tài)代碼塊中的語句都將在加載類時(shí)執(zhí)行一次。
Q41:一個(gè)類可以同時(shí)既是父類也是子類嗎漆改?請(qǐng)舉例說明心铃?
答案:如果使用了繼承層次結(jié)構(gòu),那么這個(gè)類就可能既是一個(gè)類的父類也是另一個(gè)類的子類籽懦,如下例中的大陸類既是世界類的子類于个,同時(shí)也是國家類的父類。
Q42:如果類中沒有定義構(gòu)造函數(shù)暮顺,那么類的對(duì)象將會(huì)怎么創(chuàng)建?
答案:即使類沒有定義顯式構(gòu)造函數(shù)秀存,對(duì)象在創(chuàng)建時(shí)也會(huì)執(zhí)行隱式構(gòu)造函數(shù)捶码,且該構(gòu)造函數(shù)沒有參數(shù)。
Q43:在多線程中或链,如何確保資源不會(huì)同時(shí)被多個(gè)線程使用惫恼?
答案:在多線程中,可以通過使用同步的概念來控制對(duì)多個(gè)線程之間共享的資源的訪問澳盐。使用synchronized關(guān)鍵字祈纯,我們可以確保只有一個(gè)線程可以一段時(shí)間內(nèi)使用共享資源。
Q44:我們是否可以為對(duì)象多次調(diào)用類的構(gòu)造函數(shù)叼耙?
答案:使用new創(chuàng)建對(duì)象時(shí)腕窥,會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),對(duì)象創(chuàng)建之后筛婉,則無法再調(diào)用該構(gòu)造函數(shù)簇爆。
Q45:兩個(gè)類classA和classB都在同一個(gè)包中,那么classA的私有成員可以被classB的對(duì)象訪問嗎?
答案:類的私有成員在該類的范圍之外是不可訪問的入蛆,即使在同一個(gè)包中也不能訪問任何其他類响蓉。
Q46:同一類中可以定義重名的方法嗎?
答案:可以定義重名的方法哨毁,但是其參數(shù)的數(shù)量和類型是不同的枫甲,調(diào)用哪個(gè)方法取決于傳遞的參數(shù)。
例如在下面的類中扼褪,我們有兩個(gè)具有相同名稱但不同參數(shù)的打印方法想幻。根據(jù)參數(shù),將調(diào)用適當(dāng)?shù)膮?shù):
Q47:如何制作一個(gè)Java對(duì)象的副本迎捺?
答案:使用克隆举畸,我們可以創(chuàng)建具有對(duì)象的實(shí)際狀態(tài)的副本。Clone()是Cloneable interface的方法凳枝,因此需要實(shí)現(xiàn)Cloneable interface來進(jìn)行對(duì)象拷貝抄沮。
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)绾谓剐蛄谢兞浚?/p>
答案:想要某些變量不被序列化,那么可以在聲明時(shí)使用關(guān)鍵字transient叫搁。例如赔桌,下面的變量trans_var是一個(gè)臨時(shí)變量供炎,不能被序列化:
Q55:我們?nèi)绾问褂迷紨?shù)據(jù)類型作為對(duì)象?
答案:Java提倡“一切皆為對(duì)象”疾党,引用數(shù)據(jù)類型可以實(shí)例化為對(duì)象音诫,基本數(shù)據(jù)類型卻無法變?yōu)閷?duì)象,針對(duì)這一不足雪位,JAVA中設(shè)置了包裝類竭钝,例如,Integer是原始數(shù)據(jù)類型int的包裝類雹洗。
Q56:編譯時(shí)會(huì)遇到哪些類型的異常香罐?
答案:程序編譯時(shí)可以捕獲被檢查的異常,為了成功編譯代碼时肿,異常會(huì)通過try...catch來處理庇茫。
Q57:請(qǐng)描述一下線程的不同狀態(tài)。
答案:Java中的線程往往是處于下面的某一種狀態(tài)
NEW:通過New關(guān)鍵字創(chuàng)建了Thread類(或其子類)的對(duì)象
RUNNABLE:這種情況指的是Thread類的對(duì)象調(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)方法歸類的對(duì)象所有,且具有對(duì)象的級(jí)別范圍丙躏,所以如果想要在靜態(tài)方法中調(diào)用非靜態(tài)方法择示,首先要?jiǎng)?chuàng)建類的對(duì)象,然后使用對(duì)象引用晒旅,調(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è)變量的值是否相等嫌佑,對(duì)于引用型變量表示的是兩個(gè)變量在堆中存儲(chǔ)的地址是否相同,即棧中的內(nèi)容是否相同侨歉。
equals操作表示的兩個(gè)變量是否是對(duì)同一個(gè)對(duì)象的引用屋摇,即堆中的內(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)不再引用對(duì)象時(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對(duì)象的創(chuàng)建速度更快辱挥。
Q79:main()能否有除void之外的返回類型?
答案:不可以边涕,main()必須返回值為void晤碘,程序才能成功執(zhí)行。
Q80:垃圾回收之后功蜓,還能否重新觸發(fā)并使用該對(duì)象园爷?
答案:不能,一旦對(duì)象被回收之后式撼,就不再存在于堆棧上童社,也就不能再次訪問和引用了。
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)建其對(duì)象劈榨?
答案:將該類的構(gòu)造函數(shù)聲明為private,那么它就不會(huì)被其他類訪問晦嵌。
Q85:對(duì)象如何存儲(chǔ)在Java中同辣?
答案:每個(gè)對(duì)象在創(chuàng)建時(shí)都會(huì)從堆棧中獲取內(nèi)存空間,被垃圾回收器銷毀之后惭载,其空間將被釋放重新分配給其它對(duì)象旱函。
Q86:如何確定堆棧上對(duì)象的實(shí)際大小描滔?
答案:Java中棒妨,沒辦法確定對(duì)象的確切大小。
Q87:以下哪個(gè)類將分配更多的內(nèi)存含长?
A類:三種方法券腔,四個(gè)變量伏穆,無對(duì)象
B類:五個(gè)方法,三個(gè)變量纷纫,無對(duì)象
答案:在創(chuàng)建對(duì)象之前枕扫,不會(huì)分配內(nèi)存,所以這兩個(gè)類都沒有分配內(nèi)存辱魁。
Q88:如果程序中沒有處理異常烟瞧,會(huì)發(fā)生什么?
答案:如果沒有異常處理染簇,那么程序?qū)⒅兄共蔚危也粫?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:如果我想要保留對(duì)象的數(shù)據(jù)以供以后使用辰斋,最好的做法是什么?
答案:使用序列化瘸味。
Q94:什么是局部類宫仗?
答案:如果我們?cè)贘ava的特定塊中定義一個(gè)新類,那么這個(gè)類就被稱為局部類旁仿,它在局部范圍內(nèi)可用藕夫,在其定義的塊之外不可用。
Q95:String和StringBuffer都表示String對(duì)象,這兩個(gè)對(duì)象之間可以互相比較嗎汁胆?
答案:不可以梭姓。
Q96:Java提供了哪些API用于集合類的操作?
答案:Java提供了Collection API嫩码,可應(yīng)用于一組對(duì)象的,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)建派生類的新對(duì)象時(shí),首先調(diào)用父類的構(gòu)造函數(shù)臂外,然后調(diào)用派生類的構(gòu)造函數(shù)窟扑。
以上就是整理的100道Java程序員面試問題和答案,希望同學(xué)們?cè)趯W(xué)好技術(shù)的基礎(chǔ)上漏健,也能理解和掌握這些知識(shí)嚎货,祝大家早日拿到滿意的offer!