面試題-Java基礎(chǔ)

前言

Java基礎(chǔ)部分的題目,是我根據(jù)Java Guide的面試突擊版本V3.0再整理出來(lái)的,其中,我選擇了一些比較重要的問(wèn)題,并重新做出相應(yīng)回答,希望對(duì)大家起到一定的幫助。

Java基礎(chǔ)

  1. 什么是面向?qū)ο缶幊蹋棵嫦驅(qū)ο缶幊淌侵甘褂?strong>類作為代碼組織的基本單元,并將封裝、繼承、多態(tài)作為代碼設(shè)計(jì)和實(shí)現(xiàn)的基石。

  2. 面向?qū)ο缶幊毯兔嫦蜻^(guò)程編程有什么區(qū)別?和面向?qū)ο笙啾?,面向過(guò)程的代碼組織基本單元是方法,數(shù)據(jù)和方法是相分離的,并且不支持面向?qū)ο蟮奶匦裕热纾悍庋b繼承多態(tài)等等

  3. 重載和重寫的區(qū)別?

    • 重載是編譯期由編譯器來(lái)確定具體要調(diào)用的方法;重寫是運(yùn)行時(shí)期由虛擬機(jī)確定的
    • 重載關(guān)注方法名+參數(shù),不關(guān)心返回值;重寫的返回值、方法名和參數(shù)都必須相同,修飾范圍要大于等于父類;拋出異常要小于等于父類
  4. Java ?向?qū)ο缶幊倘?特性: 封裝 繼承 多態(tài)

    • 封裝:安全性(對(duì)代碼自身來(lái)說(shuō));易用性(對(duì)代碼調(diào)用者來(lái)說(shuō))
    • 繼承:解決代碼復(fù)用的問(wèn)題
    • 多態(tài):提高代碼的擴(kuò)展性和復(fù)用性,以遍歷數(shù)據(jù)結(jié)構(gòu)為例
      • 如果沒有多態(tài),print方法的參數(shù)需要傳遞不同的數(shù)據(jù)結(jié)構(gòu),編寫多個(gè);有了多態(tài),直接傳遞接口即可---》提高了代碼的復(fù)用性
      • 有多態(tài),我們要添加新的數(shù)據(jù)結(jié)構(gòu)時(shí),只需要編寫一個(gè)新的類實(shí)現(xiàn)接口即可,不需要修改print的代碼。---》提高了代碼的可擴(kuò)展性
  5. 在?個(gè)靜態(tài)?法內(nèi)調(diào)??個(gè)?靜態(tài)成員為什么是?法的? 非靜態(tài)成員,需要在對(duì)象實(shí)例化時(shí)進(jìn)行賦值;靜態(tài)方法本身不需要通過(guò)實(shí)例化的對(duì)象調(diào)用,所以在調(diào)用方法時(shí),很有可能沒有實(shí)例化對(duì)象,自然就無(wú)法調(diào)用非靜態(tài)成員。

  6. 在 Java 中定義?個(gè)不做事且沒有參數(shù)的構(gòu)造?法的作??當(dāng)子類需要實(shí)例化時(shí),會(huì)首先實(shí)例化父類,若沒有顯示調(diào)用super方法,那么會(huì)自動(dòng)調(diào)用父類沒有參數(shù)的構(gòu)造方法。如果沒有這個(gè)構(gòu)造方法,就出錯(cuò)了。

  7. 接?和抽象類的區(qū)別是什么?

    • 抽象類最主要是為了解決代碼復(fù)用的問(wèn)題,子類和抽象父類是is-a的關(guān)系。(具體項(xiàng)目中,我把協(xié)議中的相同部分抽取出來(lái),編寫了AbstraceCommand和AbstraceMessage,里面包含了所有指令相同的部分,包括:消息頭、類型字段等等,每個(gè)子類也有自己的成員屬性,在子類構(gòu)造方法中會(huì)調(diào)用一個(gè)父類的抽象方法來(lái)進(jìn)行子類成員屬性具體的解碼;父類的構(gòu)造方法中負(fù)責(zé)解碼相同的部分。)
    • 接口最主要是用于適應(yīng)需求變動(dòng)帶來(lái)的實(shí)現(xiàn)變化問(wèn)題,實(shí)現(xiàn)類和接口是has-a關(guān)系。如果需求幾乎不會(huì)改變或者只有一種實(shí)現(xiàn),可以考慮直接用實(shí)現(xiàn)類。(具體項(xiàng)目中,發(fā)送指令的驅(qū)動(dòng)類就設(shè)計(jì)成了接口,提供了一種發(fā)送指令的方法,因?yàn)樾枰嫒莶煌膮f(xié)議;利用一個(gè)工廠類來(lái)實(shí)現(xiàn)根據(jù)協(xié)議類型自動(dòng)選擇不同的驅(qū)動(dòng)發(fā)送類實(shí)現(xiàn),或者也可以使用spring容器,利用不同的協(xié)議類型名來(lái)獲取實(shí)現(xiàn)類也可以)
    • 抽象類代表了一種自下而上的編程思路,先有了重復(fù)的子類,后有抽象的父類;接口代表了一種自上而下的編程思路,編程時(shí)先關(guān)注接口對(duì)應(yīng)的功能,后考慮具體的實(shí)現(xiàn)。
  8. == 與 equals(重要)

    • 如果是基本數(shù)據(jù)類型,==比較的是值;如果是引用類型,==比較的是地址
    • 基本數(shù)據(jù)類型沒有equals方法;引用類型,如果不重寫,和==的語(yǔ)義一樣;具體實(shí)踐中應(yīng)該依照具體的業(yè)務(wù)需求來(lái)重寫。
  9. 為什么會(huì)有hashcode方法?hashcode方法和equals方法的關(guān)系是什么?

    • 原理:對(duì)象如果被存儲(chǔ)到Set中,我們知道Set中的元素不能重復(fù),那么如何應(yīng)該如何判斷是否重復(fù)呢?
      • 可以考慮只用equals方法,但是當(dāng)對(duì)象變得越來(lái)越多,每次加入一個(gè)新的元素就需要遍歷來(lái)調(diào)用equals方法,這樣做效率太低
      • Java的HashSet的實(shí)現(xiàn)是每個(gè)對(duì)象會(huì)產(chǎn)生一個(gè)哈希值,每一個(gè)哈希值對(duì)應(yīng)數(shù)組中的一個(gè)位置,如果新加入對(duì)象哈希值對(duì)應(yīng)的數(shù)組位置沒有數(shù)據(jù),那就證明容器中沒有和它重復(fù)的元素,可以插入;如果有數(shù)據(jù),再對(duì)比equals方法,如果一致,就代表是重復(fù)數(shù)據(jù),不插入,如果不一致,解決沖突即可,可以大大提高判斷重復(fù)的效率。
    • 關(guān)系:基于源碼中的實(shí)現(xiàn),我們提出一個(gè)重要的關(guān)系
      • equals為true的兩個(gè)對(duì)象,hashcode必須一致:如果hashcode不一致,那么就會(huì)直接插入到Set中,不符合Set的定義。
  10. 關(guān)于 final關(guān)鍵字的?些總結(jié)

    • final關(guān)鍵字可以用于類,變量和方法上。
      • 用于類:代表這個(gè)類不可以繼承,并且所有的成員方法都會(huì)被隱式的加入一個(gè)final修飾
      • 用于變量:
        • 如果是基本數(shù)據(jù)類型:代表這個(gè)變量初始化后就不能再修改值
        • 如果是引用類型:這個(gè)引用類型引用的對(duì)象在初始化后不能修改
      • 用于方法:
        • 防止繼承類重寫這個(gè)方法
  11. 在catch和finally語(yǔ)句中,是否可以更改返回值?

    • 如果finally和catch中沒有return 語(yǔ)句,不會(huì)改變返回值;反之就會(huì)改變
    • 原理:return 前,會(huì)把操作數(shù)棧頂需要返回的數(shù)據(jù)拷貝到局部變量表,等到finally執(zhí)行完畢后,再返回這個(gè)值。finally執(zhí)行過(guò)程中,如果對(duì)這個(gè)變量進(jìn)行修改,修改的操作不會(huì)影響之前被拷貝到局部變量表中的真正返回值數(shù)據(jù)。(包括基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,但是finally中的修改操作是可以修改引用數(shù)據(jù)類型中的數(shù)據(jù)值的
  12. 深拷? vs 淺拷?

    • 淺拷貝:原始對(duì)象和clone后的對(duì)象引用指向同一個(gè)對(duì)象
    • 深拷貝:原始對(duì)象和clone后的對(duì)象引用指向的是不同的對(duì)象
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容