- 相關(guān)推薦
Java程序員面試寶典
面試?yán)}1:對(duì)象與實(shí)例有什么區(qū)別?
解析:在Java的內(nèi)存分配中,對(duì)象和實(shí)例是不同的,前者分配在內(nèi)存堆里,后者分配在堆棧里,至于為什么要這樣分,參考一下其他的資料。對(duì)象是不變的東西,它是對(duì)客觀事物的抽象,實(shí)例是對(duì)操作對(duì)象的引用,你不能直接操作對(duì)象。
答案:對(duì)象和實(shí)例從宏觀的角度看,區(qū)別是:對(duì)象是同類事物的一種抽象表現(xiàn)形式,而實(shí)例是對(duì)象的具體化,一個(gè)對(duì)象可以實(shí)例化很多實(shí)例,對(duì)象就是一個(gè)模型,實(shí)例是照著這個(gè)模型生產(chǎn)的最終產(chǎn)品。實(shí)際上就是這樣,一個(gè)對(duì)象可以實(shí)例化N個(gè)實(shí)例。就像根據(jù)一個(gè)模型可以制造多個(gè)實(shí)際的產(chǎn)品一樣。
從內(nèi)存分配的角度來(lái)看,對(duì)象是保存在堆中的,而實(shí)例是存儲(chǔ)在棧中的,實(shí)例其實(shí)只是對(duì)象的一個(gè)引用,也就是指向?qū)ο蟮闹羔槨?/p>
面試?yán)}2:Java中所有的類都繼承了java.lang.Object類,而在C++中沒(méi)有像java.lang.Object這樣的類,這是為什么呢?都是面向?qū)ο,Java這樣做有什么好處呢?
解析:Java采用的是單根結(jié)構(gòu),所有的類都繼承了java.lang.Object類。對(duì)于Java這種純面向?qū)ο蟮恼Z(yǔ)言來(lái)說(shuō),這種設(shè)計(jì)具有很好的靈活性,比如對(duì)垃圾收集來(lái)說(shuō)很有利,所有的類都具有java.lang.Object類具有的方法等。C++沒(méi)有更多這樣的方法,大概是為了向后兼容。向C兼容,滿足它設(shè)計(jì)上最大的靈活性。
答案:C++的特點(diǎn)是指針,一個(gè)指針可以指向任何的對(duì)象、結(jié)構(gòu)、基本類型、函數(shù)。
Java沒(méi)有指針類型,所以Java用Object基礎(chǔ)類的共同特征來(lái)實(shí)現(xiàn)所有對(duì)象類型之間的轉(zhuǎn)換。
面試?yán)}3:聲明與定義之間的區(qū)別是什么?在Java里聲明和定義能否分開(kāi)?
解析:
聲明:一種把一個(gè)名稱引入或者重新引入到某個(gè)作用域的構(gòu)造。 定義:它也是一種聲明,但該聲明必須給出被聲明實(shí)體的細(xì)節(jié)。 對(duì)于變量而言,這里的細(xì)節(jié)是指:為被聲明實(shí)體保留存儲(chǔ)空間。 對(duì)于class類型和函數(shù)定義而言,指的是包含有一對(duì)花括號(hào)內(nèi)容的聲明。 對(duì)于外部變量而言,指的是前面沒(méi)有關(guān)鍵字extern或者在聲明時(shí)就進(jìn)行初始化。 變量的聲明有以下兩種情況:
一種是需要建立存儲(chǔ)空間的。例如,int a 在聲明的時(shí)候就已經(jīng)建立了存儲(chǔ)空間。
另一種是不需要建立存儲(chǔ)空間的,例如,extern int a。其中,變量a是在別的文件中定義的。前者是“定義性聲明(defining declaration)”,或者稱為“定義(definition)”,而后者是“引用性聲明(referencing declaration)”。從廣義的角度來(lái)講,聲明中包含著定義,但是并非所有的聲明都是定義,例如int a,它既是聲明,同時(shí)又是定義。然而對(duì)于 extern a來(lái)講,它只是聲明不是定義。在一般的情況下我們常常這樣敘述,把建立空間的聲明稱為“定義”,而把不需要建立存儲(chǔ)空間的聲明稱為“聲明”。很明顯在這里指的聲明的范圍是比較窄的,也就是說(shuō)非定義性質(zhì)的聲明。
面試?yán)}4:Object是所有類的父類,任何類都默認(rèn)繼承Object。Object類到底實(shí)現(xiàn)了哪些方法?
答案:
1.clone方法
保護(hù)方法,實(shí)現(xiàn)對(duì)象的淺復(fù)制,只有實(shí)現(xiàn)了Cloneable接口才可以調(diào)用該方法,否則拋出CloneNotSupportedException異常。
2.getClass方法
final方法,獲得運(yùn)行時(shí)類型。
3.toString方法
該方法用得比較多,一般子類都有覆蓋。
4.finalize方法
該方法用于釋放資源。因?yàn)闊o(wú)法確定該方法什么時(shí)候被調(diào)用,很少使用。
5.equals方法
該方法是非常重要的一個(gè)方法。一般equals和==是不一樣的,但是在Object中兩者是一樣的。子類一般都要重寫(xiě)這個(gè)方法。
6.hashCode方法
該方法用于哈希查找,重寫(xiě)了equals方法一般都要重寫(xiě)hashCode方法。這個(gè)方法在一些具有哈希功能的Collection中用到。
一般必須滿足obj1.equals(obj2)==true?梢酝瞥鰋bj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就滿足equals。不過(guò)為了提高效率,應(yīng)該盡量使上面兩個(gè)條件接近等價(jià)。
7.wait方法
wait方法就是使當(dāng)前線程等待該對(duì)象的鎖,當(dāng)前線程必須是該對(duì)象的擁有者,也就是具有該對(duì)象的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(long timeout)設(shè)定一個(gè)超時(shí)間隔,如果在規(guī)定時(shí)間內(nèi)沒(méi)有獲得鎖就返回。
調(diào)用該方法后當(dāng)前線程進(jìn)入睡眠狀態(tài),直到以下事件發(fā)生。 (1)其他線程調(diào)用了該對(duì)象的notify方法。 (2)其他線程調(diào)用了該對(duì)象的notifyAll方法。 (3)其他線程調(diào)用了interrupt中斷該線程。 (4)時(shí)間間隔到了。
此時(shí)該線程就可以被調(diào)度了,如果是被中斷的話就拋出一個(gè)InterruptedException異常。
8.notify方法
該方法喚醒在該對(duì)象上等待的某個(gè)線程。
9.notifyAll方法
該方法喚醒在該對(duì)象上等待的所有線程。
【Java程序員面試寶典】相關(guān)文章:
java程序員面試題08-15
初級(jí)java程序員面試要求06-20
java程序員面試自我介紹04-09
面試寶潔寶典07-31
變態(tài)級(jí)JAVA程序員面試32問(wèn)08-09
java程序員面試考試題及答案08-30
面試寶典:換位思考談面試07-31
面試自我介紹寶典07-14
主管級(jí)人才的面試寶典07-31