1. 程式人生 > >java面試寶典:100個常用問題

java面試寶典:100個常用問題

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中沒有指標。
  Q51 如何限制一個類不被繼承?
  Ans:使用關鍵字Final。
  在下面的例子中,Stone類就不能被繼承了
  這裡寫圖片描述
  Q52 訪問說明符的訪問範圍是什麼?
  Ans:
  這裡寫圖片描述
  Q53 棧和佇列之間有什麼區別?
  Ans:棧和佇列之間的主要區別在於,棧基於“後進先出(LIFO)”原則,而佇列基於FIFO(先進先出)原則。
  Q54 在Java中,我們如何禁止序列化變數?
  Ans:想要某些變數不被序列化,那麼可以在宣告時使用關鍵字transient。例如,下面的變數trans_var是一個臨時變數,不能被序列化:
  這裡寫圖片描述
  Q55 我們如何使用原始資料型別作為物件?
  Ans:Java提倡“一切皆為物件”,引用資料型別可以例項化為物件,基本資料型別卻無法變為物件,針對這一不足,JAVA中設定了包裝類,例如,Integer是原始資料型別int的包裝類。
  Q56 編譯時會遇到哪些型別的異常?
  Ans:程式編譯時可以捕獲被檢查的異常,為了成功編譯程式碼,異常會通過try…catch來處理。
  Q57 請描述一下執行緒的不同狀態。
  Ans:Java中的執行緒往往是處於下面的某一種狀態
  NEW:通過New關鍵字建立了Thread類(或其子類)的物件
  RUNNABLE:這種情況指的是Thread類的物件呼叫了start()方法,執行緒處於就緒狀態。
  RUNNING:執行緒獲得了CPU,處於執行狀態。
  DEAD:處於RUNNING狀態的執行緒,在執行完run方法之後,就變成了DEAD狀態了。
  BLOCKED:這種狀態指的是處於RUNNING狀態的執行緒,出於某種原因,比如呼叫了sleep方法、等待使用者輸入等而讓出當前的CPU給其他的執行緒。
  Q58 定義了類的顯式建構函式之後,還可以使用預設建構函式嗎?
  Ans:如果沒有定義顯式建構函式,那麼Java將提供一個預設的無引數建構函式,但是如果定義了顯式建構函式之後,就不能再呼叫預設建構函式。
  Q59 可以有兩個方法,它們方法名和引數都相同,但返回值型別不同?
  Ans:相同的方法指的是方法名、引數以及返回型別都相同,因此返回型別不同的兩個方法是可以並存的。
  Q60 以下程式碼的輸出是什麼?
這裡寫圖片描述
  Ans:輸出為4
  Q61 在沒有執行main()的情況下,成功編譯了一個Java類,這一說法正確嗎?
  Ans:正確,雖然Java編譯器規定程式的入口點為staticmain,但是沒有main()還是能夠編譯,只是不能執行。
  Q62 我們可以在靜態方法中呼叫非靜態方法?
  Ans:非靜態方法歸類的物件所有,且具有物件的級別範圍,所以如果想要在靜態方法中呼叫非靜態方法,首先要建立類的物件,然後使用物件引用,呼叫這些方法。
  Q63 為了執行Java程式,必須設定兩個環境變數是什麼?
  Ans:PATH變數和CLASSPATH變數。
  Q64 Java中變數沒有初始化可以使用嗎?
  Ans:Java不會給變數分配預設值,因此變數沒有初始化的情況下,程式會編譯失敗並給出錯誤提示。
  Q65 Java中的類可以繼承多個類嗎?
  Ans:Java不支援多重繼承。
  Q66 Java中,建構函式可以與類名不同嗎?
  Ans:不可以,Java的建構函式必須與類名相同,如果不同,它將被視作普通函式。
  Q67 Round(3.7)和Ceil(3.7)的輸出分別是什麼?
  Ans:它們的輸出都是4。Round()遵循四捨五入,Ceil()遵循向上舍入。
  Q68 Java中可以使用goto來轉到特定行嗎?
  Ans:不可以,Java中沒有goto關鍵字。
  Q69 已經死亡的執行緒可以再次啟動嗎?
  Ans:不可以。
  Q70 以下類的宣告是否正確?
這裡寫圖片描述
  Ans:不正確,抽象類不能被宣告為Final。
  Q71 每個機器都需要JDK來執行Java程式?
  Ans:JDK是Java的開發工具包,不是必需的,JRE才是必需的。
  Q72 Equals()和==有什麼區別?
  Ans:Java中,==操作比較的是兩個變數的值是否相等,對於引用型變量表示的是兩個變數在堆中儲存的地址是否相同,即棧中的內容是否相同。equals操作表示的兩個變數是否是對同一個物件的引用,即堆中的內容是否相同
  下例中,equals()返回true,而==操作符則返回false:
這裡寫圖片描述
  Q73 Java類中定義方法,可否使用其他語言程式碼實現,如C語言?
  Ans:可以,在基於原生開發的情況下,我們可以在Java類中定義公共靜態方法,但是不執行,然後用另外一種語言(如C)實現。
  Q74 如何在Java中定義解構函式?
  Ans:Java類中沒必要定義解構函式,它有自己的垃圾回收機制,當不再引用物件時,會自動執行。
  Q75 Java中變數可以既是區域性變數又是靜態變數嗎?
  Ans:不能,將區域性變數定義為靜態變數會導致編譯錯誤。
  Q76 Interface中可以有靜態方法嗎?
  Ans:Interface中的靜態方法是沒有意義的,靜態方法在類中不能被覆蓋,而Interface中的方法預設都是抽象的,所以只能在實現Interface的類中實現。
  Q77 在實現介面的類中,我們可以更改介面中定義的變數的值嗎?
  Ans:不能,介面中定義的變數大多都預設是public、static和final等不可更改的常量。
  Q78 Java中的垃圾回收機制能夠確保程式永遠不會超出記憶體?
  Ans:即使Java提供自動垃圾回收,也不能確保程式不會超出記憶體,因為與垃圾回收相比,Java物件的建立速度更快。
  Q79 main()能否有除void之外的返回型別?
  Ans:不可以,main()必須返回值為void,程式才能成功執行。
  Q80 垃圾回收之後,還能否重新觸發並使用該物件?
  Ans:不能,一旦物件被回收之後,就不再存在於堆疊上,也就不能再次訪問和引用了。
  Q81 在Java執行緒程式設計中,哪個方法是所有執行緒必須實現的?
  Ans:Run()是一個Runnable介面的方法,必須由所有執行緒實現。
  Q82 如何在程式中控制資料庫連線,且每次只有一個執行緒可以進行資料庫連線?
  Ans:應用同步的概念來實現,將資料庫相關程式碼hs synchronized關鍵字的方法中,以便一次只有一個執行緒可以訪問它。
  Q83 程式設計師手動丟擲異常怎麼辦?
  Ans:為了處理手動丟擲的異常,我們可以使用throw關鍵字,並在catch中捕獲和處理異常。
  這裡寫圖片描述
  Q84 如何實現一個類不允許其他類(甚至派生類)建立其物件?
  Ans:將該類的建構函式宣告為private,那麼它就不會被其他類訪問。
  Q85 物件如何儲存在Java中?
  Ans:每個物件在建立時都會從堆疊中獲取記憶體空間,被垃圾回收器銷燬之後,其空間將被釋放重新分配給其它物件。
  Q86 如何確定堆疊上物件的實際大小?
  Ans:Java中,沒辦法確定物件的確切大小。
  Q87 以下哪個類將分配更多的記憶體?
  A類:三種方法,四個變數,無物件
  B類:五個方法,三個變數,無物件
  Ans:在建立物件之前,不會分配記憶體,所以這兩個類都沒有分配記憶體。
  Q88 如果程式中沒有處理異常,會發生什麼?
  Ans:如果沒有異常處理,那麼程式將中止,且不會執行異常丟擲之後的語句。
  Q89 如果定義了一個類定義了多個建構函式,那麼是否可以在一個建構函式中呼叫另一個建構函式?
  Ans:如果一個類有多個建構函式,那麼可以使用this()在一個建構函式中呼叫另一個建構函式。
  Q90 什麼是匿名類?
  Ans:匿名類是不能有名字的類,它們不能被引用,只能在建立時用New語句來宣告它們。
  下例中,我們定義了一個匿名類:
這裡寫圖片描述
  Q91 陣列宣告之後是否還可以改變其大小?
  Ans:陣列是靜態的,一旦指定了大小,就不能改變。
  Q92 應用程式中有多個類,但只有一個main()可以嗎?
  Ans:可以,main()方法是Java應用程式的入口方法,程式碼總是從特定類的main方法開始。
  Q93 如果我想要保留物件的資料以供以後使用,最好的做法是什麼?
  Ans:使用序列化。
  Q94 什麼是區域性類?
  Ans:如果我們在Java的特定塊中定義一個新類,那麼這個類就被稱為區域性類,它在區域性範圍內可用,在其定義的塊之外不可用。
  Q95 String和StringBuffer都表示String物件,這兩個物件之間可以互相比較嗎?
  Ans:不可以。
  Q96 Java提供了哪些API用於集合類的操作?
  Ans:Java提供了Collection API,可應用於一組物件的,Collection API支援的重要類包括
  ArrayList,HashMap,TreeSet和TreeMap。
  Q97 Java的型別轉換可以將所有其他類轉換為布林型別嗎?
  Ans:不可以,其它原始型別不能轉換為布林型別,布林型別也不能轉換為其它原始資料型別。
  Q98 方法的重寫允許返回型別不同嗎?
  Ans:方法的重寫要求子類的方法的名稱及引數必須和所覆蓋的方法相同,返回型別可以不同但必須是所覆蓋方法的子類。
  這裡寫圖片描述
  Q99 所有異常類的基類是什麼?
  Ans:Java.Lang.throwable。
  Q100 建構函式在繼承中的呼叫順序是什麼?
  Ans:在繼承的情況下,建立派生類的新物件時,首先呼叫父類的建構函式,然後呼叫派生類的建構函式。