1. 程式人生 > >Java基礎面試題與答案

Java基礎面試題與答案

1、抽象類(abstract class)和介面(interface)有什麼區別?  答:宣告方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要建立一個體現某些基本行為的類,併為該類宣告方法,但不能在該類中實現該類的情況。不能建立abstract 類的例項。然而可以建立一個變數,其型別是一個抽象類,並讓它指向具體子類的一個例項。不能有抽象建構函式或抽象靜態方法。Abstract類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。    介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可通過實現這樣的介面而獲得。介面中的所有方法都是抽象的,沒有一個有程式體。介面只可以定義static final成員變數。介面的實現與子類相似,除了該實現類不能從介面定義中繼承行為。當類實現特殊介面時,它定義所有這種介面的方法。然後可以在實現了該介面的類的任何物件上呼叫介面的方法。由於有抽象類,它允許使用介面名作為引用變數的型別。引用可以轉換到介面型別或從介面型別轉換,instanceof 運算子可以用來決定某物件的類是否實現了介面。
2、Java中的異常處理機制的簡單原理和應用。

   答:當Java程式違反了Java的語義規則時,Java虛擬機器就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況:一種是Java類庫內建的語義檢查。例如陣列下標越界時會引發IndexOutOfBoundsException,訪問null的物件時會引發NullPointerException。另一種情況是Java允許程式設計師擴充套件這種語義檢查,程式設計師可以建立自己的異常,並自由選擇在何時用throw關鍵字引發異常。所有的異常都是Java.lang.Thowable的子類。

3、sleep()和wait()有什麼區別?
   答:sleep()是執行緒類Thread的方法,導致此執行緒暫停執行指定時間,給執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復,呼叫sleep不會釋放物件鎖。
   wait()是Object類的方法,對此物件呼叫wait方法導致本執行緒放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件發出notify方法(或notifyAll)後本執行緒才進入物件鎖定池準備獲得物件鎖進入執行狀態。 

4、String是最基本的資料型別嗎?


   答:String不是基本資料型別,基本資料型別包括byte、int、char、long、float、double、boolean和short。 Java.lang.String類是final型別的,因此不可以繼承這個類、不能修改這個類。 

5、String和StringBuffer的區別。
   答:Java平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字串,即包含多個字元的字元資料。這個String類提供了數值不可改變的字串。而這個StringBuffer類提供的字串進行修改。當知道字元資料要改變的時候就可以使用StringBuffer。典型地,可以使用StringBuffers來動態構造字元資料。 

6、介面是否可繼承介面? 抽象類是否可實現介面? 抽象類是否可繼承實體類?

    答:介面可以繼承介面。抽象類可以實現介面。抽象類是否可繼承實體類,但前提是實體類必須有明確的建構函式。

7、Java有沒有goto?
   答:goto是Java中的保留關鍵字,但是現在沒有在Java中使用。 

8、啟動一個執行緒是用run()還是start()?
   答:啟動一個執行緒是呼叫start()方法,使執行緒所代表的虛擬處理機處於可執行狀態,這意味著它可以由JVM排程並執行。這並不意味著執行緒就會立即執行。run()方法可以產生必須退出的標誌來停止一個執行緒。 

9、說明一下類變數和例項變數的區別。
   答:類變數是所有物件共有的,所有的例項物件都共用一個類變數,記憶體中只有一處空間存放類變數的值。如果其中一個物件改變了類變數的值,其他物件得到的就是改變後的結果。當類被載入到記憶體時,類變數就會分配相應的記憶體空間。

10、執行時異常與一般異常有何異同?
   答:異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。Java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。 

11、說明例項方法和類方法的區別? 
   答:方法前面有static關鍵字修飾的為類方法,否則為例項方法。 例項方法可以呼叫該類中的其他方法;類方法只能呼叫其他類方法,不能呼叫例項方法;當類檔案載入到記憶體時,例項方法不會被分配記憶體空間,只有在物件建立之後才會分配。而類方法在該類被載入到記憶體時就分配了相應的記憶體空間。
12、什麼是雜湊表?
   答:雜湊表又稱散列表,是一種能將關鍵字對映成儲存地址的記錄儲存技術。要儲存資料,先設計一種演算法(雜湊函式),然後根據資料記錄的關鍵字計算出各記錄的雜湊碼,這個雜湊碼作為與關鍵字相關的記錄資料的索引。要取出記錄,只需要根據雜湊函式重新計算,得到雜湊碼後,便可直接到相應位置去存取。 

13、是否可以從一個static方法內部發出對非static方法的呼叫?
   答:不可以。如果其中包含物件的method(),不能保證物件初始化。

14、在Java轉義字元中,“\uxxxx”代表什麼?
   答:\uxxxx是Java中的字元編碼方式,其中字首 \u就表示該字元是unicode字元,xxxx表示1到4位16進位制數,用這種轉義字元形式可以表示unicode字符集中的任意字元。

15、switch語句中的表示式可以是什麼型別資料?
   答:表示式的值可以是byte、short、int和char型別的資料,但不能是float和double型別的資料。 

16、插入資料時,ArrayList、LinkedList、Vector誰速度較快?
   答:ArrayList、Vector以陣列方式儲存資料,插入資料時要進行元素移動操作,因而插入資料慢。LinkedList是一種連結串列結構,在插入資料時只需要修改連結串列的前後項指向即可,因此插入速度較快。

17、final, finally, finalize的區別。
   答:final—修飾符(關鍵字)如果一個類被宣告為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被宣告為 abstract的,又被宣告為final的。將變數或方法宣告為final,可以保證它們在使用中不被改變。被宣告為final的變數必須在宣告時給定初值,而在以後的引用中只能讀取,不可修改。被宣告為final的方法也同樣只能使用,不能過載。
    finally是異常處理時提供 finally 塊來執行任何清除操作。如果丟擲一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。
    finalize是方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件呼叫的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除物件之前對這個物件呼叫的。

18、說出一些常用的類,包,介面,請各舉5個。 
   答:常用的類:BufferedReader,BufferedWriter,FileReader,FileWirter和String等。
   常用的包:Java.lang ,Java.awt,Java.io,Java.util和Java.sql等。
   常用的介面:Remote,List,Map,Document和NodeList等。
19、多執行緒的實現方法分別是什麼?同步的實現方法分別是什麼? 
   答:多執行緒有兩種實現方法,分別是繼承Thread類與實現Runnable。
介面同步的實現方面有兩種,分別是synchronized、wait與notify。

20、當用System.in.read(buffer)從鍵盤輸入一行n個字元後,儲存在緩衝區buffer中的位元組數是多少? 
   答:當用System.in.read(buffer)從鍵盤輸入一行n個字元後,儲存在緩衝區buffer中的位元組數有n+2個,即除輸入的n個字元後,還儲存了回車和換行字元。

21、如何實現字串的分割?
   答:第一種方法是採用split()方法,將分割後的內容儲存在指定的字串陣列中;第二種方法是採用StringTokenizer,利用StringTokenizer的nextToken()、hasMoreTokens()等方法進行分割。 

22、描述一下JVM載入class檔案的原理機制?
   答:JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java執行時系統元件。它負責在執行時查詢和裝入類檔案的類。

23、在什麼情況下,finally語句不會執行?

   答:如果在try內部執行一條System.exit(0)語句終止應用程式的執行,則finally中的語句不會被執行。
24、作用域public,private,protected,以及不寫時的區別。
   答:具體區別如下:

作用域 同一類 同一包 子孫類 所有類
public   √  
protected ×
private × × ×
預設 × ×
25、說出重寫和過載的區別,重寫方法是否可以改變返回值的型別?   答:方法的重寫Overriding和過載Overloading是Java多型性的不同表現。重寫是父類與子類之間多型性的一種表現,過載是一個類中多型性的一種表現。   如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫。子類的物件使用 這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被"遮蔽"了。如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載。   過載的方法是可以改變返回值的型別。26、throw和throws有什麼區別?   答:throw關鍵字一般用於方法內部,用於丟擲一個異常類物件,一旦異常被丟擲後,throw語句後的程式程式碼將不會被執行。    throws關鍵字通常出現在方法宣告中,用來指定該方法可能丟擲的異常。如果可能有多個異常丟擲,可以使用逗號將它們分隔開。

27、字串的compareTo方法結果是什麼?
   答:使用compareTo()方法可以比較字串與字串之間的大小關係。如果當前字串小於指定字串,則返回一個小於0的數值;否則返回一個大於0的數值;如果兩個字串相等,則返回0。

28、字串的連線操作有幾種實現方法? 
   答:字串與字串的連線操作可以通過“+”運算子和concat()方法來實現。另外“+”運算子還可以實現字串與其他型別資料之間的連線操作,可以與字串連線的資料型別有:int、long、float、double、boolean、char等。 

29、當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞? 
   答:是值傳遞,因為在Java程式語言中只有值傳遞引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是對該物件的引用。物件的內容可以在被呼叫的方法中改變,但物件的引用是永遠不會改變的。

30、Class MyClass等價於 Class MyClass extends Object是否正確? 
   答:正確。因為Object類是Java中最高層次的類,是所有類的超類。所有的類,都可以說是由Object繼承而來,只是我們不需要顯式地指明extends Object。

31、陣列有沒有length()方法? String有沒有length()方法?
   答:陣列沒有length()方法,只有length的屬性。String有length()方法。

32、面向物件的特徵有哪些方面
   答:(1)抽象:抽象就是忽略一個主題中與當前目標無關的方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面:一個是過程抽象,另外一個是資料抽象。
   (2)繼承:繼承是一種聯結類的層次模型,並且允許類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且類可以修改或增加新的方法使之更適合特殊的需要。
   (3)封裝:封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面。現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件通過一個受保護的介面訪問其他物件。
   (4)多型性:多型性是指允許不同類的物件對同一訊息作出響應。多型性包括引數化多型性和包含多型性。多型性語言具有靈活、抽象、行為共享、程式碼共享的優勢,同時很好地解決了應用程式函式同名問題。 

33、Java中實現多型的機制是什麼?
   答:方法的重寫和過載是Java多型性的不同表現。重寫是父類與子類之間多型性的一種表現,過載是一個類中多型性的一種表現。

34、通過JDBC連線資料庫有哪幾種方式?
   答:JDBC-ODBC bridge driver方式可以訪問一個ODBC資料來源,但每臺客戶端計算機需要安裝並配置ODBC驅動程式。
   Native-API partly Java driver方式將JDBC呼叫轉換成特定資料庫API的呼叫,該方式要求每臺客戶端計算機安裝特定資料庫的驅動程式。
   JDBC-Net pure Java driver方式將JDBC呼叫轉換為獨立於資料庫的中介軟體廠商的專有資料庫訪問協議,然後由其負責與資料庫的連線活動。
   Native-protocol pure Java driver方式將JDBC呼叫轉換為資料庫直接使用的標準網路協議(例如HTTP等)。這種方式不需要安裝客戶端軟體,客戶端計算機可以直接與資料庫伺服器進行資料“交流”活動。 

35、List、Map、Set三個介面,存取元素時,各有什麼特點?
   答:List以特定次序來持有元素,可有重複元素。Set 無法擁有重複元素,內部排序。Map 儲存key-value值,value可多值。 

36、在比較物件時,“==”運算子和equals運算有何區別?
   答:“==”運算子表示兩個物件引用的地址是否相等,equals運算子則表示兩個物件引用的內容是否相等。 

37、什麼是迴圈巢狀?其特點是什麼?
   答:迴圈的巢狀,是指在一個迴圈語句的迴圈體中又包含另一個完整的迴圈語句。多重迴圈語句的特點是:外層迴圈變數相對穩定,內層迴圈變數逐一變化,即:“多層迴圈,內(層)外(層)有別,外(層)變一次,內(層)變一遍。”

 
38、char型變數中能不能存貯一箇中文漢字?為什麼? 
   答:能夠定義成為一箇中文的,因為Java中以unicode編碼,一個char佔16個位元組,所以放一箇中文是沒問題的。 

39、error和exception有什麼區別
   答:error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位。
   exception 表示一種設計或實現問題。也就是說,它表示如果程式執行正常,從不會發生的情況

40、如何實現Java序列化?

   答:將需要被序列化的類實現Serializable介面,該介面沒有需要實現的方法,它只是為了標註該物件是可被序列化的,然後需要使用一個輸出流來構造一個ObjectOutputStream物件,接著使用ObjectOutput
Stream物件的writeObject()方法就可以將引數為obj的物件寫出,要恢復的話則需要使用輸入流。

41、Java中有幾種型別的流?JDK為每種型別的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
   答:位元組流和字元流。位元組流繼承於InputStream OutputStream,字元流繼承於InputStreamReader OutputStreamWriter。在Java.io包中還有許多其他的流,主要是為了提高效能和使用方便。

42、String s=new String("a");共建立了幾個String物件?
   答:兩個。其中包括一個字元物件和一個字元物件引用物件。