欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java常見面試題及答案匯總

 更新時間:2024年09月12日 11:09:23   作者:意疏  
本文提供Java面試題集錦,涵蓋封裝、繼承、多態(tài)等核心概念,旨在幫助求職者全面復(fù)習(xí),提升面試表現(xiàn),從基礎(chǔ)知識到實際應(yīng)用,內(nèi)容豐富,適合各類求職者,需要的朋友可以參考下

開篇說明

本面試題集錦旨在為即將參加Java相關(guān)職位面試的求職者提供一個全面的復(fù)習(xí)指南。通過精心挑選和編排的題目,幫助求職者系統(tǒng)地回顧和鞏固所學(xué)知識,提升面試應(yīng)對能力。

每一道題目都經(jīng)過深思熟慮,旨在模擬真實面試場景中的問題,既考察了基礎(chǔ)知識的掌握程度,也挑戰(zhàn)了應(yīng)聘者的實際應(yīng)用能力和創(chuàng)新思維。我們希望通過這些題目,能夠激發(fā)求職者的思考,幫助他們在面試中展現(xiàn)出最佳的自己。

無論你是初出茅廬的應(yīng)屆生,還是經(jīng)驗豐富的職場老手,本面試題集錦都將是你備戰(zhàn)Java面試的寶貴資源。我們期待每一位求職者都能通過這份指南,找到適合自己的職位,開啟職業(yè)生涯的新篇章。

并且這個文章一直在添加、隨時更新,希望可以和你一起進步。

祝你面試順利,前程似錦!

一、封裝 繼承 多態(tài)

1.封裝

  • 封裝是什么:
    封裝是一種面向?qū)ο缶幊痰母拍?,指將?shù)據(jù)和對數(shù)據(jù)的操作(方法)打包在一起,形成一個獨立的單元。封裝的目的是將數(shù)據(jù)和方法封裝在一個對象內(nèi)部,只暴露必要的接口給外部使用,隱藏對象的內(nèi)部細(xì)節(jié)和實現(xiàn)方式。通過封裝,可以提高代碼的可維護性、可重用性和安全性。封裝的關(guān)鍵是將相關(guān)的數(shù)據(jù)和方法進行組織和管理,形成一個統(tǒng)一的整體。

  • 關(guān)鍵字:private。
    被private修飾的成員,只能在本類進行訪問,針對private修飾的成員變量,如果需要被其他類使用,提供相應(yīng)的操作
    “get變量名()”方法,用于獲取成員變量的值,方法用public修飾。
    “set變量名(參數(shù))”方法,用于設(shè)置成員變量的值,方法用public修飾。

  • this關(guān)鍵字
    構(gòu)造方法只能調(diào)用一次,在創(chuàng)建對象的時候調(diào)用。
    在成員方法中:誰調(diào)用這個方法,那么this就指向那個對象。
    在構(gòu)造方法中:this指向新創(chuàng)建的那個對象
    this 關(guān)鍵字主要應(yīng)用:
    成員變量 成員方法、其它構(gòu)造方法。

  • 封裝思想
    是面向?qū)ο缶幊陶Z言對客觀世界的模擬,客觀世界里成員變量都是隱藏在對象內(nèi)部的,外界是無法直接操作的

  • 封裝原則
    將類的某些信息隱藏在類內(nèi)部,不允許外部程序直接訪問,而是通過該類提供的方法來實現(xiàn)對隱藏信息的操作和訪問
    成員變量private,提供對應(yīng)的getXxx()/setXxx()方法

  • 封裝好處
    通過方法來控制成員變量的操作,提高了代碼的安全性
    把代碼用方法進行封裝,提高了代碼的復(fù)用性
    隱藏對象的屬性和實現(xiàn)細(xì)節(jié),僅對外提供公共訪問方式,將變化隔離,便于使用,提高復(fù)用性和安全性。

2.繼承

  • 繼承是什么:
    Java中的繼承是面向?qū)ο缶幊蹋ˋOP)的一個核心概念,它允許新創(chuàng)建的類(統(tǒng)稱為子類或者派生類)繼承現(xiàn)有類(成為父類或基類)的屬性和方法。
    通過繼承,子類可以復(fù)用、拓展和修改父類的行為,提高了代碼的復(fù)用性,實現(xiàn)了多態(tài)。
    需要注意的是:
    Java只支持單繼承、即一個父類只能繼承一個直接父類。但是通過接口(interface),Java實現(xiàn)了多繼承的功能。

3.多態(tài)

  • 多態(tài)是什么:
    多態(tài)是一種抽象行為,它的主要作用是讓程序員可以面對抽象編程而不是具體的實現(xiàn)類,這樣子寫出來的代碼拓展性會更強。
    咱們來舉個例子:
    YiShu yshu = new School();
    這里YiShu是一個父類,含有一個工作的方法,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(); // 輸出 "吃飯"
    }
}
  • 在使用時,對象都是YiShu,但是new不同的實現(xiàn)類,表現(xiàn)的形式不同,這也就從字面上解釋了什么是多態(tài)。
    這里我們定義了基類 YiShu:
    包含一個名為 eat 的空方法,該方法打印出 “日常工作”。
    定義了派生類 Student:
    Student 類繼承自 YiShu。
    重寫了 eat 方法,并在其中打印 “吃飯”。
    Test 類中的 main 方法:
    創(chuàng)建了一個 YiShu 類型的引用變量 yiShu。
    實際上,通過這個引用變量指向的是 Student 類的一個新實例。
    調(diào)用 eat 方法時,Java 會查找實際對象類型 (Student) 中的方法實現(xiàn),而不是引用類型 (YiShu) 的實現(xiàn)。
    因此,當(dāng)調(diào)用 yiShu.eat() 時,盡管是通過 YiShu 類型的引用調(diào)用的,但由于多態(tài)的特性,實際上執(zhí)行的是 Student 類中的 eat 方法,所以輸出為 “吃飯”。
    這是 Java 多態(tài)性的典型例子,即子類可以覆蓋父類的方法來改變行為。

形成多態(tài)的三個條件:

  • 繼承:必須存在有繼承關(guān)系的子類和父類。這是實現(xiàn)多態(tài)的基礎(chǔ),因為多態(tài)依賴于不同類之間的相似性,即它們共享一個共同的超類(父類)。
  • 方法重寫:子類需要重寫父類中的方法。這意味著子類提供了與父類中同名方法不同的實現(xiàn),從而使得在運行時能夠根據(jù)對象的實際類型選擇合適的方法版本。
  • 父類引用指向子類對象:使用父類類型的引用變量指向子類對象。這樣,在調(diào)用方法時,會根據(jù)實際對象的類型決定調(diào)用哪個版本的方法,這就是動態(tài)綁定或多態(tài)性的體現(xiàn)

二、什么是重載,什么是重寫

  • 重載
    重載是指在同一個類中定義多個方法,它們具有相同的名字但參數(shù)列表有所不同。主要用于提供相同功能的不同實現(xiàn)。
    注意的是 和返回值沒有關(guān)系,
    方法的簽名是名字是名字和參數(shù)列表,不包括返回值。
    重載通常用于提供同一操作的不同實現(xiàn),例如構(gòu)造函數(shù)的重載,不同類型輸入的處理等。

  • 重寫
    在子類中定義一個與父類方法具有相同簽名(方法名、參數(shù)列表)的方法,方法返回類型與父類一直,或者是其子類。
    且子類方法定義的訪問修飾符,不能比父類更嚴(yán)格。例如父類方法是protected那么子類方法不能是private,但可以是public。
    子類方法拋出的異常必須與父類一致,或者是其父類異常的子類。

重寫通常用于在子類中提供的父類方法的具體實現(xiàn),以實現(xiàn)多態(tài)性。例如,子類對父類方法進行拓展或修改以適應(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 注解的主要作用是幫助確保正確實現(xiàn)了方法覆蓋,并提高了代碼的可讀性和健壯性。表明 Child 類中的 display() 方法是為了覆蓋 Parent 類中的相應(yīng)方法。

三、Javafinal、finally、finzlize各有什么區(qū)別

  • final:用于類、方法和變量,表示不可改變或者不可繼承
  • final是一個關(guān)鍵字,其可以用來修飾變量,方法以及類等,被修飾之后的部分
  • finally:用于try-catch塊中,無論是否拋出異常,finally塊中的代碼總會被執(zhí)行。
  • finalize:是Object類中的方法,供垃圾收集器在回收對象之前調(diào)用,但由于自身的局限以及不確定性,不推薦使用。

四、泛型的概念和作用

泛型可以把類型當(dāng)作參數(shù)一樣傳遞,使得像一些集合類可以明確存儲的對象類型,不用顯示地強制轉(zhuǎn)化(在沒泛型之前只能是Object,然后強制轉(zhuǎn)換)。

五、TCP/IP 協(xié)議

首先TCP協(xié)議是一個面向連接的、可靠的傳輸協(xié)議,它提供一種可靠的字節(jié)流,能保證數(shù)據(jù)完整、無損并且按順序到達。

TCP盡量連續(xù)不斷地測試網(wǎng)絡(luò)的負(fù)載并且控制發(fā)送數(shù)據(jù)的速度以避免網(wǎng)絡(luò)過載。另外,TCP試圖將數(shù)據(jù)按照規(guī)定的順序發(fā)送。

面向連接:數(shù)據(jù)傳輸之前客戶端和服務(wù)器端必須建立連接

可靠的:數(shù)據(jù)傳輸是有序的 要對數(shù)據(jù)進行校驗

TCP三次握手

為了保證客戶端和服務(wù)器端的可靠連接,TCP建立連接時必須要進行三次會話,也叫TCP三次握手,進行三次握手的目的是為了確認(rèn)雙方的接收能力和發(fā)送能力是否正常。

最開始的時候客戶端和服務(wù)器都是處于CLOSED關(guān)閉狀態(tài)。主動打開連接的為客戶端,被動打開連接的是服務(wù)器。
TCP服務(wù)器進程先創(chuàng)建傳輸控制塊TCB,時刻準(zhǔn)備接受客戶進程的連接請求,此時服務(wù)器就進入了 LISTEN 監(jiān)聽狀態(tài)
第一次握手 TCP客戶進程也是先創(chuàng)建傳輸控制塊TCB,然后向服務(wù)器發(fā)出連接請求報文,這是報文首部中的同部位SYN=1,同時選擇一個初始序列號 seq=x ,此時,TCP客戶端進程進入了 SYN-SENT 同步已發(fā)送狀態(tài)
第二次握手 TCP服務(wù)器收到請求報文后,如果同意連接,則會向客戶端發(fā)出確認(rèn)報文。確認(rèn)報文中應(yīng)該 ACK=1,SYN=1,確認(rèn)號是ack=x+1,同時也要為自己初始化一個序列號 seq=y,此時,TCP服務(wù)器進程進入了 SYN-RCVD 同步收到狀態(tài)
第三次握手 TCP客戶端收到確認(rèn)后,還要向服務(wù)器給出確認(rèn)。確認(rèn)報文的ACK=1,ack=y+1,自己的序列號seq=x+1,此時,TCP連接建立,客戶端進入ESTABLISHED已建立連接狀態(tài) 觸發(fā)三次握手

簡單解釋:

第一次握手: 客戶端向服務(wù)器端發(fā)送報文,證明客戶端的發(fā)送能力正常
第二次握手:服務(wù)器端接收到報文并向客戶端發(fā)送報文,證明服務(wù)器端的接收能力、發(fā)送能力正常
第三次握手:客戶端向服務(wù)器發(fā)送報文,證明客戶端的接收能力正常

通俗解釋:

以電話通聯(lián)為例:老王給老汪打電話建立通信
老王:老汪老汪,聽到請回答。
老汪:老王收到,聲音接受正常。
老王:受到收到,保持通聯(lián)。
必須觸發(fā)三次握手的主要原因是防止已經(jīng)失效的連接請求報文突然又傳送到了服務(wù)器,從而產(chǎn)生錯誤。

TCP的四次揮手

數(shù)據(jù)傳輸完畢后,終止TCP連接,雙方都可釋放連接。最開始的時候,客戶端和服務(wù)器都是處于ESTABLISHED狀態(tài),然后客戶端主動關(guān)閉,服務(wù)器被動關(guān)閉。
第一次揮手 客戶端發(fā)出連接釋放報文,并且停止發(fā)送數(shù)據(jù)。釋放數(shù)據(jù)報文首部,F(xiàn)IN=1,其序列號為seq=u(等于前面已經(jīng)傳送過來的數(shù)據(jù)的最后一個字節(jié)的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態(tài)
第二次揮手 服務(wù)器端接收到連接釋放報文后,發(fā)出確認(rèn)報文,ACK=1,ack=u+1,并且?guī)献约旱男蛄刑杝eq=v,此時,服務(wù)端就進入了CLOSE-WAIT 關(guān)閉等待狀態(tài)
第三次揮手 客戶端接收到服務(wù)器端的確認(rèn)請求后,客戶端就會進入FIN-WAIT-2(終止等待2)狀態(tài),等待服務(wù)器發(fā)送連接釋放報文,服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢后,就向客戶端發(fā)送連接釋放報文,服務(wù)器就進入了LAST-ACK(最后確認(rèn))狀態(tài),等待客戶端的確認(rèn)。
第四次揮手 客戶端收到服務(wù)器的連接釋放報文后,必須發(fā)出確認(rèn),ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態(tài),但此時TCP連接還未終止,必須要經(jīng)過2MSL后(最長報文壽命),當(dāng)客戶端撤銷相應(yīng)的TCB后,客戶端才會進入CLOSED關(guān)閉狀態(tài),服務(wù)器端接收到確認(rèn)報文后,會立即進入CLOSED關(guān)閉狀態(tài),到這里TCP連接就斷開了,四次揮手完成
客戶端等待2MSL主要原因是為了保證客戶端發(fā)送那個的第一個ACK報文能到到服務(wù)器,因為這個ACK報文可能丟失,并且2MSL是任何報文在網(wǎng)絡(luò)上存在的最長時間,超過這個時間報文將被丟棄,這樣新的連接中不會出現(xiàn)舊連接的請求報文。

六、get和post區(qū)別

1.get請求一般是去取獲取數(shù)據(jù)(其實也可以提交,但常見的是獲取數(shù)據(jù));

post請求一般是去提交數(shù)據(jù)。

2.get因為參數(shù)會放在url中,所以隱私性,安全性較差,請求的數(shù)據(jù)長度是有限制的,

不同的瀏覽器和服務(wù)器不同,一般限制在 2~8K 之間,更加常見的是 1k 以內(nèi);

post請求是沒有的長度限制,請求數(shù)據(jù)是放在body中;

3.get請求刷新服務(wù)器或者回退沒有影響,post請求回退時會重新提交數(shù)據(jù)請求。

4.get請求可以被緩存,post請求不會被緩存。

5.get請求會被保存在瀏覽器歷史記錄當(dāng)中,post不會。get請求可以被收藏為書簽,因為參數(shù)就是url中,但post不能。它的參數(shù)不在url中。

6.get請求只能進行url編碼(appliacation-x-www-form-urlencoded),post請求支持多種(multipart/form-data等)。

深入理解

1.GET 和 POST都是http請求方式, 底層都是 TCP/IP協(xié)議;通常GET 產(chǎn)生一個 TCP 數(shù)據(jù)包;POST 產(chǎn)生兩個 TCP 數(shù)據(jù)包(但firefox是發(fā)送一個數(shù)據(jù)包),

2.對于 GET 方式的請求,瀏覽器會把 http header 和 data 一并發(fā)送出去,服務(wù)器響應(yīng) 200(返回數(shù)據(jù))表示成功;

對于 POST,瀏覽器先發(fā)送 header,服務(wù)器響應(yīng) 100, 瀏覽器再繼續(xù)發(fā)送 data,服務(wù)器響應(yīng) 200 (返回數(shù)據(jù))。

總結(jié)

到此這篇關(guān)于java常見面試題及答案的文章就介紹到這了,更多相關(guān)java常見面試題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java arrayList遍歷的四種方法及Java中ArrayList類的用法

    java arrayList遍歷的四種方法及Java中ArrayList類的用法

    arraylist是動態(tài)數(shù)組,它具有三個好處分別是:動態(tài)的增加和減少元素 、實現(xiàn)了ICollection和IList接口、靈活的設(shè)置數(shù)組的大小,本文給大家介紹java arraylist遍歷及Java arraylist 用法,感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • java中使用@Transactional會有哪些坑

    java中使用@Transactional會有哪些坑

    在Java中,@Transactional是一個常用的注解,用于聲明方法應(yīng)該在一個事務(wù)的上下文中執(zhí)行,本文主要介紹了java中使用@Transactional會有哪些坑,感興趣的可以了解一下
    2024-04-04
  • Springboot如何使用mybatis實現(xiàn)攔截SQL分頁

    Springboot如何使用mybatis實現(xiàn)攔截SQL分頁

    這篇文章主要介紹了Springboot使用mybatis實現(xiàn)攔截SQL分頁,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • java實現(xiàn)學(xué)生教師管理系統(tǒng)

    java實現(xiàn)學(xué)生教師管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)學(xué)生教師管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 詳解Java泛型中類型擦除問題的解決方法

    詳解Java泛型中類型擦除問題的解決方法

    Java泛型的實現(xiàn)是不完整的,有時會遇到一些Java泛型類型擦除的問題。本文將詳細(xì)為大家講解Java泛型中類型擦除問題的解決方法,需要的可以參考一下
    2022-05-05
  • java實現(xiàn)簡單的拼圖游戲

    java實現(xiàn)簡單的拼圖游戲

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡單的拼圖游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Elasticsearch查詢Range Query語法示例

    Elasticsearch查詢Range Query語法示例

    這篇文章主要為大家介紹了Elasticsearch查詢Range Query語法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • springboot后端配置多個數(shù)據(jù)源、Mysql數(shù)據(jù)庫的便捷方法

    springboot后端配置多個數(shù)據(jù)源、Mysql數(shù)據(jù)庫的便捷方法

    實現(xiàn)springboot 后端配置多個數(shù)據(jù)源、Mysql數(shù)據(jù)庫,只需要新建 Mapper、實體類 相應(yīng)的文件夾,將不同數(shù)據(jù)源的文件保存到對應(yīng)的文件夾下,添加綁定數(shù)據(jù)庫配置Config,就可以輕松完成
    2021-08-08
  • java數(shù)字圖像處理基礎(chǔ)使用imageio寫圖像文件示例

    java數(shù)字圖像處理基礎(chǔ)使用imageio寫圖像文件示例

    這篇文章主要介紹了Java 2D的圖像處理API,文章討論和提及的API都是基于JDK6的,Java中寫一個圖像文件使用ImageIO對象即可,下面看代碼吧
    2014-01-01
  • Java通過調(diào)用FFMPEG獲取視頻時長

    Java通過調(diào)用FFMPEG獲取視頻時長

    這篇文章主要為大家詳細(xì)介紹了Java通過調(diào)用FFMPEG獲取視頻時長,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評論