50道面试精选
Q1 Java內部類和子類之間有什么區別?
Ans:內部類是指在一個外部類的內部再定義一個類,內部類對外部類有訪問權限,可以訪問類中定義的所有變量和方法。
子類是從父類(superclass)中繼承的類,子類可以訪問父類所有public和protected的字段和方法。
Q2 Java語言中有哪些常見的訪問說明符,有什么意義?
Ans:Java中的訪問說明符是放在類名之前,用于定義訪問范圍的關鍵字,常見的訪問說明符有以下幾類:
Public:公共,能被項目中的任何一個Class、Method、Field訪問。
Protected:受保護,能被同類或子類訪問,不能從外部訪問。
Default:默認,只能被同一個包的Class、Method、Field訪問。
Private:私有,只能被本類訪問。
Q3 靜態方法和靜態變量的目的是什么?
Ans:靜態變量被類的所有實例共用,靜態類只能訪問類的靜態變量,或調用類的靜態方法。
Q4 什么是數據封裝及其意義?
Ans:封裝是面向對象編程中用于在單個單元中組合屬性和方法。
封裝可以幫助程序員遵循模塊化方法進行軟件開發,每個對象都有自己的一組方法和變量,并且可以獨立于其他對象來執行其功能。另外,封裝也有數據隱藏的目的。
Q5 什么是 singleton class(單例類)?并給出其用法的實際例子。
單例類只能有一個實例,必須自己創建自己的唯一實例,必須給所有其他對象提供這一實例。
單例使用場景的最佳實踐是由于某些驅動程序限制或由于許可問題的限制只能連接數據庫。
Q6 什么是循環?Java中有哪些循環?
Ans:循環用于編程中重復執行語句,Java中的循環有三類:
1)for循環
for循環用于執行指定重復次數的語句,當程序員明確知道循環次數可以使用for循環。
2)while循環
當語句滿足條件時開始進行重復執行,直到語句不再滿足條件退出循環。While循環中在執行語句之前先檢查是否滿足條件。
3)do while循環
Do while 和while循環基本類似,唯一不同的是do while是先執行語句再檢查條件,也就是說do while循環至少會執行一次語句。
Q7:什么是無限循環? 如何聲明無限循環?
Ans:無限循環是指無條件執行,無限運行。無限循環可以由定義中斷語句塊來結束。
無限循環聲明如下:
Q8 continue和break語句有什么區別?
Ans:break和continue都是循環中的重要關鍵詞,break語句是結束整個循環過程,continue語句只結束本次循環,而不是終止整個循環的執行。
Break:
Continue:
Q9 Java中的double和float變量有什么區別?
Ans:float是單精度浮點數,內存中占用4字節,double是雙精度浮點數,內存中占用8字節。
Q10 Java中的Final關鍵字是什么意思?請舉例說明
Ans:final是Java中的關鍵字,有“無法改變”、“終態”的含義,final類不能被繼承,沒有子類,final類中的方法默認是final的,且不能被子類的方法覆蓋,但可以被繼承。final成員變量表示常量,只能被賦值一次,賦值后值不再改變。final不能用于修飾構造方法。
下面的例子中,const_val被聲明且賦值為常量100:
Private Final int const_val=100
而當一個方法被聲明為final之后,它不能被子類覆蓋,而且會比其他方法都快。
Q11 舉例說明什么是三元運算符?
Ans:三元運算符,也稱為條件運算符,根據布爾值來決定將哪個值分配給變量,它被表示為…?..:…
在下面的示例中,如果rank為1,status=Done,否則status=Pending
Q12:如何在Java中生成隨機數?
Ans:使用Math.random()可以生成0.1到1.0范圍內的隨機數字,然后通過數學方法實現生成符合要求的隨機數。
Q13 舉例說明什么是default switch case?
Ans:在switch語句中,如果沒有case條件匹配,那么它會就會執行default后面的語句。
在下面的例子中,當score既不是1也不是2時,就會執行default之后的語句。
Q14 Java中所有派生類的基類是什么?
Ans:java.lang.object
Q15 Java中的main()方法可以返回任何數據嗎?
Ans:java中的main()方法不能返回任何數據,它的返回類型始終是void。
Q16 什么是Java Packages?其意義是什么?
Ans:為了更好地組織類,Java 提供了包機制,用于區別類名的命名空間。
包的作用:把功能相似或相關的類或接口組織在同一個包中,方便類的查找和使用。
如同文件夾一樣,包也采用了樹形目錄的存儲方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。因此,包可以避免名字沖突。
包也限定了訪問權限,擁有包訪問權限的類才能訪問某個包中的類。
Q17 我們可以聲明一個抽象類,但是沒有任何抽象方法嗎?
Ans:是的,我們可以聲明一個抽象類,且不包含任何抽象方法,但是一旦一個類中含有一個抽象方法,那么該類必須聲明為抽象。
Q18 Java中的抽象類和接口有什么區別?
Ans:抽象類和接口之間的主要區別在于,抽象類可以擁有任意范圍的成員數據,同時也可以擁有自己的非抽象方法,但是接口方式中,它僅能夠有靜態、不能修改的成員數據,同時它所有的方法都必須是抽象的。
抽象類是對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。
一個類可以實現多個接口,但它只能擴展一個抽象類。
Q19 接口對抽象類的性能影響是什么?
Ans:與抽象類相比,接口性能較慢。一個類只能擴展一個抽象類,卻能實現許多接口,隨著接口在類中的實現,也會給開發人員帶來額外負擔。
Q20 Java中導入包時,其子包是否會被導入?
Ans:在Java中導入包時,其子包不會被導入,如果有需要,開發者必須單獨導入。
開發者需要單獨導入它們。
Q21 類中的main方法可以聲明為private?
Ans:Java中main方法必須是public,如果是private,那么它雖然在編譯時不會出錯,但是在運行時會出錯。
Q22 我們能不能通過引用向函數傳遞參數?
Ans:不能,我們只能通過引用將值傳遞給函數。
Q23 對象在java中如何序列化?
Ans:序列化是指把Java對象轉換為字節序列的過程,只能將支持 java.io.Serializable 接口的對象寫入流中,每個 serializable 對象的類都被編碼。
Q24 Java中的try…catch是用于異常處理嗎?
Ans:try后面往往會跟著catch或finally,try拋出的任何異常都會被捕獲在catch中,在代碼終止前的要執行的任務放在finally中。
Q25 有沒有什么辦法在出現異常時跳過finally?
Ans:當在try中出現異常時,如果存在catch,會先被catch捕獲,否則會執行到finally。異常發生時肯定會執行finally,除非在try的末尾有強制中止代碼:System.exit(0);
Q26 什么時候類的構造函數會被調用?
Ans:每次用new來創建對象時,都會調用構造函數。
例如,下例中new創建了兩個對象,構造函數也被調用了兩次。
Q27 一個類可以有多個構造函數嗎?
Ans:是的,一個類可以有多個具有不同參數的構造函數,創建對象的構造函數取決于創建對象時傳遞的參數。
Q28 我們可以覆蓋類的靜態方法嗎?
Ans:我們不能覆蓋靜態方法,靜態方法屬于一個類而不是單個對象,并且在編譯時解析(而不是在運行時)。
Q29 在下面的例子中,輸出是什么?
Ans: 輸出為:
Displaying from subclass
Displaying from superclass
Q30 String是Java的數據類型嗎?
Ans:String不是Java的原始數據類型,Java中創建一個string時,實際上是創建了Java.Lang.String類的對象,這個對象可以使用String類的所有內置方法。
Q31下面的示例中,共創建了多少個String對象?
Ans:共創建了兩個java.Lang.String類的對象。 s1和s3是對同一個對象的引用。
Q32 為什么Java中的String被稱為Immutable?
Ans:Java中,string對象是不可變的,一旦賦值不可更改,如果更改,則會創建一個新對象。
在下面的示例中,str是值為“Value One”的字符串對象。
當分配一個新值時,將創建一個新的String對象,并將引用移動到新對象。
Q33 數組和向量之間有什么區別?
Ans:數組是對相同原始類型的數據進行組合,本質上是靜態的,而矢量本質上是動態的,并且可以容納不同數據類型的數據。
Q34 什么是多線程?
Ans:多線程是一個編程概念,可以在單個程序中以并發方式執行多個任務。同一個進程的多個線程堆棧共享,有助于程序的性能改進。
Q35 為什么在ava中使用Runnable Interface?
Ans:Runnable接口在Java中用于實現多線程應用程序,Java.Lang.Runnable接口由一個支持多線程的類來實現。
Q36 Java中實現多線程的兩種方法是什么?
Ans:1.通過使用Java.Lang.Runnable Interface,通過Run()方法來啟用多線程。
2.編寫一個擴展Java.Lang.Thread類的類。
Q37 當數據需要進行大量更改時, String和StringBuffer誰是更好的選擇?
Ans:StringBuffers本質上是動態的,我們可以改變StringBuffer對象的值,而String是不可變的,每次數據更改都會創建一個新的String對象,增加額外開銷,所以在數據更改很多的情況下,StringBuffer是一個更好的選擇。
Q38 每個switch語句后使用break的目的是什么?
Ans:switch使用break可以在執行完這個語句后中斷,如果不使用break,那么它將把所有情況都執行一遍。
Q39 如何在Java中完成垃圾回收?
Ans:Java中,對象不被引用時,垃圾回收就會發生,對象會被自動銷毀,調用System.gc()方法或Runtime.gc()方法。
Q40 可以在Main()方法前執行代碼?
Ans:如果我們要在類加載時,對象創建之前執行語句,可以在類中使用靜態代碼塊,這樣即使在main方法中創建對象之前,此靜態代碼塊中的語句都將在加載類時執行一次。
Q41 一個類可以同時既是父類也是子類嗎?請舉例說明?
Ans:如果使用了繼承層次結構,那么這個類就可能既是一個類的父類也是另一個類的子類,如下例中的大陸類既是世界類的子類,同時也是國家類的父類。
Q42 如果類中沒有定義構造函數,那么類的對象將會怎么創建?
Ans:即使類沒有定義顯式構造函數,對象在創建時也會執行隱式構造函數,且該構造函數沒有參數。
Q43 在多線程中,如何確保資源不會同時被多個線程使用?
Ans:在多線程中,可以通過使用同步的概念來控制對多個線程之間共享的資源的訪問。 使用synchronized關鍵字,我們可以確保只有一個線程可以一段時間內使用共享資源。
Q44 我們是否可以為對象多次調用類的構造函數?
Ans:使用new創建對象時,會自動調用構造函數,對象創建之后,則無法再調用該構造函數。
Q45 兩個類classA和classB都在同一個包中,那么classA的私有成員可以被classB的對象訪問嗎?
Ans:類的私有成員在該類的范圍之外是不可訪問的,即使在同一個包中也不能訪問任何其他類。
Q46 同一類中可以定義重名的方法嗎?
Ans:可以定義重名的方法,但是其參數的數量和類型是不同的,調用哪個方法取決于傳遞的參數。
例如在下面的類中,我們有兩個具有相同名稱但不同參數的打印方法。 根據參數,將調用適當的參數:
Q47 如何制作一個Java對象的副本?
Ans:使用克隆,我們可以創建具有對象的實際狀態的副本。Clone()是Cloneable interface的方法,因此需要實現Cloneable interface來進行對象拷貝。
Q48 使用繼承有什么好處?
Ans:使用繼承的主要優點是代碼的可重用性,因為繼承使子類能夠重用其父類的代碼。 多態性(可擴展性)是另一個好處,允許引入新的功能而不影響現有的派生類。
Q49 類的變量和方法的默認訪問說明符是什么?
Ans:變量和方法的默認訪問說明符是protected,即變量和類可用于同一個包中的任何其他類。
Q50 舉一個在Java類中使用指針的例子。
Ans:Java中沒有指針。
總結
- 上一篇: 【LLM大模型】模型和指令微调方法
- 下一篇: 阿里巴巴著名的“管理三板斧”