Java程式設計師面試寶典

才智咖 人氣:4.84K

面試例題1:物件與例項有什麼區別?

Java程式設計師面試寶典

解析:在Java的記憶體分配中,物件和例項是不同的,前者分配在記憶體堆裡,後者分配在堆疊裡,至於為什麼要這樣分,參考一下其他的資料。物件是不變的東西,它是對客觀事物的抽象,例項是對操作物件的引用,你不能直接操作物件。

答案:物件和例項從巨集觀的角度看,區別是:物件是同類事物的一種抽象表現形式,而例項是物件的具體化,一個物件可以例項化很多例項,物件就是一個模型,例項是照著這個模型生產的最終產品。實際上就是這樣,一個物件可以例項化N個例項。就像根據一個模型可以製造多個實際的產品一樣。

從記憶體分配的角度來看,物件是儲存在堆中的,而例項是儲存在棧中的,例項其實只是物件的一個引用,也就是指向物件的指標。

面試例題2:Java中所有的'類都繼承了ct類,而在C++中沒有像ct這樣的類,這是為什麼呢?都是物件導向,Java這樣做有什麼好處呢?

解析:Java採用的是單根結構,所有的類都繼承了ct類。對於Java這種純物件導向的語言來說,這種設計具有很好的靈活性,比如對垃圾收集來說很有利,所有的類都具有ct類具有的方法等。C++沒有更多這樣的方法,大概是為了向後相容。向C相容,滿足它設計上最大的靈活性。

答案:C++的特點是指標,一個指標可以指向任何的物件、結構、基本型別、函式。

Java沒有指標型別,所以Java用Object基礎類的共同特徵來實現所有物件型別之間的轉換。

面試例題3:宣告與定義之間的區別是什麼?在Java裡宣告和定義能否分開?

解析:

宣告:一種把一個名稱引入或者重新引入到某個作用域的構造。 定義:它也是一種宣告,但該宣告必須給出被宣告實體的細節。 對於變數而言,這裡的細節是指:為被宣告實體保留儲存空間。 對於class型別和函式定義而言,指的是包含有一對花括號內容的宣告。 對於外部變數而言,指的是前面沒有關鍵字extern或者在宣告時就進行初始化。 變數的宣告有以下兩種情況:

一種是需要建立儲存空間的。例如,int a 在宣告的時候就已經建立了儲存空間。

另一種是不需要建立儲存空間的,例如,extern int a。其中,變數a是在別的檔案中定義的。前者是“定義性宣告(defining declaration)”,或者稱為“定義(definition)”,而後者是“引用性宣告(referencing declaration)”。從廣義的角度來講,宣告中包含著定義,但是並非所有的宣告都是定義,例如int a,它既是宣告,同時又是定義。然而對於 extern a來講,它只是宣告不是定義。在一般的情況下我們常常這樣敘述,把建立空間的宣告稱為“定義”,而把不需要建立儲存空間的宣告稱為“宣告”。很明顯在這裡指的宣告的範圍是比較窄的,也就是說非定義性質的宣告。

面試例題4:Object是所有類的父類,任何類都預設繼承Object。Object類到底實現了哪些方法?

答案:

e方法

保護方法,實現物件的淺複製,只有實現了Cloneable接口才可以呼叫該方法,否則丟擲CloneNotSupportedException異常。

lass方法

final方法,獲得執行時型別。

ring方法

該方法用得比較多,一般子類都有覆蓋。

lize方法

該方法用於釋放資源。因為無法確定該方法什麼時候被呼叫,很少使用。

ls方法

該方法是非常重要的一個方法。一般equals和==是不一樣的,但是在Object中兩者是一樣的。子類一般都要重寫這個方法。

Code方法

該方法用於雜湊查詢,重寫了equals方法一般都要重寫hashCode方法。這個方法在一些具有雜湊功能的Collection中用到。

一般必須滿足ls(obj2)==true。可以推出- Code()==Code(),但是hashCode相等不一定就滿足equals。不過為了提高效率,應該儘量使上面兩個條件接近等價。

方法

wait方法就是使當前執行緒等待該物件的鎖,當前執行緒必須是該物件的擁有者,也就是具有該物件的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(long timeout)設定一個超時間隔,如果在規定時間內沒有獲得鎖就返回。

呼叫該方法後當前執行緒進入睡眠狀態,直到以下事件發生。 (1)其他執行緒呼叫了該物件的notify方法。 (2)其他執行緒呼叫了該物件的notifyAll方法。 (3)其他執行緒呼叫了interrupt中斷該執行緒。 (4)時間間隔到了。

此時該執行緒就可以被排程了,如果是被中斷的話就丟擲一個InterruptedException異常。

fy方法

該方法喚醒在該物件上等待的某個執行緒。

fyAll方法

該方法喚醒在該物件上等待的所有執行緒。