1. 程式人生 > 其它 >面試彙總7.13

面試彙總7.13

1. 請說明靜態變數存在什麼位置?

靜態變數存在方法區。

2. 請你談談StringBuffer和StringBuilder有什麼區別,底層實現上?

StringBuffer執行緒安全,StringBuilder執行緒不安全,底層實現上的話,StringBuffer其實就是比StringBuilder多了Synchronized修飾符。

3. 請你說明String是否能被繼承?

不能,String類是被final修飾的類,不能被繼承。

4. 請說明“static”關鍵字是什麼意思?Java中是否可以覆蓋(override)一個private或者static的方法?

“static”關鍵字表明一個成員變數或者是成員方法可以在沒有所屬的類的例項變數的情況下被訪問。
Java中static方法不能被覆蓋,因為方法覆蓋是基於執行時動態繫結的,而static方法是編譯時靜態繫結的。static方法跟類的任何例項都不相關,所以概念上不適用。

5. 請說明過載和重寫的區別,相同的引數不同返回值能過載嗎?

過載(Overloading)

(1) 方法過載是讓類以統一的方式處理不同型別資料的一種手段。多個同名函式同時存在,具有不同的引數個數/型別。過載Overloading是一個類中多型性的一種表現。

(2) Java的方法過載,就是在類中可以建立多個方法,它們具有相同的名字,但具有不同的引數和不同的定義。呼叫方法時通過傳遞給它們的不同引數個數和引數型別來決定具體使用哪個方法, 這就是多型性。

(3) 過載的時候,方法名要一樣,但是引數型別和個數不一樣,返回值型別可以相同也可以不相同。無法以返回型別作為過載函式的區分標準。

重寫(Overriding)

(1) 父類與子類之間的多型性,對父類的函式進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。

但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。

(2)若子類中的方法與父類中的某一方法具有相同的方法名、返回型別和引數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。

(3)子類函式的訪問修飾許可權不能少於父類的。

6. 請列舉你所知道的Object類的方法並簡要說明?

Object()預設構造方法。clone() 建立並返回此物件的一個副本。equals(Object obj) 指示某個其他物件是否與此物件“相等”。finalize()當垃圾回收器確定不存在對該物件的更多引用時,由物件的垃圾回收器呼叫此方法。getClass()返回一個物件的執行時類。hashCode()返回該物件的雜湊碼值。 notify()喚醒在此物件監視器上等待的單個執行緒。 notifyAll()喚醒在此物件監視器上等待的所有執行緒。toString()返回該物件的字串表示。wait()導致當前的執行緒等待,直到其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法。wait(long timeout)導致當前的執行緒等待,直到其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。wait(long timeout, int nanos) 導致當前的執行緒等待,直到其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法,或者其他某個執行緒中斷當前執行緒,或者已超過某個實際時間量。

7. 請解釋一下String為什麼不可變?

不可變物件是指一個物件的狀態在物件被建立之後就不再變化。不可改變的意思就是說:不能改變物件內的成員變數,包括基本資料型別的值不能改變,引用型別的變數不能指向其他的物件,引用型別指向的物件的狀態也不能改變。

String 不可變是因為在 JDK 中 String 類被宣告為一個 final 類,且類內部的 value 位元組陣列也是 final 的,只有當字串是不可變時字串池才有可能實現,字串池的實現可以在執行時節約很多 heap 空間,因為不同的字串變數都指向池中的同一個字串;如果字串是可變的則會引起很嚴重的安全問題,譬如資料庫的使用者名稱密碼都是以字串的形式傳入來獲得資料庫的連線,或者在 socket 程式設計中主機名和埠都是以字串的形式傳入,因為字串是不可變的,所以它的值是不可改變的,否則黑客們可以鑽到空子改變字串指向的物件的值造成安全漏洞;因為字串是不可變的,所以是多執行緒安全的,同一個字串例項可以被多個執行緒共享,這樣便不用因為執行緒安全問題而使用同步,字串自己便是執行緒安全的;因為字串是不可變的所以在它建立的時候 hashcode 就被快取了,不變性也保證了 hash 碼的唯一性,不需要重新計算,這就使得字串很適合作為 Map 的鍵,字串的處理速度要快過其它的鍵物件,這就是 HashMap 中的鍵往往都使用字串的原因。

8. 請你講講Java有哪些特性,並舉出一個和多型有關的例子。

封裝、繼承、多型。多型:指允許不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。(傳送訊息就是函式呼叫)

9. 請你講講wait方法的底層原理。

ObjectSynchronizer::wait方法通過object的物件中找到ObjectMonitor物件呼叫方法 void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS)

通過ObjectMonitor::AddWaiter呼叫把新建立的ObjectWaiter物件放入到 _WaitSet 的佇列的末尾中然後在ObjectMonitor::exit釋放鎖,接著 thread_ParkEvent->park 也就是wait。