Java基礎慨念面試題1

笨笨鼠→_→發表於2012-07-07
1.什麼是類與物件?
答:所謂物件就是真實世界中的實體,物件與實體是一一對應的,也就是說現實世界中每一個實體都是一個物件,它是一種具體的概念。
    類是具備某些共同特徵的實體的集合,它是一種抽象的概念,用程式設計的語言來說,類是一種抽象的資料型別,它是對所具有相同特徵實體的抽象。
2.屬性與方法?
答:不同物件具有相同特點,就可能抽象為一定的類,那麼這些特點基本上可以分為兩類,一類是描述物件靜態狀態的,就是物件的屬性, 在程式設計中,可以稱之為變數;另一類是描述物件的動作,就是物件的方法,在程式設計中我們稱之為函式。屬性和方法是一個物件所具備的兩大基本要素,也是 我們後面程式設計工作的核心。
3.什麼是封裝?
答:只要有足夠的方法,就沒必要直接去操作物件屬性,只要呼叫這些方法就可以實現要完成的任務,這種現象稱為封裝,它通過物件方法對其屬性的操作把物件屬性封裝在一個物件內部,物件與外界打交道全部通過其自身的方法來實現,有效的把物件屬性隱藏在物件內部。
4.編寫 java檔案的注意事項?
答:在記事本中編寫java檔案,在儲存時一定要把檔名和副檔名用雙引號括起來,否則將預設儲存為文字檔案,如果要儲存的java 檔名為Program1.java,則在儲存時在檔名文字框中一定要輸入”Program1.java”。
5.如何編譯java程式?如何執行java程式?
答:單擊開始|執行命令,在命令列上輸入cmd,按Enter鍵(在 window98中輸入command,按Enter鍵),即可開啟一個命令視窗,將目錄轉換到編寫java源程式所在的目錄,輸入javac filename.java
   同樣在命令視窗中輸入java filename,
6.基本資料型別?
答:Java的資料型別可以劃分為4大類:整數,浮點數,字元型,布林型。其中整數可以劃分為:byte,short,int,long.浮點數可以劃分為float,double.
7. 什麼是OOP?什麼是類?請對比類和物件例項之間的關係。
答:OOP是Object_oriented Programming(物件導向程式設計)的縮寫。這主要是為了區別於以前的程式導向的程式設計!指的是用物件的觀點來組織與構建系統,它綜合了功能抽象和 資料抽象,這樣可以減少資料之間的耦合性和程式碼的出錯機率。
    使用物件導向程式設計技術可以使得軟體開發者按照現實世界裡人們思考問題的模式編寫程式碼,可以讓軟 件開發者更好地利用程式碼直接表達現實中存在的物件,將問題空間直接對映到解空間!   
    類:即class 在物件導向的程式設計中,專門用“類”來表示使用者定義的抽象資料型別(user_defined abstract type)。它將具有相同狀態、操作和訪問機制的多個物件進行了抽象。類具有繼承、資料隱藏和多型三種主要特性。利用類的這三種特性可以更好地表示現實世 界中事物。類是同一類物件例項的共性的抽象,物件是類的例項化。物件通常作為計算機模擬思維,表示真實世界的抽象,一個物件就像一個軟體模組,可以為使用者 提供一系列的服務---可以改變物件的狀態、測試、傳遞訊息等。類定義了物件的實現細節或資料結構。類是靜態的,物件是動態的,物件可以看作是執行中的 類。類負責產生物件,可以將類當成生產物件的工廠(Object factory).
8. 常用的資料結構有哪些?請列舉一些。(不少於5個)
答:連結串列、堆疊、二叉樹、佇列、圖、堆,集合。
1、物件導向的特徵有哪些方面
答:抽象,繼承,封裝,多型性。。。
    <1.抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。
   <2.繼承:繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類
基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且類可以修改或增加新的方法使之更適合特殊的需要。
    <3.封裝:封裝是把過程(方法)和資料包圍起來,對資料的訪問只能通過已定義的介面。物件導向計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件通過一個受保護的介面訪問其他物件。
   <4. 多型性:多型性是指允許不同類的物件對同一訊息作出響應。多型性包括引數化多型性和包含多型性。多型性語言具有靈活、抽象、行為共享、程式碼共享的優勢,很好的解決了應用程式函式同名問題。
2、Overload和Override的區別。Overloaded的方法是否可以改變返回值的型別?
答:方法的重寫Overriding和過載Overloading是Java多型性的不同表現。重寫Overriding是父類與子類之間多型性的一種表現,過載Overloading是一個類中多型性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫
(Overriding)。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被“遮蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載(Overloading)。Overloaded的方法是可以改變返回值的型別。
3.abstract class(抽象類)和interface(介面)有什麼區別?
答:(1)介面可以被多重implements,抽象類只能被單一extends(繼承).
    (2)介面只有定義,抽象類可以有定義和實現
    (3)介面的欄位定義預設為:public static final, 抽象類欄位預設是"friendly"(本包可見)
    抽象類與介面都用於抽象,但是抽象類(JAVA中)可以有自己的部分實現
    而介面則完全是一個標識(同時有多重繼承的功能)。
    宣告方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要建立一個體現某些基本行為的類,併為該類宣告方法,但不能在該類中實現該類的情況。不能建立abstract 類的例項。然而可以建立一個變數,其型別是一個抽象類,並讓它指向具體子類的一個例項。不能有抽象建構函式或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。
    介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可通過實現這樣的介面而獲得。介面中的所有方法都是抽象的,沒有一個有程式體。介面只可以定義static final成員變數。介面的實現與子類相似,除了該實現類不能從介面定義中繼承行為。當類實現特殊介面時,它定義(即將程式體給予)所有這種介面的方法。然後,它可以在實現了該介面的類的任何物件上呼叫介面的方法。由於有抽象類,它允許使用介面名作為引用變數的型別。通常的動態聯編將生效。引用可以轉換到介面型別或從介面型別轉換,instanceof 運算子可以用來決定某物件的類是否實現了介面。  
4.當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?
答:是值傳遞。Java 程式語言只由值傳遞引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是對該物件的引用。物件的內容可以在被呼叫的方法中改變,但物件的引用是永遠不會改變的。
5.Java的介面和C++的虛類的相同和不同處?
答:由於Java不支援多繼承,而有可能某個類或物件要使用分別在幾個類或物件裡面的方法或屬性,現有的單繼承機制就不能滿足要求。與繼承相比,介面有更高的靈活性,因為介面中沒有任何實現程式碼。當一個類實現了介面以後,該類要實現介面裡面所有的方法和屬性,並且介面裡面的屬性在預設狀態下面都是public static,所有方法預設情況下是public.一個類可以實現多個介面。
6.描述一下JVM載入class檔案的原理機制?
答:JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java執行時系統元件。它負責在執行時查詢和裝入類檔案的類。
7.垃圾回收的優點和原理。並考慮2種回收機制.如何優化程式,垃圾回收器可以馬上回收記憶體嗎?有什麼辦法主動通知虛擬機器進行垃圾回收?
答:Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程式設計師最頭疼的記憶體管理的問題迎刃而解,它使得Java程式設計師在編寫程式的時候不再需要考慮記憶體管理。由於有個垃圾回收機制,Java中的物件不再有"作用域"的概念,只有物件的引用才有"作用域"。
    垃圾回收可以有效的防止記憶體洩露,有效的使用可以使用的記憶體。垃圾回收器通常是作為一個單獨的低階別的執行緒執行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的物件進行清楚和回收,程式設計師不能實時的呼叫垃圾回收器對某個物件或所有物件進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收.
    垃圾回收器的基本原理是:對於GC來說,當程式設計師建立物件時,GC就開始監控這個物件的地址、大小以及使用情況。通常,GC採用有向圖的方式記錄管理堆(heap)中的所有物件。通過這種方式確定哪些物件是"可達的",哪些物件是"不可達的"。當GC確定一些物件為"不可達"時,GC就有責任回收這些記憶體空間。
   可以馬上回收記憶體。程式設計師可以手動執行System.gc(),通知GC執行,但是Java語言規範並不保證GC一定會執行。
8、GC是什麼? 為什麼要有GC?
答:GC是垃圾收集的意思(Gabage Collection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測物件是否超過作用域從而達到自動回收記憶體的目的,Java語言沒有提供釋放已分配記憶體的顯示操作方法。
   要請求垃圾收集,可以呼叫下面的方法之一:
    System.gc();
  Runtime.getRuntime()。gc();
9.Java中的異常處理機制的簡單原理和應用。
答:當JAVA程式違反了JAVA的語義規則時,JAVA虛擬機器就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是JAVA類庫內建的語義檢查。例如陣列下標越界,會引發IndexOutOfBoundsException;訪問null的物件時會引發NullPointerException。另一種情況就是JAVA允許程式設計師擴充套件這種語義檢查,程式設計師可以建立自己的異常,並自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。
10.執行時異常與一般異常有何異同?
答:異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。  
11,error和exception有什麼區別?
答:error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位。不可能指望程式能處理這樣的情況.Error是Throwable的子類,表示應用程式不需要捕獲的嚴重的錯誤。一旦發生,程式立刻終止。
  exception 表示一種設計或實現問題。也就是說,它表示如果程式執行正常,從不會發生的情況。
12、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎?
答:Java通過物件導向的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在Java中,每個異常都是一個物件,它是Throwable類或其它子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並進行處理。
    Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。
    一般情況下是用try來執行一段程式,如果出現異常,系統會丟擲(throws)一個異常,這時候你可以通過它的型別來捕捉(catch)它,或最後(finally)由預設處理器來處理。
  用try來指定一塊預防所有“異常”的程式。緊跟在try程式後面,應包含一個catch子句來指定你想要捕捉的“異常”的型別。
  throw語句用來明確地丟擲一個“異常”。
  throws用來標明一個成員函式可能丟擲的各種“異常”。
  Finally為確保一段程式碼不管發生什麼“異常”都被執行一段程式碼。
   可以在一個成員函式呼叫的外面寫一個try語句,在這個成員函式內部寫另一個try語句保護其他程式碼。每當遇到一個try語句,“異常”的框架就放到堆疊上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種“異常”進行處理,堆疊就會展開,直到遇到有處理這種“異常”的try語句。
13、介紹JAVA中的Collection FrameWork(包括如何寫自己的資料結構)?
答:Collection FrameWork如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection是最基本的集合介面,一個Collection代表一組Object,即Collection的元素(Elements)
Map提供key到value的對映。
14,Collection 和 Collections的區別。
答:Collection是個java.util下的介面,它是各種集合結構的父介面。
Collection是集合類的上級介面,繼承與他的介面主要有Set 和List.
Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。  
15.你所知道的集合類都有哪些?主要方法?
答:最常用的集合類是 List 和 Map。 List 的具體實現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、儲存和操作任何型別物件的元素列表。 List 適用於按數值索引訪問元素的情形。 Map 提供了一個更通用的元素儲存方法。 Map 集合類用於儲存元素對(稱作"鍵"和"值"),其中每個鍵對映到一個值。
16.Hashtable的原理,並說出HashMap與Hashtable的區別
答:HashTable的原理:通過節點的關鍵碼確定節點的儲存位置,即給定節點的關鍵碼k,通過一定的函式關係H(雜湊函式),得到函式值H(k),將此值解釋為該節點的儲存地址.
HashMap 與Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null為關鍵碼的.
   HashMap和Hashtable的區別。
   HashMap是Hashtable的輕量級實現(非執行緒安全的實現),他們都完成了Map介面,實現了將惟一鍵對映到特定的值上。主要區別在於HashMap允許空(null)鍵值(key),由於非執行緒安全,效率上可能高於Hashtable。
   HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。
   HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。
   Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個執行緒訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。
   Hashtable和HashMap採用的hash/rehash演算法都大概一樣,所以效能不會有很大的差異。
17 說出ArrayList,Vector, LinkedList的儲存效能和特性。
答:ArrayList和Vector都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢;
   Vector由於使用了synchronized方法(執行緒安全),通常效能上較ArrayList差,而LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較。
18、ArrayList和Vector的區別,HashMap和Hashtable的區別,
答:就ArrayList與Vector主要從二方面來說.
一.同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的
二.資料增長:當需要增長時,Vector預設增長為原來一培,而ArrayList卻是原來的一半
   就HashMap與HashTable主要從三方面來說。
一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現
二.同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value

相關文章