java常見面試題及答案匯總
開篇說明
本面試題集錦旨在為即將參加Java相關(guān)職位面試的求職者提供一個(gè)全面的復(fù)習(xí)指南。通過精心挑選和編排的題目,幫助求職者系統(tǒng)地回顧和鞏固所學(xué)知識,提升面試應(yīng)對能力。
每一道題目都經(jīng)過深思熟慮,旨在模擬真實(shí)面試場景中的問題,既考察了基礎(chǔ)知識的掌握程度,也挑戰(zhàn)了應(yīng)聘者的實(shí)際應(yīng)用能力和創(chuàng)新思維。我們希望通過這些題目,能夠激發(fā)求職者的思考,幫助他們在面試中展現(xiàn)出最佳的自己。
無論你是初出茅廬的應(yīng)屆生,還是經(jīng)驗(yàn)豐富的職場老手,本面試題集錦都將是你備戰(zhàn)Java面試的寶貴資源。我們期待每一位求職者都能通過這份指南,找到適合自己的職位,開啟職業(yè)生涯的新篇章。
并且這個(gè)文章一直在添加、隨時(shí)更新,希望可以和你一起進(jìn)步。
祝你面試順利,前程似錦!
一、封裝 繼承 多態(tài)
1.封裝
封裝是什么:
封裝是一種面向?qū)ο缶幊痰母拍?,指將?shù)據(jù)和對數(shù)據(jù)的操作(方法)打包在一起,形成一個(gè)獨(dú)立的單元。封裝的目的是將數(shù)據(jù)和方法封裝在一個(gè)對象內(nèi)部,只暴露必要的接口給外部使用,隱藏對象的內(nèi)部細(xì)節(jié)和實(shí)現(xiàn)方式。通過封裝,可以提高代碼的可維護(hù)性、可重用性和安全性。封裝的關(guān)鍵是將相關(guān)的數(shù)據(jù)和方法進(jìn)行組織和管理,形成一個(gè)統(tǒng)一的整體。關(guān)鍵字:private。
被private修飾的成員,只能在本類進(jìn)行訪問,針對private修飾的成員變量,如果需要被其他類使用,提供相應(yīng)的操作
“get變量名()”方法,用于獲取成員變量的值,方法用public修飾。
“set變量名(參數(shù))”方法,用于設(shè)置成員變量的值,方法用public修飾。this關(guān)鍵字
構(gòu)造方法只能調(diào)用一次,在創(chuàng)建對象的時(shí)候調(diào)用。
在成員方法中:誰調(diào)用這個(gè)方法,那么this就指向那個(gè)對象。
在構(gòu)造方法中:this指向新創(chuàng)建的那個(gè)對象
this 關(guān)鍵字主要應(yīng)用:
成員變量 成員方法、其它構(gòu)造方法。封裝思想
是面向?qū)ο缶幊陶Z言對客觀世界的模擬,客觀世界里成員變量都是隱藏在對象內(nèi)部的,外界是無法直接操作的封裝原則
將類的某些信息隱藏在類內(nèi)部,不允許外部程序直接訪問,而是通過該類提供的方法來實(shí)現(xiàn)對隱藏信息的操作和訪問
成員變量private,提供對應(yīng)的getXxx()/setXxx()方法封裝好處
通過方法來控制成員變量的操作,提高了代碼的安全性
把代碼用方法進(jìn)行封裝,提高了代碼的復(fù)用性
隱藏對象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對外提供公共訪問方式,將變化隔離,便于使用,提高復(fù)用性和安全性。
2.繼承
- 繼承是什么:
Java中的繼承是面向?qū)ο缶幊蹋ˋOP)的一個(gè)核心概念,它允許新創(chuàng)建的類(統(tǒng)稱為子類或者派生類)繼承現(xiàn)有類(成為父類或基類)的屬性和方法。
通過繼承,子類可以復(fù)用、拓展和修改父類的行為,提高了代碼的復(fù)用性,實(shí)現(xiàn)了多態(tài)。
需要注意的是:
Java只支持單繼承、即一個(gè)父類只能繼承一個(gè)直接父類。但是通過接口(interface),Java實(shí)現(xiàn)了多繼承的功能。
3.多態(tài)
- 多態(tài)是什么:
多態(tài)是一種抽象行為,它的主要作用是讓程序員可以面對抽象編程而不是具體的實(shí)現(xiàn)類,這樣子寫出來的代碼拓展性會更強(qiáng)。
咱們來舉個(gè)例子:
YiShu yshu = new School();
這里YiShu是一個(gè)父類,含有一個(gè)工作的方法,Student重寫工作方法,比如吃飯
class YiShu { void eat() { System.out.println("日常工作"); } } class Student extends YiShu { @Override void eat() { System.out.println("吃飯"); } } public class Test { public static void main(String[] args) { YiShu yiShu = new Student(); yiShu.eat(); // 輸出 "吃飯" } }
- 在使用時(shí),對象都是YiShu,但是new不同的實(shí)現(xiàn)類,表現(xiàn)的形式不同,這也就從字面上解釋了什么是多態(tài)。
這里我們定義了基類 YiShu:
包含一個(gè)名為 eat 的空方法,該方法打印出 “日常工作”。
定義了派生類 Student:
Student 類繼承自 YiShu。
重寫了 eat 方法,并在其中打印 “吃飯”。
Test 類中的 main 方法:
創(chuàng)建了一個(gè) YiShu 類型的引用變量 yiShu。
實(shí)際上,通過這個(gè)引用變量指向的是 Student 類的一個(gè)新實(shí)例。
調(diào)用 eat 方法時(shí),Java 會查找實(shí)際對象類型 (Student) 中的方法實(shí)現(xiàn),而不是引用類型 (YiShu) 的實(shí)現(xiàn)。
因此,當(dāng)調(diào)用 yiShu.eat() 時(shí),盡管是通過 YiShu 類型的引用調(diào)用的,但由于多態(tài)的特性,實(shí)際上執(zhí)行的是 Student 類中的 eat 方法,所以輸出為 “吃飯”。
這是 Java 多態(tài)性的典型例子,即子類可以覆蓋父類的方法來改變行為。
形成多態(tài)的三個(gè)條件:
- 繼承:必須存在有繼承關(guān)系的子類和父類。這是實(shí)現(xiàn)多態(tài)的基礎(chǔ),因?yàn)槎鄳B(tài)依賴于不同類之間的相似性,即它們共享一個(gè)共同的超類(父類)。
- 方法重寫:子類需要重寫父類中的方法。這意味著子類提供了與父類中同名方法不同的實(shí)現(xiàn),從而使得在運(yùn)行時(shí)能夠根據(jù)對象的實(shí)際類型選擇合適的方法版本。
- 父類引用指向子類對象:使用父類類型的引用變量指向子類對象。這樣,在調(diào)用方法時(shí),會根據(jù)實(shí)際對象的類型決定調(diào)用哪個(gè)版本的方法,這就是動態(tài)綁定或多態(tài)性的體現(xiàn)
二、什么是重載,什么是重寫
重載
重載是指在同一個(gè)類中定義多個(gè)方法,它們具有相同的名字但參數(shù)列表有所不同。主要用于提供相同功能的不同實(shí)現(xiàn)。
注意的是 和返回值沒有關(guān)系,
方法的簽名是名字是名字和參數(shù)列表,不包括返回值。
重載通常用于提供同一操作的不同實(shí)現(xiàn),例如構(gòu)造函數(shù)的重載,不同類型輸入的處理等。重寫
在子類中定義一個(gè)與父類方法具有相同簽名(方法名、參數(shù)列表)的方法,方法返回類型與父類一直,或者是其子類。
且子類方法定義的訪問修飾符,不能比父類更嚴(yán)格。例如父類方法是protected
那么子類方法不能是private
,但可以是public
。
子類方法拋出的異常必須與父類一致,或者是其父類異常的子類。
重寫通常用于在子類中提供的父類方法的具體實(shí)現(xiàn),以實(shí)現(xiàn)多態(tài)性。例如,子類對父類方法進(jìn)行拓展或修改以適應(yīng)特定需求。
class YiShu { public void eat() { System.out.println("日常工作"); } } class Student extends YiShu { @Override public void eat() { System.out.println("吃飯"); } } public class Test { public static void main(String[] args) { YiShu yiShu = new Student(); yiShu.eat(); // 輸出 "吃飯" } }
這里@Override 注解的主要作用是幫助確保正確實(shí)現(xiàn)了方法覆蓋,并提高了代碼的可讀性和健壯性。表明 Child 類中的 display() 方法是為了覆蓋 Parent 類中的相應(yīng)方法。
三、Javafinal、finally、finzlize各有什么區(qū)別
- final:用于類、方法和變量,表示不可改變或者不可繼承
- final是一個(gè)關(guān)鍵字,其可以用來修飾變量,方法以及類等,被修飾之后的部分
- finally:用于try-catch塊中,無論是否拋出異常,finally塊中的代碼總會被執(zhí)行。
- finalize:是Object類中的方法,供垃圾收集器在回收對象之前調(diào)用,但由于自身的局限以及不確定性,不推薦使用。
四、泛型的概念和作用
泛型可以把類型當(dāng)作參數(shù)一樣傳遞,使得像一些集合類可以明確存儲的對象類型,不用顯示地強(qiáng)制轉(zhuǎn)化(在沒泛型之前只能是Object,然后強(qiáng)制轉(zhuǎn)換)。
五、TCP/IP 協(xié)議
首先TCP協(xié)議是一個(gè)面向連接的、可靠的傳輸協(xié)議,它提供一種可靠的字節(jié)流,能保證數(shù)據(jù)完整、無損并且按順序到達(dá)。
TCP盡量連續(xù)不斷地測試網(wǎng)絡(luò)的負(fù)載并且控制發(fā)送數(shù)據(jù)的速度以避免網(wǎng)絡(luò)過載。另外,TCP試圖將數(shù)據(jù)按照規(guī)定的順序發(fā)送。
面向連接:數(shù)據(jù)傳輸之前客戶端和服務(wù)器端必須建立連接
可靠的:數(shù)據(jù)傳輸是有序的 要對數(shù)據(jù)進(jìn)行校驗(yàn)
TCP三次握手
為了保證客戶端和服務(wù)器端的可靠連接,TCP建立連接時(shí)必須要進(jìn)行三次會話,也叫TCP三次握手,進(jìn)行三次握手的目的是為了確認(rèn)雙方的接收能力和發(fā)送能力是否正常。
最開始的時(shí)候客戶端和服務(wù)器都是處于CLOSED關(guān)閉狀態(tài)。主動打開連接的為客戶端,被動打開連接的是服務(wù)器。
TCP服務(wù)器進(jìn)程先創(chuàng)建傳輸控制塊TCB,時(shí)刻準(zhǔn)備接受客戶進(jìn)程的連接請求,此時(shí)服務(wù)器就進(jìn)入了 LISTEN 監(jiān)聽狀態(tài)
第一次握手 TCP客戶進(jìn)程也是先創(chuàng)建傳輸控制塊TCB,然后向服務(wù)器發(fā)出連接請求報(bào)文,這是報(bào)文首部中的同部位SYN=1,同時(shí)選擇一個(gè)初始序列號 seq=x ,此時(shí),TCP客戶端進(jìn)程進(jìn)入了 SYN-SENT 同步已發(fā)送狀態(tài)
第二次握手 TCP服務(wù)器收到請求報(bào)文后,如果同意連接,則會向客戶端發(fā)出確認(rèn)報(bào)文。確認(rèn)報(bào)文中應(yīng)該 ACK=1,SYN=1,確認(rèn)號是ack=x+1,同時(shí)也要為自己初始化一個(gè)序列號 seq=y,此時(shí),TCP服務(wù)器進(jìn)程進(jìn)入了 SYN-RCVD 同步收到狀態(tài)
第三次握手 TCP客戶端收到確認(rèn)后,還要向服務(wù)器給出確認(rèn)。確認(rèn)報(bào)文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時(shí),TCP連接建立,客戶端進(jìn)入ESTABLISHED已建立連接狀態(tài) 觸發(fā)三次握手
簡單解釋:
第一次握手: 客戶端向服務(wù)器端發(fā)送報(bào)文,證明客戶端的發(fā)送能力正常
第二次握手:服務(wù)器端接收到報(bào)文并向客戶端發(fā)送報(bào)文,證明服務(wù)器端的接收能力、發(fā)送能力正常
第三次握手:客戶端向服務(wù)器發(fā)送報(bào)文,證明客戶端的接收能力正常
通俗解釋:
以電話通聯(lián)為例:老王給老汪打電話建立通信
老王:老汪老汪,聽到請回答。
老汪:老王收到,聲音接受正常。
老王:受到收到,保持通聯(lián)。
必須觸發(fā)三次握手的主要原因是防止已經(jīng)失效的連接請求報(bào)文突然又傳送到了服務(wù)器,從而產(chǎn)生錯(cuò)誤。
TCP的四次揮手
數(shù)據(jù)傳輸完畢后,終止TCP連接,雙方都可釋放連接。最開始的時(shí)候,客戶端和服務(wù)器都是處于ESTABLISHED狀態(tài),然后客戶端主動關(guān)閉,服務(wù)器被動關(guān)閉。
第一次揮手 客戶端發(fā)出連接釋放報(bào)文,并且停止發(fā)送數(shù)據(jù)。釋放數(shù)據(jù)報(bào)文首部,F(xiàn)IN=1,其序列號為seq=u(等于前面已經(jīng)傳送過來的數(shù)據(jù)的最后一個(gè)字節(jié)的序號加1),此時(shí),客戶端進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)
第二次揮手 服務(wù)器端接收到連接釋放報(bào)文后,發(fā)出確認(rèn)報(bào)文,ACK=1,ack=u+1,并且?guī)献约旱男蛄刑杝eq=v,此時(shí),服務(wù)端就進(jìn)入了CLOSE-WAIT 關(guān)閉等待狀態(tài)
第三次揮手 客戶端接收到服務(wù)器端的確認(rèn)請求后,客戶端就會進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài),等待服務(wù)器發(fā)送連接釋放報(bào)文,服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢后,就向客戶端發(fā)送連接釋放報(bào)文,服務(wù)器就進(jìn)入了LAST-ACK(最后確認(rèn))狀態(tài),等待客戶端的確認(rèn)。
第四次揮手 客戶端收到服務(wù)器的連接釋放報(bào)文后,必須發(fā)出確認(rèn),ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時(shí),客戶端就進(jìn)入了TIME-WAIT(時(shí)間等待)狀態(tài),但此時(shí)TCP連接還未終止,必須要經(jīng)過2MSL后(最長報(bào)文壽命),當(dāng)客戶端撤銷相應(yīng)的TCB后,客戶端才會進(jìn)入CLOSED關(guān)閉狀態(tài),服務(wù)器端接收到確認(rèn)報(bào)文后,會立即進(jìn)入CLOSED關(guān)閉狀態(tài),到這里TCP連接就斷開了,四次揮手完成
客戶端等待2MSL主要原因是為了保證客戶端發(fā)送那個(gè)的第一個(gè)ACK報(bào)文能到到服務(wù)器,因?yàn)檫@個(gè)ACK報(bào)文可能丟失,并且2MSL是任何報(bào)文在網(wǎng)絡(luò)上存在的最長時(shí)間,超過這個(gè)時(shí)間報(bào)文將被丟棄,這樣新的連接中不會出現(xiàn)舊連接的請求報(bào)文。
六、get和post區(qū)別
1.get請求一般是去取獲取數(shù)據(jù)(其實(shí)也可以提交,但常見的是獲取數(shù)據(jù));
post請求一般是去提交數(shù)據(jù)。
2.get因?yàn)閰?shù)會放在url中,所以隱私性,安全性較差,請求的數(shù)據(jù)長度是有限制的,
不同的瀏覽器和服務(wù)器不同,一般限制在 2~8K 之間,更加常見的是 1k 以內(nèi);
post請求是沒有的長度限制,請求數(shù)據(jù)是放在body中;
3.get請求刷新服務(wù)器或者回退沒有影響,post請求回退時(shí)會重新提交數(shù)據(jù)請求。
4.get請求可以被緩存,post請求不會被緩存。
5.get請求會被保存在瀏覽器歷史記錄當(dāng)中,post不會。get請求可以被收藏為書簽,因?yàn)閰?shù)就是url中,但post不能。它的參數(shù)不在url中。
6.get請求只能進(jìn)行url編碼(appliacation-x-www-form-urlencoded),post請求支持多種(multipart/form-data等)。
深入理解
1.GET 和 POST都是http請求方式, 底層都是 TCP/IP協(xié)議;通常GET 產(chǎn)生一個(gè) TCP 數(shù)據(jù)包;POST 產(chǎn)生兩個(gè) TCP 數(shù)據(jù)包(但firefox是發(fā)送一個(gè)數(shù)據(jù)包),
2.對于 GET 方式的請求,瀏覽器會把 http header 和 data 一并發(fā)送出去,服務(wù)器響應(yīng) 200(返回?cái)?shù)據(jù))表示成功;
對于 POST,瀏覽器先發(fā)送 header,服務(wù)器響應(yīng) 100, 瀏覽器再繼續(xù)發(fā)送 data,服務(wù)器響應(yīng) 200 (返回?cái)?shù)據(jù))。
總結(jié)
到此這篇關(guān)于java常見面試題及答案的文章就介紹到這了,更多相關(guān)java常見面試題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java arrayList遍歷的四種方法及Java中ArrayList類的用法
arraylist是動態(tài)數(shù)組,它具有三個(gè)好處分別是:動態(tài)的增加和減少元素 、實(shí)現(xiàn)了ICollection和IList接口、靈活的設(shè)置數(shù)組的大小,本文給大家介紹java arraylist遍歷及Java arraylist 用法,感興趣的朋友一起學(xué)習(xí)吧2015-11-11Springboot如何使用mybatis實(shí)現(xiàn)攔截SQL分頁
這篇文章主要介紹了Springboot使用mybatis實(shí)現(xiàn)攔截SQL分頁,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06java實(shí)現(xiàn)學(xué)生教師管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)學(xué)生教師管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10Elasticsearch查詢Range Query語法示例
這篇文章主要為大家介紹了Elasticsearch查詢Range Query語法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04springboot后端配置多個(gè)數(shù)據(jù)源、Mysql數(shù)據(jù)庫的便捷方法
實(shí)現(xiàn)springboot 后端配置多個(gè)數(shù)據(jù)源、Mysql數(shù)據(jù)庫,只需要新建 Mapper、實(shí)體類 相應(yīng)的文件夾,將不同數(shù)據(jù)源的文件保存到對應(yīng)的文件夾下,添加綁定數(shù)據(jù)庫配置Config,就可以輕松完成2021-08-08java數(shù)字圖像處理基礎(chǔ)使用imageio寫圖像文件示例
這篇文章主要介紹了Java 2D的圖像處理API,文章討論和提及的API都是基于JDK6的,Java中寫一個(gè)圖像文件使用ImageIO對象即可,下面看代碼吧2014-01-01Java通過調(diào)用FFMPEG獲取視頻時(shí)長
這篇文章主要為大家詳細(xì)介紹了Java通過調(diào)用FFMPEG獲取視頻時(shí)長,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04