中軟國際Java程式設計師筆試題

mlinge-奮鬥吧發表於2012-07-03

1談談final, finally, finalize的區別。

final:修飾符(關鍵字)如果一個類被宣告為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被宣告為 abstract的,又被宣告為final的。將變數或方法宣告為final,可以保證它們在使用中不被改變。被宣告為final的變數必須在宣告時給定初值,而在以後的引用中只能讀取,不可修改。被宣告為final的方法也同樣只能使用,不能過載。

finally:異常處理時提供 finally 塊來執行任何清除操作。如果丟擲一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。

finalize:方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件呼叫的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除物件之前對這個物件呼叫的。

2、Anonymous Inner Class (匿名內部類)是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?

匿名的內部類是沒有名字的內部類。不能繼承其它類,但一個內部類可以作為一個介面,由另一個內部類實現。
3Static Nested Class Inner Class的不同,說得越多越好(面試題有的很籠統)

Static nested class(巢狀類)是將內部類宣告為static。普通內部類物件隱式地儲存了一個引用,指向建立它的外圍類物件,不能有static資料和static欄位。巢狀類意味著:1>要建立巢狀類的物件,並不需要其外圍類的物件;2>不能從巢狀類的物件中訪問非靜態的外圍類的物件。

4&&&的區別。
& 是兩個數相與,是位運算子
&&布林邏輯運算子,連線兩個條件表示式的,兩個條件表示式都為真時,整個才為真
5HashMapHashtable的區別。

  都屬於Map介面的類,實現了將惟一鍵對映到特定的值上。HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。Hashtable 類似於 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步的,是執行緒安全的。

6Collection Collections的區別。

Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。

Collection是個java.util下的介面,它是各種集合結構的父介面。

7、List, Set, Map是否繼承自Collection介面?

ListSetMap不是

8ArrayListVector的區別。

. 1>同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的2>資料增長:當需要增長時,Vector預設增長為原來一培,而ArrayList卻是原來的一半
9什麼時候用assert
assertion(斷言)在軟體開發中是一種常用的除錯方式,很多開發語言中都支援這種機制。在實現中,assertion就是在程式中的一條語句,它對一個boolean表示式進行檢查,一個正確程式必須保證這個boolean表示式的值為true;如果該值為false,說明程式已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion用於保證程式最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啟。為了提高效能,在軟體釋出後,assertion檢查通常是關閉的。
10GC是什麼?為什麼要有GC?
GC是垃圾收集器。Java程式設計師不用擔心記憶體管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以呼叫下面的方法之一:

System.gc()

Runtime.getRuntime().gc()
11、String s = new String("xyz");建立了幾個String Object?
  兩個物件,一個是“xyx”,一個是指向“xyx”的引用物件s
12.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;因為返回最接近引數的 long。通過加上 1/2 將該結果舍入為整數,取結果的基數並將其強制轉換為 long 型別。換句話說,結果等於以下表示式的值: (long)Math.floor(a + 0.5d)
13short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

short s1 = 1; s1 = s1 + 1; short s1 = 1; s1 += 1;對。對於short s1 = 1; s1 = s1 + 1;由於s1+1運算時會自動提升表示式的型別,所以結果是int型,再賦值給short型別s1時,編譯器將報告需要強制轉換型別的錯誤。對於short s1 = 1; s1 += 1;由於 += java語言規定的運算子,java編譯器會對它進行特殊處理,因此可以正確編譯。

14、sleep() 和 wait() 有什麼區別?

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

15陣列有沒有length()這個方法? String有沒有length()這個方法?
陣列沒有length()這個方法,有length的屬性。String有有length()這個方法。
16、是否可以繼承String?
String類是final類故不可以繼承。

17OverloadOverride的區別。Overloaded的方法是否可以改變返回值的型別?
overload一般翻譯為過載,表示多個函式共用同一個函式名,為了保證呼叫這些同名函式時能正確區分究竟應該呼叫的是其中的哪一個,過載的各個函式的參數列(不考慮形參名)必須彼此不同,通常簡略地說成不同參數列。它對返回值的型別沒有任何要求,所以你可以隨意為每一個過載的函式設定返回型別,相同也行,不同也行。

override一般翻譯為覆蓋,表示子類對從父類繼承來的虛擬函式重新定義,它要求參數列必須跟父類中被覆蓋的那個函式的參數列完全相同,返回值型別原則上也要求相同,但如果返回型別是父類的指標或者父類的引用,覆蓋時返回型別允許是子類的指標或者子類的引用。
18Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用==還是equals()?它們有何區別?

SetCollection容器的一個子介面,它不允許出現重複元素,當然也只允許有一個null物件。equals()區分更合適。為什麼用equals()而不用==來區分? 應該從它倆的區別談起,==是用來判斷兩者是否是同一物件(同一事物),而equals是用來判斷是否引用同一個物件。再看一下Set裡面存的是物件,還是物件的引用。根據java的儲存機制可知,set裡面存放的是物件的引用,所以當兩個元素只要滿足了equals()時就已經指向同一個物件,也就出現了重複元素。所以應該用equals()來判斷。
19給我一個你最常見到的runtime exception

ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,

ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFORMatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
20errorexception有什麼區別?

Error(錯誤)表示系統級的錯誤和程式不必處理的異常,是java執行環境中的內部錯誤或者硬體問題,比如,記憶體資源不足等,對於這種錯誤,程式基本無能為力,除了退出執行外別無選擇。
Exception(違例)表示需要捕捉或者需要程式進行處理的異常,它處理的是因為程式設計的瑕疵而引起的問題或者在外的輸入等引起的一般性問題,是程式必須處理的。
21abstract classinterface有什麼區別?
1>.相同點
A. 兩者都是抽象類,都不能例項化。
B. interface實現類及abstrct class的子類都必須要實現已經宣告的抽象方法。

2.> 不同點
A. interface需要實現,要用implements,而abstract class需要繼承,要用extends
B. 一個類可以實現多個interface,但一個類只能繼承一個abstract class
C. interface強調特定功能的實現,而abstract class強調所屬關係。
D. 儘管interface實現類及abstrct class的子類都必須要實現相應的抽象方法,但實現的形式不同。interface中的每一個方法都是抽象方法,都只是宣告的(declaration,沒有方法體),實現類必須要實現。而abstract class的子類可以有選擇地實現。
這個選擇有兩點含義:
一是Abastract class中並非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子類必須實現。那些沒有abstract的方法,在Abstrct class中必須定義方法體。
二是abstract class的子類在繼承它時,對非抽象方法既可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實現,也可以通過再次宣告其方法為抽象的方式,無需實現,留給其子類來實現,但此類必須也宣告為抽象類。既是抽象類,當然也不能例項化。
E. abstract classinterfaceClass的中介。
interface是完全抽象的,只能宣告方法,而且只能宣告pulic的方法,不能宣告privateprotected的方法,不能定義方法體,也不能宣告例項變數。然而,interface卻可以宣告常量變數,並且在JDK中不難找出這種例子。但將常量變數放在interface中違背了其作為介面的作用而存在的宗旨,也混淆了interface與類的不同價值。如果的確需要,可以將其放在相應的abstract classClass中。
abstract classinterfaceClass中起到了承上啟下的作用。一方面,abstract class是抽象的,可以宣告抽象方法,以規範子類必須實現的功能;另一方面,它又可以定義預設的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己的例項變數,以供子類通過繼承來使用。

3>. interface的應用場合
A. 類與類之前需要特定的介面進行協調,而不在乎其如何實現。
B. 作為能夠實現特定功能的標識存在,也可以是什麼介面方法都沒有的純粹標識。
C. 需要將一組類視為單一的類,而呼叫者只通過介面來與這組類發生聯絡。
D. 需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯絡。

4>abstract class的應用場合
一句話,在既需要統一的介面,又需要例項變數或預設的方法的情況下,就可以使用它。最常見的有:
A. 定義了一組介面,但又不想強迫每個實現類都必須實現所有的介面。可以用abstract class定義一組方法體,甚至可以是空方法體,然後由子類選擇自己所感興趣的方法來覆蓋。
B. 某些場合下,只靠純粹的介面不能滿足類與類之間的協調,還必需類中表示狀態的變數來區別不同的關係。abstract的中介作用可以很好地滿足這一點。
C. 規範了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類分別實現;而另一些方法卻需要各個子類根據自己特定的狀態來實現特定的功能


22介面是否可繼承介面?抽象類是否可實現(implements)介面?抽象類是否可繼承實體類(concrete class)?
介面可以繼承介面。抽象類可以實現(implements)介面。抽象類是否可繼承實體類,但前提是實體類必須有明確的建構函式。

23、構造器Constructor是否可被override?
構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被過載Overloading。
24.當一個執行緒進入一個物件的一個synchronized方法後,其它執行緒是否可進入此物件的其它方法?

  不能,一個物件的一個synchronized方法只能由一個執行緒訪問。
25程式設計題:寫一個Singleton出來。

 

 方法一: 

public class Singleton {

  private Singleton(){}

  //在自己內部定義自己一個例項,是不是很奇怪?

  //注意這是private 只供內部呼叫

  private static Singleton instance = new Singleton();

  //這裡提供了一個供外部訪問本class的靜態方法,可以直接訪問  

  public static Singleton getInstance() {

    return instance;   

   }

}

方法二:

public class Singleton {

  private static Singleton instance = null;

  public static synchronized Singleton getInstance() {

  //這個方法比上面有所改進,不用每次都進行生成物件,只是第一次     

  //使用時生成例項,提高了效率!

  if (instance==null)

    instance=new Singleton();

return instance;   }

}


 

相關文章