這些題目是近期我參加過的筆試題和一些我在網上選的部分題,在這里做筆記,認真去學習,更好的應對后面的招聘。有錯誤歡迎指出。
一、Java基礎部分
1、指針在任何情況下都可進行>,<,>=,<=,==運算。
答案:正確。
解析:指針用來表示內存地址;如果僅僅是指針之間的比較,其實也就是整型變量比較,這樣的話任何情況都進行比較運算。但是指針的比較一般沒有實際意義。
2、關於 JAVA 堆,下面說法錯誤的是( )
A.所有類的實例和數組都是在堆上分配內存的 B.對象所占的堆內存是由自動內存管理系統回收
C.堆內存由存活和死亡的對象,空閑碎片區組成 D.數組是分配在棧中的
答案:D
解析:首先數組是分配在堆中的,故D的說法不正確。
Java堆的結構:JVM的堆是運行時數據區,所有類的實例和數組都是在堆上分配內存。它在JVM啟動的時候被創建。對象所占的堆內存是由自動內存管理系統也就是垃圾收集器回收。堆內存是由存活和死亡的對象組成的。存活的對象是應用可以訪問的,不會被垃圾回收。死亡的對象是應用不可訪問尚且還沒有被垃圾收集器回收掉的對象。一直到垃圾收集器把這些對象回收掉之前,他們會一直占據堆內存空間。
3、下面關於java.lang.Exception類的說法正確的是()
A 繼承自Throwable B 繼承自Serialable
答案:A
解析:Java異常的基類為java.lang.Throwable,java.lang.Error和java.lang.Exception繼承 Throwable,RuntimeException和其它的Exception等繼承Exception,具體的RuntimeException繼承RuntimeException。
擴展:錯誤和異常的區別(Error vs Exception)
1) java.lang.Error: Throwable的子類,用於標記嚴重錯誤。合理的應用程序不應該去try/catch這種錯誤。絕大多數的錯誤都是非正常的,就根本不該出現的。
java.lang.Exception: Throwable的子類,用於指示一種合理的程序想去catch的條件。即它僅僅是一種程序運行條件,而非嚴重錯誤,並且鼓勵用戶程序去catch它。
2) Error和RuntimeException 及其子類都是未檢查的異常(unchecked exceptions),而所有其他的Exception類都是檢查了的異常(checked exceptions).
checked exceptions: 通常是從一個可以恢復的程序中拋出來的,並且最好能夠從這種異常中使用程序恢復。比如FileNotFoundException, ParseException等。檢查了的異常發生在編譯階段,必須要使用try…catch(或者throws)否則編譯不通過。
unchecked exceptions: 通常是如果一切正常的話本不該發生的異常,但是的確發生了。發生在運行期,具有不確定性,主要是由於程序的邏輯問題所引起的。 比如ArrayIndexOutOfBoundException, ClassCastException等。從語言本身的角度講,程序不該去catch這類異常,雖然能夠從諸如RuntimeException這樣的異常中catch並恢復,但是並不鼓勵終端程序員這么做,因為完全沒必要。因為這類錯誤本身就是bug,應該被修復,出現此類錯誤時程序就應該立即停止執 行。 因此,面對Errors和unchecked exceptions應該讓程序自動終止執行,程序員不該做諸如try/catch這樣的事情,而是應該查明原因,修改代碼邏輯。
RuntimeException:RuntimeException體系包括錯誤的類型轉換、數組越界訪問和試圖訪問空指針等等。
處理RuntimeException的原則是: 如果出現 RuntimeException,那么一定是程序員的錯誤。例如,可以通過檢查數組下標和數組邊界來避免數組越界訪問異常。其他 (IOException等等)checked異常一般是外部錯誤,例如試圖從文件尾后讀取數據等,這並不是程序本身的錯誤,而是在應用環境中出現的外部 錯誤。
4、分析下面程序,求輸出結果,並簡單列出執行過程。
public class Test{ static boolean foo(char c) { System.out.print(c); return true; } public static void main(String[] argv) { int i=0; for (foo('A'); foo('B') && i < 2; foo('C')) { i++; foo('D'); } } }
答案:ABDCBDCB
解析:①第一輪循環:foo('A')是初始條件,只執行一次,故先輸出A,接着判斷foo('B')&&i<2,因為此時i=0,故滿足條件,再輸出B,接着進入循環內,首先執行i++, 此時i=1, 再執行foo('D'),輸出D,再執行foo('C'),輸出C。 在這一輪中,依次輸出ABDC;
②第二輪循環:初始條件foo('A')不執行,故開始執行判斷條件foo('B') && i < 2,滿足1<2,故先輸出B,同上,接着執行i++,i=2,輸出D,輸出C。在這一輪中,依次輸出BDC;
③第三輪循環:還是直接從判斷條件語句開始,先執行了判斷語句foo('B'),故輸出B,但此時不滿足i<2,后面的語句不再執行,這一輪中輸出B。程序也到此結束。
5、下列說法正確的是:
A.一個文件里可以同時存在兩個public修飾的類
B.構造函數可以被重寫(override)
C.子類不能訪問父類非public和protected修飾的屬性
D.final修飾的類可以被繼承
答案:C
解析:一個Java源文件中最多只能有一個public類,當有一個public類時,源文件名必須與之一致,否則無法編譯,如果源文件中沒有一個public類,則文件名與類中沒有一致性要求。至於main()不是必須要放在public類中才能運行程序。《詳解鏈接》
重寫是子類繼承父類對父類的方法進行修改。方法名,參數,返回值必須一樣。 不能重寫被標示為final的方法。如果不能繼承一個方法,則不能重寫這個方法。
擴展:重寫override,重載overload的區別:
java的方法重載:就是在類中可以創建多個方法,它們具有相同的名字,但具有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型來決定具體使用哪個方法,而且返回值類型可以相同也可以不相同,這也是面向對象的多態性。
java的方法重寫:
1)父類與子類之間的多態性,對父類的函數進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋。
2)若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
3)子類函數的訪問修飾權限不能少於父類的;
4)重寫方法只能存在於具有繼承關系中,重寫方法只能重寫父類非私有的方法。
6、Java接口的修飾符可以為()
A private B protected C final D abstract
答案:CD
解析:接口很重要,為了說明情況,這里稍微啰嗦點:
(1)接口用於描述系統對外提供的所有服務,因此接口中的成員常量和方法都必須是公開(public)類型的,確保外部使用者能訪問它們;
(2)接口僅僅描述系統能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法;
(3)接口不涉及和任何具體實例相關的細節,因此接口沒有構造方法,不能被實例化,沒有實例變量,只有靜態(static)變量;
(4)接口的中的變量是所有實現類共有的,既然共有,肯定是不變的東西,因為變化的東西也不能夠算共有。所以變量是不可變(final)類型,也就是常量了。
(5) 接口中不可以定義變量?如果接口可以定義變量,但是接口中的方法又都是抽象的,在接口中無法通過行為來修改屬性。有的人會說了,沒有關系,可以通過 實現接口的對象的行為來修改接口中的屬性。這當然沒有問題,但是考慮這樣的情況。如果接口 A 中有一個public 訪問權限的靜態變量 a。按照 Java 的語義,我們可以不通過實現接口的對象來訪問變量 a,通過 A.a = xxx; 就可以改變接口中的變量 a 的值了。正如抽象類中是可以這樣做的,那么實現接口 A 的所有對象也都會自動擁有這一改變后的 a 的值了,也就是說一個地方改變了 a,所有這些對象中 a 的值也都跟着變了。這和抽象類有什么區別呢,怎么體現接口更高的抽象級別呢,怎么體現接口提供的統一的協議呢,那還要接口這種抽象來做什么呢?所以接口中 不能出現變量,如果有變量,就和接口提供的統一的抽象這種思想是抵觸的。所以接口中的屬性必然是常量,只能讀不能改,這樣才能為實現接口的對象提供一個統 一的屬性。
通俗的講,你認為是要變化的東西,就放在你自己的實現中,不能放在接口中去,接口只是對一類事物的屬性和行為更高層次的抽象。對修改關閉,對擴展(不同的實現 implements)開放,接口是對開閉原則的一種體現。
所以:
接口的方法默認是public abstract;
接口中不可以定義變量即只能定義常量(加上final修飾就會變成常量)。所以接口的屬性默認是public static final 常量,且必須賦初值。
注意:final和abstract不能同時出現。
7、以下for循環的執行次數是:____
for(int x=0,y=0;(y!=0)&&(x<4);x++)
A.無限次 B.執行4次 C.執行3次 D.一次也不執行
參考答案:D
解析:y初始值為0,在整個for循環中,y的值不變,故判斷語句中的(y!=0)不成立,故一次也不執行。
8、有哪些常用的MAP類型。
解析:有以下三種類型:
- 通用 Map,用於在應用程序中管理映射,通常在 java.util 程序包中實現
- HashMap
- Hashtable
- Properties
- LinkedHashMap
- IdentityHashMap
- TreeMap
- WeakHashMap
- ConcurrentHashMap
- 專用 Map,您通常不必親自創建此類 Map,而是通過某些其他類對其進行訪問
- java.util.jar.Attributes
- javax.print.attribute.standard.PrinterStateReasons
- java.security.Provider
- java.awt.RenderingHints
- javax.swing.UIDefaults
- 一個用於幫助實現您自己的 Map 類的抽象類
- AbstractMap
9、Java匿名類。
