高軟面試題java部分_第1頁
高軟面試題java部分_第2頁
高軟面試題java部分_第3頁
高軟面試題java部分_第4頁
高軟面試題java部分_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、(一)Java 部分1、JDK 中哪些類是不能繼承的?【信雅達(dá)面試題】【參考】不能繼承的是類是那些用 final 關(guān)鍵字修飾的類。一般比較基本的類型或防止擴(kuò)展類無意間破壞原來方法的實(shí)現(xiàn)的類型都應(yīng)該是 final 的。2、String 是最基本的數(shù)據(jù)類型嗎? 【天能智健面試題】【參考】基本數(shù)據(jù)類型包括 byte、int、char、long、float、double、boolean 和 short。所以 String 不屬于基本數(shù)據(jù)類型范疇內(nèi),但 String 屬于最常見一種類接口數(shù)組類型。3、Java 對象初始化順序?【騰鵬科技面試題】【參考】分為兩種,一種是本類的初始化,一種是含有父類的初始化

2、順序。這里來說,本類的初始化順序是:靜態(tài)變量、靜態(tài)初始化塊、變量、初始化塊、構(gòu)造函數(shù)繼承類的初始化順序是:父類靜態(tài)變量、父類靜態(tài)初始化塊、子類靜態(tài)變量、子類靜態(tài)初始塊、父類變量、父類初始化塊、父類構(gòu)造函數(shù)、子類變量、子類初始化塊、子類構(gòu)造函數(shù)。【分析】staticSystem.out.println("靜態(tài)塊");System.out.println("初始化模塊"); public ClassName() System.out.println("構(gòu)造方法");說明:原則上回答全面的話,應(yīng)該是完整的說出帶有繼承的這種類的初始化過程,下

3、面有個(gè)步驟可以參考:1. 裝載程序的時(shí)候首先找到的是它的基(父)類,如果有多層基(父)類則會(huì)一級一級的往上找最后找到根基(父)類。2. 執(zhí)行根基礎(chǔ)(父)類中的 static 初始化,再執(zhí)行下一個(gè)衍生類中的 static,依此類推,一直保持這個(gè)順序。3. 此時(shí)類已經(jīng)裝載完畢,開始創(chuàng)建對象,所有的基本數(shù)據(jù)類型都會(huì)設(shè)成它們的默認(rèn)值,對象句柄設(shè)為 null4. 調(diào)用基礎(chǔ)(父)類的構(gòu)造方法,基礎(chǔ)(父)類的構(gòu)建采用與衍生類構(gòu)造方法完全相同的處理過程。5. 構(gòu)造方法初始完之后,進(jìn)行變量的初始化。6. 執(zhí)行構(gòu)造方法中剩余的部分。4、寫幾個(gè)線程安全類,不安全的,支持排序的類名?【軟通動(dòng)力面試題】【參考Ø

4、;Ø】線程安全類:Vector 、Hashtable、Stack。線程不安全的類:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap 等。支持排序的類有 HashSet、LinkedHashSet、TreeSet 等(Set 接口下的實(shí)現(xiàn)都支持排序)ØØ【分析】此題主要考查集合框架的知識(shí)。在集合框架中 Collection 接口為集合的根類型,提供集合操作的常用 API 方法,該接口下派生出兩個(gè)子接口,一個(gè)是不支持排序的 List 接口, 一個(gè)是有自身排序的 Set 接口,所以回答排序與不排序分別從兩接口的實(shí)現(xiàn)

5、中在作答。線程安全上來說,Vector 類比同屬于 List 接口的 ArrayList 要早,是一個(gè)線程安全的類,在JDK1.2 以后才推出一個(gè)異步的 ArrayList 類,比 Vector 類效率高。同理 Stack 繼承自 Vector 也線程安全的類,另外在在 Map 接口的實(shí)現(xiàn)在 Hashtable 也是個(gè)線程安全的類。5、哪幾個(gè)方法可以實(shí)現(xiàn)一個(gè)線程?【上海華信面試題】【參考】一是繼承 Thread ,重寫 Thread 類的方法 run 方法;另種是實(shí)現(xiàn) runnable 接口并實(shí)現(xiàn) run 方法?!痉治觥靠疾榫€程的基本實(shí)現(xiàn),很多公司喜歡考查這方面知識(shí),另外補(bǔ)充一下關(guān)于線程的 r

6、un方法,在多線程 API 中啟動(dòng)一個(gè)線程是調(diào)用 start()方法,線程進(jìn)入就緒狀態(tài)。6、STOP()和 SUSPEND()不推薦使用的原因?【參考】stop()是因?yàn)樗话踩?。它?huì)解除由線程獲取的所有鎖定,當(dāng)在一個(gè)線程對象上調(diào)用 stop()方法時(shí),這個(gè)線程對象所運(yùn)行的線程就會(huì)立即停止,假如一個(gè)線程正在執(zhí)行:synchronizedvoid x = 3; y = 4;由于方法是同步的,多個(gè)線程時(shí)總能保證 x,y 被同時(shí)賦值,而如果一個(gè)線程正在執(zhí)行到 x = 3;時(shí),被調(diào)用了 stop()方法,即使在同步塊中,它也干脆地 stop 了, 這樣就產(chǎn)生了 整的殘廢數(shù)據(jù)。而多線程編程中最最基礎(chǔ)的條

7、件要保證數(shù)據(jù)的完整性,所以請忘記線程的 stop 方法,以后我們再也不要說“停止線程”了。而且如果對象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。suspend()方法容易發(fā)生死鎖。調(diào)用 suspend()的時(shí)候,目標(biāo)線程會(huì)停下來,但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線程都不能鎖定的,除非被"掛起"的線程恢復(fù)運(yùn)行。對任何線程來說,如果它們想恢復(fù)目標(biāo)線程,同時(shí)又試圖使用任何一個(gè)鎖定的,就 會(huì)造成死鎖。所以不應(yīng)該使用 suspend(),而應(yīng)在自己的 Thread 類中置入一個(gè)標(biāo)志,指出線程應(yīng)該活動(dòng)還是掛起。若標(biāo)志指出線程應(yīng)該掛起,便用 wait()

8、命其進(jìn)入等待狀態(tài)。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),則用一個(gè) notify()重新啟動(dòng)線程。【分析】7、"="和 equals 方法有什么區(qū)別?【軟】【參考】=操作符專門用來比較兩個(gè)變量的值是否相等,也就是用于比較變量所對應(yīng)的內(nèi)存中所的數(shù)值是否相同,要比較兩個(gè)基本類型的數(shù)據(jù)或兩個(gè)符。變量是否相等,只能用=操作如果一個(gè)變量指向的數(shù)據(jù)是對象類型的,那么,這時(shí)候涉及了兩塊內(nèi)存,對象本身占用一塊內(nèi)存(堆內(nèi)存),變量也占用一塊內(nèi)存,例如 Objet obj = new Object();變量 obj 是一個(gè)內(nèi)存,new Object()是另一個(gè)內(nèi)存,此時(shí),變量 obj 所對應(yīng)的內(nèi)存中的數(shù)值就是

9、對象占用的那塊內(nèi)存的首地址。對于指向?qū)ο箢愋偷淖兞浚绻容^兩個(gè)變量是否指向同一個(gè)對象,即要看這兩個(gè)變量所對應(yīng)的內(nèi)存中的數(shù)值是否相等,這時(shí)候就需要用=操作符進(jìn)行比較。equals 方法是用于比較兩個(gè)相同,它比較的兩個(gè)對象是對象的內(nèi)容是否相同,就好比去比較兩個(gè)人的長相是否的。例如,對于下面的代碼:Stringa=new String("foo"); Stringb=new String("foo");兩條 new 語句創(chuàng)建了兩個(gè)對象,然后用 a,b 這兩個(gè)變量分別指向了其中一個(gè)對象,這是兩個(gè)不同的對象,它們的首地址是不同的,即 a 和b 中的數(shù)值是不相同

10、的,所以,表達(dá)式 a=b 將返回 false,而這兩個(gè)對象中的內(nèi)容是相同的,所以,表達(dá)式 a.equals(b)將返回true。在實(shí)際開發(fā)中,我們經(jīng)常要比較傳遞進(jìn)行來的字符串內(nèi)容是否等,例如,String input= ;input.equals(“quit”),如果一個(gè)類沒有自己定義 equals 方法,那么它將繼承 Object類的 equals 方法,Object 類的 equals 方法的實(shí)現(xiàn)代碼如下:boolean equals(Object o) returnthis=o;這說明,如果一個(gè)類沒有自己定義 equals 方法,它默認(rèn)的 equals 方法(從 Object 類繼承的)

11、就是使用=操作符,也是在比較兩個(gè)變量指向的對象是否是同一對象,這時(shí)候使用equals 和使用=會(huì)得到同樣的結(jié)果,如果比較的是兩個(gè)的對象則總返回 false。如果你編寫的類希望能夠比較該類創(chuàng)建的兩個(gè)實(shí)例對象的內(nèi)容是否相同,那么你必須覆蓋 equals方法,由你自己寫代碼來決定在什么情況即可認(rèn)為兩個(gè)對象的內(nèi)容是相同的。8、靜態(tài)變量和實(shí)例變量的區(qū)別?【參考】在語法定義上的區(qū)別:靜態(tài)變量前要加 static 關(guān)鍵字,而實(shí)例變量前則不加。在程序運(yùn)行時(shí)的區(qū)別:實(shí)例變量屬于某個(gè)對象的屬性,必須創(chuàng)建了實(shí)例對象,其中的實(shí)例變量才會(huì)被分配空間,才能使用這個(gè)實(shí)例變量。靜態(tài)變量不屬于某個(gè)實(shí)例對象,而是屬于類,所以也稱

12、為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實(shí)例對象,靜態(tài)變量就會(huì)被分配空間,靜態(tài)變量就可以被使用了??傊瑢?shí)例變量必須創(chuàng)建對象后才可以通過這個(gè)對象來使用,靜態(tài)變量則可以直接使用類名來。例如,對于下面的程序,無論創(chuàng)建多少個(gè)實(shí)例對象,永遠(yuǎn)都只分配了一個(gè) staticVar 變量,并且每創(chuàng)建一個(gè)實(shí)例對象,這個(gè) staticVar 就會(huì)加 1;但是,每創(chuàng)建一個(gè)實(shí)例對象,就會(huì)分配一個(gè) instanceVar,即可能分配多個(gè) instanceVar,并且每個(gè) instanceVar 的值都只自加了 1 次。public class VariantTestpublic static int stati

13、cVar = 0; public int instanceVar = 0;public VariantTest()staticVar+; instanceVar+;System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);備注:這個(gè)解答除了說清楚兩者的區(qū)別外,最后還用一個(gè)具體的應(yīng)用例子來說明兩者的差異,體現(xiàn)了自己有很好的解說問題和設(shè)計(jì)案例的能力,思維敏捷,超過一般程序員,有寫作能力!9、構(gòu)造器的名能不能和類的名字相同?【參考】構(gòu)造器的名稱必須與類名相同?!痉治觥繕?gòu)造器或構(gòu)造函數(shù)(有些書這樣叫)主要用

14、來對類的成員變量進(jìn)行初始化,當(dāng)類創(chuàng)建實(shí)例時(shí)調(diào)用。10、在一個(gè)主方法類可不可以調(diào)用一個(gè)非靜態(tài)的方法?【參考】不可以調(diào)用。因?yàn)?Java 的主方法(main)方法本身也是 static 類型方法,一個(gè) static類型方法,發(fā)起對另一個(gè) static 方法的調(diào)用沒有問題?!痉治觥快o態(tài)方法可以調(diào)用其它的靜態(tài)方法,但是不能調(diào)用非靜態(tài)方法,這個(gè)好比 Java 中的類變量與實(shí)例變量的關(guān)系。類變量是被所有類成員共享,而實(shí)例變量只被該實(shí)例共享,11、GC 是什么,為什么要使用它?【阿斯拓】【參考】GC 是收集的意思(Gabage Collection),內(nèi)存處理是編程容易出現(xiàn)問題的地方,忘記或者錯(cuò)誤的內(nèi)存回收

15、會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至,Java 提供的 GC 功能可以自動(dòng)監(jiān)測對象是否超過作用域,從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java 語言沒有提供已分配內(nèi)存的顯示操作方法?!痉治觥?2、說一下回收的原理,可以直接從內(nèi)存中回收嗎?【參考】Java 語言中一個(gè)顯著的特點(diǎn)就是引入了回收機(jī)制,使 c+程序員最頭疼的內(nèi)存管理的問題迎刃而解,它使得 Java 程序員在編寫程序的時(shí)候不再需要考慮內(nèi)存管理?;厥湛梢杂行У姆乐箖?nèi)存泄露,有效的使用可以使用的內(nèi)存。回收器通常是作為一個(gè)單獨(dú)的低級別的線程運(yùn)行,不可預(yù)知的情況下對內(nèi)存堆中已經(jīng)的或者長時(shí)間沒有使用的對象進(jìn)行清除和回收,程序員不能實(shí)時(shí)的調(diào)用回收器對某個(gè)對象或所有

16、對象進(jìn)行回收,因回收,為 Java 語言規(guī)范并不保證 GC 一定會(huì)執(zhí)行?;厥諜C(jī)制有分代回收和標(biāo)記增量回收?!痉治觥?3、Java 的異常有哪幾種,有什么區(qū)別?【參考】兩大類,一般異常和運(yùn)行時(shí)異常。一般異常,這些異常是在定義方法時(shí)拋出的,這些異常必需用try catch 拋出,或 throws 處理,如果不處理,程序?qū)⒕幾g失敗。比如:IOException、FileNotFoundException、SQLException 等。運(yùn)行時(shí)異常是程序運(yùn)行時(shí)可能報(bào)出的異常??梢杂?try catch 抓取,也可以不做任何處理。例如:NullPointerException 異常就是一種比較常見的運(yùn)行時(shí)

17、異常?!痉治觥?4、Integer 與 int 的區(qū)別?【參考】int 是 java 提供的 8 種原始數(shù)據(jù)類型之一,另外 Java 為每個(gè)原始類型提供了封裝類,Integer 是 java 為 int 提供的封裝類。int 的默認(rèn)值為 0,而 Integer 的默認(rèn)值為 null,即Integer 可以區(qū)分出未賦值和值為 0 的區(qū)別,int 則無法表達(dá)出未賦值的情況。15、Java Reflection 是什么?【】【參考】JAVA 反射,Reflection 是 Java 程序開發(fā)語言的特征之一,它允許運(yùn)行中的 Java 程序?qū)ψ陨磉M(jìn)行檢查,或者說"自審",并能直接操作

18、程序的內(nèi)部屬性?!痉治觥?6、寫幾個(gè) java.lang.Object 類中的方法名稱?!緟⒖肌恐饕?equals()、toString()、getClass()、hashCode()、clone()、notify()、wait()、notify()方法。【分析】這種題能記多少個(gè)就說多少個(gè),不一定要求你所有的都記住,但是要理解其中部分重要方法的含義和作用。17、&和&&的區(qū)別?【參考】&和&&都可以用作邏輯與的運(yùn)算符,表示邏輯與(and),當(dāng)運(yùn)算符兩邊的表達(dá)式的結(jié)果都為 true 時(shí),整個(gè)運(yùn)算結(jié)果才為 true,否則,只要有一方為 false,

19、則結(jié)果為 false。&&還具有短路的功能,即如果第一個(gè)表達(dá)式為 false,則不再計(jì)算第二個(gè)表達(dá)式。&還可以用作位運(yùn)算符,當(dāng)&操作符兩邊的表達(dá)式不是 boolean 類型時(shí),&表示按位與操作,我們通常使用 0x0f 來與一個(gè)整數(shù)進(jìn)行&運(yùn)算,來獲取該整數(shù)的最低 4 個(gè) bit 位?!痉治觥肯日f分別說兩者的作用,再說出&&和&各自的不同之處。18、數(shù)組有沒有 length()這個(gè)方法,String 有沒有 length()這個(gè)方法。【參考】數(shù)組沒有 length()方法,但有 length 屬性String 有 length

20、()方法。【分析】考查平時(shí)使用數(shù)組和字符串的一些細(xì)節(jié),一般在使用19、String s=new String(“xyz”)創(chuàng)建了幾個(gè)對象【參考】2 個(gè) string 對象,一個(gè)是=null 的s,一個(gè)是=“xyz”的 string兩個(gè)或一個(gè)”xyz”對應(yīng)一個(gè)對象,這個(gè)對象放在字符串常量緩沖區(qū),常量”xyz”不管出現(xiàn)多少遍,都是緩沖區(qū)中的那一個(gè)。New String 每寫一遍,就創(chuàng)建一個(gè)新的對象,它一句那個(gè)常量”xyz”對象的內(nèi)容來創(chuàng)建出一個(gè)新 String 對象。如果以前就用過xyz,這句代表就 創(chuàng)建”xyz”自己了,直接從緩沖區(qū)拿?!痉治觥?0、最常見的 runtime exception

21、運(yùn)行時(shí)異常?【參考】ClassCastException(類型轉(zhuǎn)換異常)、NumberFormatException(格式化異常)、ArrayIndexOutOfBoundsException ( 數(shù)組越界異常)、ArithmeticException ( 算術(shù)異常)、NullPointerException(空指針異常)等等【分析】這道題主要考查大家平時(shí)在項(xiàng)目開發(fā)過程中經(jīng)常遇到的一些異常類型信息,通過這些異常來考查大家的項(xiàng)目經(jīng)驗(yàn)與項(xiàng)目排錯(cuò)能力。21、用 JDBC 來實(shí)現(xiàn)數(shù)據(jù)庫可以采用下面的幾個(gè)步驟:【參考】1、2、3、4、5、6、7、通過驅(qū)動(dòng)器管理器獲取連接接口(Connection)。獲得

22、 Statement 或它的子類。指定 Statement 中的參數(shù)。通過 StatementSQL 語句。檢查并處理返回的結(jié)果。關(guān)閉 Statement。關(guān)閉連接接【分析】22、Error 和 exception 的區(qū)別與【參考】error 表示恢復(fù)不是不可能,但很?的情況下的一種嚴(yán)重問題。比如說內(nèi)存溢,網(wǎng)絡(luò)故障等,不可能指望程序能處理的一類錯(cuò)誤。Exception 表示一種由程序設(shè)計(jì)或?qū)崿F(xiàn)問題,像我們常說的異常處理,就是屬于這類, 一般程序可以捕獲和處理這些異常?!痉治觥窟@道題的難點(diǎn)在Error 很多時(shí)候由于我們無法重現(xiàn)這種Error 導(dǎo)致很多同學(xué)甚至不知道Error 到底是什么,所以很容

23、易把題目中的兩種錯(cuò)誤劃上等號。23、String s = "Hello"s = s + " world!"這兩行代碼執(zhí)行后,原始的 String對象中的內(nèi)容到底變了沒有?【參考】沒有。因?yàn)?String 被設(shè)計(jì)成不可變(immutable)類,所以它的所有對象都是不可變對象。在這段代碼中,s 原先指向一個(gè) String 對象,內(nèi)容是 "Hello",然后我們對 s 進(jìn)行了+操作,那么s 所指向的那個(gè)對象是否發(fā)生了改變呢?是沒有。這時(shí),s 不指向原來那個(gè)對象了,而指向了另一個(gè) String 對象,內(nèi)容為"Helloworld!

24、",原來那個(gè)對象還存在于內(nèi)存之中,只是 s 這個(gè)變量不再指向它了。通過上面的說明,我們很容易導(dǎo)出另一個(gè)結(jié)論,如果經(jīng)常對字符串進(jìn)行各種各樣的修改,或者說,不可預(yù)見的修改,那么使用 String 來代表字符串的話會(huì)引起很大的內(nèi)存開銷。因?yàn)镾tring 對象建立之后不能再改變,所以對于每一個(gè)不同的字符串,都需要一個(gè) String 對象來表示。這時(shí),應(yīng)該考慮使用 StringBuffer 類,它允許修改,而不是每個(gè)不同的字符串都要生成一個(gè)新的對象。并且,這兩種類的對象轉(zhuǎn)換十分容易。同時(shí),我們還可以知道,如果要使用內(nèi)容相同的字符串,不必每次都 new 一個(gè) String。例如我們要在構(gòu)造器中對

25、一個(gè)名叫 s 的 String當(dāng)這樣做:變量進(jìn)行初始化,把它設(shè)置為初始值,應(yīng)public private.publicclass DemoString s;Demos = "InitialValue".而非s = new String("Initial Value");后者每次都會(huì)調(diào)用構(gòu)造器,生成新對象,性能低下且內(nèi)存開銷大,并且沒有意義,因?yàn)?String 對象不可改變,所以對于內(nèi)容相同的字符串,只要一個(gè) String 對象來表示就可以了。也就說,多次調(diào)用上面的構(gòu)造器創(chuàng)建多個(gè)對象,他們的 String 類型屬性 s 都指向同一個(gè)對象。上面的結(jié)論還基于這

26、樣一個(gè)事實(shí):對于字符串常量,如果內(nèi)容相同,Java 認(rèn)為它們代表同一個(gè) String 對象。而用關(guān)鍵字 new 調(diào)用構(gòu)造器,總是會(huì)創(chuàng)建一個(gè)新的對象,無論內(nèi)容是否相同。至于為什么要把 String 類設(shè)計(jì)成不可變類,是它的用途決定的。其實(shí)不只 String,很多 Java標(biāo)準(zhǔn)類庫中的類都是不可變的。在開發(fā)一個(gè)系統(tǒng)的時(shí)候,我們有時(shí)候也需要設(shè)計(jì)不可變類, 來傳遞一組相關(guān)的值,這也是面向?qū)ο笏枷氲捏w現(xiàn)。不可變類有一些優(yōu)點(diǎn),比如因?yàn)樗膶ο笫侵蛔x的,所以多線程并發(fā)也有任何問題。當(dāng)然也有一些缺點(diǎn),比如每個(gè)不同的能上的問題。所以 Java 標(biāo)準(zhǔn)類庫還提供了一個(gè)可狀態(tài)都要一個(gè)對象來代表,可能會(huì)造變版本,即 S

27、tringBuffer。24、面向?qū)ο蟮奶卣饔心男┓矫??【參考】面向?qū)ο蟮木幊陶Z言有封裝、繼承u 封裝、多態(tài)等 3 個(gè)主要的特征。封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實(shí)現(xiàn)軟件部件的“高內(nèi)聚、低耦合”,防止程序相互依賴性而帶來的變動(dòng)影響。面向?qū)ο蟮姆庋b就是把描述一個(gè)對象的屬性和行為的代碼封裝在一個(gè)“模塊”中,也就是一個(gè)類中,屬性用變量定義,行為用方法進(jìn)行定義,方法可以直接u 繼承同一個(gè)對象中的屬性。在定義和實(shí)現(xiàn)一個(gè)類的時(shí)候,可以在一個(gè)已經(jīng)存在的類的基礎(chǔ)之上來進(jìn)行,把這個(gè)已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并可以加入若干新的內(nèi)容,或修改原來的方法使之更適合特殊的需要,這就

28、是繼承。繼承是子類自動(dòng)共享父類數(shù)據(jù)和方法的機(jī)制,這是類之間的一種關(guān)系,提高了軟件的可重用性和可擴(kuò)展性。u 多態(tài)多態(tài)是指程序中定義的變量所指向的具體類型和通過該變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)變量倒底會(huì)指向哪個(gè)類的實(shí)例對象,該變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類,這樣,不用修改源程序代碼,就可以讓變量綁定到各種不同的類實(shí)現(xiàn)上,從而導(dǎo)致該調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。多態(tài)性增強(qiáng)了軟件的靈活性和擴(kuò)展性。25、

29、JVM 工作原理?運(yùn)行 jvm 字符碼的工作是由解釋器來完成的。解釋執(zhí)行過程分三步進(jìn)行: 代碼的裝入、代碼的校驗(yàn)、和代碼的執(zhí)行。裝入代碼的工作由“類裝載器 class loader”完成。類裝載器負(fù)責(zé)裝入運(yùn)行一個(gè)程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被調(diào)用的類。當(dāng)類裝載器裝入一個(gè)類時(shí),該類被放在自己的名字空間中。除了通過符號自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本臺(tái)計(jì)算機(jī)的所有類都在同一地址空間中,而所有從外部引進(jìn)的類,都有一個(gè)自己的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運(yùn)行效率,同時(shí)又保證它們與從外部引進(jìn)的類相互影響。當(dāng)裝入了運(yùn)行程序需要的

30、所有類后,解釋器便可確定整個(gè)可執(zhí)行程序的內(nèi)存布局。解釋器為符號與特定的地址空間建立對應(yīng)關(guān)系及表。通過在這一階段確定代碼的內(nèi)布局,java 很好地解決了由超類改變而使子類的問題,同時(shí)也防止了代碼的校驗(yàn)器可以發(fā)現(xiàn)操作數(shù)棧益處、行了。Java 字節(jié)碼的執(zhí)行有兩種方式:。隨后,被裝入的代碼由字節(jié)碼校驗(yàn)器進(jìn)行檢查。數(shù)據(jù)類型轉(zhuǎn)化等多種錯(cuò)誤。通過校驗(yàn)后,代碼便開始執(zhí)1)即時(shí)編譯方式:解釋器先將字節(jié)編譯成碼,然后再執(zhí)行該碼。2)解釋執(zhí)行方式:解釋器通過每次解釋并執(zhí)行一小段代碼來完成 java 字節(jié)。碼程序的所有操作。26、說說 Java 中的內(nèi)存分配?Java 把內(nèi)存分成兩種,一種叫做棧內(nèi)存,一種叫做堆內(nèi)存在

31、函數(shù)中定義的一些基本類型的變量和對象的變量都是在函數(shù)的棧內(nèi)存中分配。當(dāng)在一段代碼塊中定義一個(gè)變量時(shí),java 就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過變量的作用域后,java 會(huì)自動(dòng)掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立刻被另作它用。堆內(nèi)存用于存放由 new 創(chuàng)建的對象和數(shù)組。在堆中分配的內(nèi)存,由 java 虛擬機(jī)自動(dòng)垃圾回收器來管理。在堆中產(chǎn)生了一個(gè)數(shù)組或者對象后,還可以在棧中定義一個(gè)特殊的變量,這個(gè)變量的取值等于數(shù)組或者對象在堆內(nèi)存中的首地址,在棧中的這個(gè)特殊的變量就變成了數(shù)組或者對象的變量,以后就可以在程序中使用棧內(nèi)存中的變量來堆中的數(shù)組或者對象,變量相當(dāng)于為數(shù)組或者對象起的一個(gè)別名,

32、或者代號。變量是普通變量,定義時(shí)在棧中分配內(nèi)存,變量在程序運(yùn)行到作用域外。而數(shù)組對象本身在堆中分配,即使程序運(yùn)行到使用 new 產(chǎn)生數(shù)組和對象的語句所在地代碼塊之外,數(shù)組和對象本身占用的堆內(nèi)存也被,數(shù)組和對象在沒有變量指向它的時(shí)候,才變成,不能再被使用,但是仍然占著內(nèi)存,在隨后的一個(gè)不確定的時(shí)間被垃圾回收器掉。這個(gè)也是 java 比較占內(nèi)存的主要原因。但是在寫程序的時(shí)候,可以人為的控制。27、final, finally, finalize 的區(qū)別。【參考final內(nèi)部類要】用于屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。局部變量,局部變量必須定義成 final 類型,例如,

33、一段代碼finally 是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。finalize 是 Object 類的一個(gè)方法,在收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對象的此方法,回收,例如關(guān)閉文件等。JVM 不保證此方法總被可以覆蓋此方法提供調(diào)用收集時(shí)的其他28、Extends 和 Implement 的不同?【參考】extends 是繼承父類,只要那個(gè)類不是為 final 或者那個(gè)類定義為 abstract 的就能繼承,JAVA 中不支持多重繼承,但是可以用接口來實(shí)現(xiàn),這樣就要用到 implements,繼承只能繼承一個(gè)類,但 implements 可以實(shí)現(xiàn)多個(gè)接口,用逗號比如 class A extends

34、 B implements C,D,E就行了29、抽象類是否可以沒有抽象方法?為什么?【參考】可以在 java 中用 abstract 關(guān)鍵字來修飾一個(gè)類時(shí),這個(gè)類叫做抽象類。抽象類中不一定要包含 abstract 方法,但一個(gè)類中包含了 abstract 方法,則這個(gè)類必為 abstract 類。須30、靜態(tài)的多態(tài)和動(dòng)態(tài)的多態(tài)的區(qū)別?【參考】靜態(tài)的多態(tài): 即為重載 ;方法名相同,參數(shù)個(gè)數(shù)或類型不相同。(overloading)動(dòng)態(tài)的多態(tài): 即為重寫;子類覆蓋父類的方法,將子類的實(shí)例傳與父類的調(diào)用的是子類的方法實(shí)現(xiàn)接口的實(shí)例傳與接口的調(diào)用的實(shí)現(xiàn)類的方法。31、說出一些常用的類,包,接口,請各舉

35、 5 個(gè)?【參考】常用的類:String、StringBuffer、 Integer 、Vector、ArrayList、Hashtable等常用的包:java.langjava.iojava.util 、java.sql 。常用的接口:集合中的List、Set、 Map接口;與Servlet API相關(guān)的Servlet接口、HttpServletRequest,HttpServletResponse,HttpSession接口等。32、Collections 和 Collection 的區(qū)別【天晟科技】【參考】Collection 是個(gè) java.util 下的接口,它是各種集合結(jié)構(gòu)的父接口

36、,定義了集合對象的基本操作方法。Collections 是個(gè) java.util 下的工具類,它包含有各種有關(guān)集合操作的靜態(tài)方法,主要是針對集合類的一個(gè)幫助類或者叫包裝類,它提供一系列對各種集合的搜索,排序,線程安全化等操作方法。33、Class.forName 的作用?為什么要用?【參考】按參數(shù)中指定的字符串形式的類名去搜索并加載相應(yīng)的類,如果該類字節(jié)碼已經(jīng)被加載過,則返回代表該字節(jié)碼的 Class 實(shí)例對象,否則,按類加載器的委托機(jī)制去搜索和加載該類,如果所有的類加載器都無法加載到該類,則拋出 ClassNotFoundException。加載完這個(gè) Class 字節(jié)碼后,接著就可以使用

37、Class 字節(jié)碼的 newInstance 方法去創(chuàng)建該類的實(shí)例對象了。有時(shí)候,我們程序中所有使用的具體類名在設(shè)計(jì)時(shí)(即開發(fā)時(shí))無法確定,只有程序運(yùn)行時(shí)才能確定,這時(shí)候就需要使用 Class.forName 去動(dòng)態(tài)加載該類,這個(gè)類名通常是在配置文件中配置的,例如,spring 的 ioc 中每次依賴注入的具體類就是這樣配置的,jdbc 的驅(qū)動(dòng)類名通常也是通過配置文件來配置的,以便在換驅(qū)動(dòng)類名。交付使用后不用修改源程序就可以更34、接口是否可繼承接口? 抽象類是否可實(shí)現(xiàn)(implements)接口? 抽象類是否可繼承具體類【天威誠信面試題】【參考】接口可以繼承接口。抽象類可以實(shí)現(xiàn)(implem

38、ents)接口,抽象類是否可繼承具體類。抽象類中可以有靜態(tài)的 main 方法。備注:只要明白了接口和抽象類的本質(zhì)和作用,這些問題都很好回答,你想想,如果你是 java 語言的設(shè)計(jì)者,你是否會(huì)提供這樣的支持,如果不提供的話,有什么理由嗎?如果你沒有道理不提供,那就是肯定的了。只有記住抽象類與普通類的唯一區(qū)別就是不能創(chuàng)建實(shí)例對象和允許有 abstract 方法。35、char 型變量中能不能存貯一個(gè)中文漢字?為什么?【參考】char 型變量是用來以,char 型變量中當(dāng)然可以Unicode 編碼的字符的,unicode 編碼字符集中包含了漢字,所漢字啦。不過,如果某個(gè)特殊的漢字沒有被包含在 uni

39、code編碼字符集中,那么,這個(gè) char 型變量中就不能這個(gè)特殊漢字。補(bǔ)充說明:unicode編碼占用兩個(gè)字節(jié),所以,char 類型的變量也是占用兩個(gè)字節(jié)。36、寫 clone()方法時(shí),通常都有一行代碼,是什么?【參考】clone 有缺省行為,super.clone();因?yàn)槭紫纫迅割愔械某蓡T己的成員。到位,然后才是自37、說說常用集合類有哪些?有哪些方法?【參考】通常我們使用的集合類都大多是由 List、Set、Map 這三類接口派生出來的類,例如:ArrayList、Vector、LinkedList、Stack、TreeSet、Hashtable、HashMap 等集合類的大部分方

40、法都是由 Collection 接口定義的,主要包括有:add(E e)、remove(Object e)、addAll(),remove()、contains(Object obj)、clear()等38、請說出作用域 public,private,protected,以及不寫時(shí)的區(qū)別?【天威誠信面試題】【參考】這四個(gè)作用域的可見范圍如下表所示。說明:如果在修飾的元素上面沒有寫任何修飾符,則表示 friendly。作用域public protected friendlyprivate同一類同一 package 子孫類其他 package××××

41、5;×備注:只要記住了有 4 種權(quán)限,4 個(gè)范圍,然后將全選和范圍在水平和垂直方向上分別按排從小到大或從大到小的順序排列,就很容易畫出上面的圖了。39、構(gòu)造器 Constructor 是否可被 override? 【億陽通訊面試題】【參考】構(gòu)造器 Constructor 不能被繼承,因此不能重寫 Override,但可以被重載 Overload。40、是否可以從一個(gè) static 方法內(nèi)部發(fā)出對非 static 方法的調(diào)用? 【世承軟件面試題】【參考】不可以。因?yàn)榉?static 方法是要與對象關(guān)聯(lián)在一起的,必須創(chuàng)建一個(gè)對象后,才可以在該對象上進(jìn)行方法調(diào)用,而 static 方法調(diào)用

42、時(shí)不需要?jiǎng)?chuàng)建對象,可以直接調(diào)用。41、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?【霧隱美地傳媒】【參考】Math 類中提供了三個(gè)與取整有關(guān)的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應(yīng),例如,ceil 的英文意義是天花板,該方法就表示向上取整, 所以,Math.ceil(11.3)的結(jié)果為 12,Math.ceil(-11.3)的結(jié)果是-11;floor 的英文意義是地板,該方法就表示向下取整,所以,Math.floor(11.6)的結(jié)果為 11,Math.floor(-11.6) 的結(jié)果是-12;最難掌握的是

43、 round 方法,它表示“四舍五入”,算法為 Math.floor(x+0.5), 即將原來的數(shù)字加上 0.5 后再向下取整, 所以, Math.round(11.5) 的結(jié)果為 12 ,Math.round(-11.5)的結(jié)果為-11。42、abstract class(抽象類)和 interface(接口)有什么區(qū)別? 【題】應(yīng)用中心面試【參考】含有 abstract 修飾符的 class 即為抽象類,abstract 類不能創(chuàng)建的實(shí)例對象。含有abstract 方法的類必須定義為 abstract class,abstract class 類中的方法不必是抽象的。 abstract c

44、lass 類中定義抽象方法必須在具體(Concrete)子類中實(shí)現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法。如果的子類沒有實(shí)現(xiàn)抽象父類中的所有抽象方法,那么子類也必須定義為 abstract 類型。接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認(rèn)為 public abstract 類型,接口中的成員變量類型默認(rèn)為 public static final。下面比較一下兩者的語法區(qū)別:1. 抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。2. 抽象類中可以有普通成員變量,接口中沒有普通成員變量3. 抽象類中可以包含非抽象的普通方法,接口中的所有

45、方法必須都是抽象的,不能有非抽象的普通方法。4. 抽象類中的抽象方法的類型可以是 public,protected 和(默認(rèn)類型,雖然eclipse 下不報(bào)錯(cuò),但應(yīng)該也不行),但接口中的抽象方法只能是 public 類型的,并且默認(rèn)即為 public abstract 類型。5. 抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法6. 抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的類型可以任意,但接口中定義的變量只能是 public static final 類型,并且默認(rèn)即為 public static final 類型。7. 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類。下面

46、接著再說說兩者在應(yīng)用上的區(qū)別:【分析】這道題的思路是先從總體解釋抽象類和接口的基本概念,然后再比較兩者的語法細(xì)節(jié), 最后再說兩者的應(yīng)用區(qū)別。比較兩者語法細(xì)節(jié)區(qū)別的條理是:先從一個(gè)類中的構(gòu)造方法、普通成員變量和方法(包括抽象方法),靜態(tài)變量和方法,繼承性等方面來回答。43、Collection 框架中實(shí)現(xiàn)比較要實(shí)現(xiàn)什么接口?【參考】Comparable、Comparator 接口44、是否可以繼承 String 類?【參考】String 類是 final 類故不可以繼承。45、String 和 StringBuffer 的區(qū)別【參考】JAVA 平臺(tái)提供了兩個(gè)類:String 和 StringBu

47、ffer,它們可以儲(chǔ)存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。String 類表示內(nèi)容不可改變的字符串。而 StringBuffer 類表示內(nèi)容可以被修改的字符串。當(dāng)你知道字符數(shù)據(jù)要改變的時(shí)候你就可以使用 StringBuffer。典型地, 你可以使用 StringBuffers 來動(dòng)態(tài)構(gòu)造字符數(shù)據(jù)。另外,String 實(shí)現(xiàn)了 equals 方法,new String(“abc”).equals(new String(“abc”)的結(jié)果為 true,而 StringBuffer 沒有實(shí)現(xiàn) equals方法,所以,new StringBuffer(“abc”).equals(new String

48、Buffer(“abc”)的結(jié)果為 false。String 覆蓋了 equals 方法和 hashCode 方法,而 StringBuffer 沒有覆蓋 equals 方法和hashCode 方法,所以,將 StringBuffer 對象進(jìn) Java 集合類中時(shí)會(huì)出現(xiàn)問題。46、StringBuffer 與 StringBuilder 的區(qū)別【參考】StringBuffer 和 StringBuilder 類都表示內(nèi)容可以被修改的字符串,StringBuilder是線程不安全的,運(yùn)行效率高,如果一個(gè)字符串變量是在方法里面定義,這種情況只可能有一個(gè)線程它,不存在不安全的因素了,則用 Strin

49、gBuilder。如果要在類里面定義成員變量,并且這個(gè)類的實(shí)例對象會(huì)在多線程環(huán)境下使用,那么最好用 StringBuffer。47、try 里有一個(gè) return 語句,那么緊跟在這個(gè) try 后的 finally被執(zhí)行,什么時(shí)候被執(zhí)行,在 return 前還是后? 【杭州天眼科技】【參考】是在 return 之前?!痉治觥砍绦虼a的運(yùn)行結(jié)果:publicclass Test public static void main(String args) 里的 code 會(huì)/ TODO Auto-generatedSystem.out.println(newmethod stubTest().tes

50、t();static int test()int x = 1; tryreturn x;finally+x;執(zhí)行結(jié)果1運(yùn)行結(jié)果是 1,為什么呢?主函數(shù)調(diào)用子函數(shù)并得到結(jié)果的過程,好比主函數(shù)準(zhǔn)備一個(gè)空罐子,當(dāng)子函數(shù)要返回結(jié)果時(shí),先把結(jié)果放在罐子里,然后再將程序邏輯返回到主函數(shù)。所謂返回,就是子函數(shù)說,我不運(yùn)行了,你主函數(shù)繼續(xù)運(yùn)行吧,這沒什么結(jié)果可言,結(jié)果是在說這話之前放進(jìn)罐子里的。下面的程序代碼輸出的結(jié)果是多少?public classsmallTpublic staticsmallT t intb=voidmain(String args)= newsmallT();t.get();Syste

51、m.out.println(b);public intget()tryreturn 1 ;finallyreturn 2 ;返回的結(jié)果是 2。我可以通過下面一個(gè)例子程序來幫助我解釋這個(gè),從下面例子的運(yùn)行結(jié)果中可以發(fā)現(xiàn),try 中的 return 語句調(diào)用的函數(shù)先于 finally 中調(diào)用的函數(shù)執(zhí)行,也就是說 return 語句先執(zhí)行,finally 語句后執(zhí)行,所以,返回的結(jié)果是 2。Return 并不是讓函數(shù)馬上返回,而是return 語句執(zhí)行后,將把返回結(jié)果放置進(jìn)函數(shù)棧中,此時(shí)函數(shù)并不是馬上返回,它要執(zhí)行finally 語句后才真正開始返回。在講解 時(shí)可以用下面的程序來幫助分析:publi

52、c class Test /* param args add by zxx ,Dec 9, 2008*/public static void main(String args) / TODO Auto-generated method stub System.out.println(new Test().test();int test()tryreturn func1();finallyreturn func2();int func1()System.out.println("func1"); return 1;int func2()System.out.println(&

53、quot;func2"); return 2;執(zhí)行結(jié)果func1 func2 2結(jié)論:finally 中的代碼比 return 和 break 語句后執(zhí)行。48、Java 中的異常處理機(jī)制的簡單原理和應(yīng)用。【參考】異常是指 java 程序運(yùn)行時(shí)(非編譯)所發(fā)生的情況或錯(cuò)誤,與現(xiàn)實(shí)生活中的事件很相似,現(xiàn)實(shí)生活中的可以包含發(fā)生的時(shí)間、地點(diǎn)、人物、情節(jié)等信息,可以用一個(gè)對象來表示,Java 使用面向?qū)ο蟮姆绞絹硖幚懋惓?,它把程序中發(fā)生的每個(gè)異常也都分別封裝到一個(gè)對象來表示的,該對象中包含有異常的信息。Java 對異常進(jìn)行了分類,不同類型的異常分別用不同的 Java 類表示,所有異常的根類為

54、 java.lang.Throwable,Throwable 下面又派生了兩個(gè)子類:Error 和 Exception,Error 表示應(yīng)用程序本身無法克服和恢復(fù)的一種嚴(yán)重問題,程序只有死的份了,例如,說內(nèi)存溢出和線程死鎖等系統(tǒng)問題。Exception 表示程序還能夠克服和恢復(fù)的問題,其中又分為系統(tǒng)異常和普通異常,系統(tǒng)異常是軟件本身缺陷所導(dǎo)致的問題,也就是軟件開發(fā)考慮不周所導(dǎo)致的問題,軟件使用者無法克服和恢復(fù)這種問題,但在這種問題下還可以讓軟件系統(tǒng)繼續(xù)運(yùn)行或者讓軟件死掉,例如,數(shù)組越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerExcep

55、tion)、類轉(zhuǎn)換異常(ClassCastException);普通異常是運(yùn)行環(huán)境的變化或異常所導(dǎo)致的問題,是用戶能夠克服的問題,例如,網(wǎng)絡(luò)斷線,硬盤空間不夠,發(fā)生這樣的異常后,程序不應(yīng)該死掉。java 為系統(tǒng)異常和普通異常提供了不同的解決方案,編譯器強(qiáng)制普通異常必須 try.catch處理或用 throws繼續(xù)拋給上層調(diào)用方法處理,所以普通異常也稱為 checked 異常,而系統(tǒng)異??梢蕴幚硪部梢圆惶幚恚?,編譯器不強(qiáng)制用try.catch 處理或用throws所以系統(tǒng)異常也稱為 unchecked 異常。,49、多線程有幾種實(shí)現(xiàn)方法?同步有幾種實(shí)現(xiàn)方法?【參考】多線程有兩種實(shí)現(xiàn)方法,分別是繼承 Thread 類與實(shí)現(xiàn) Runnable 接口。同步的實(shí)現(xiàn)方面有兩種,分別是 synchronized,wait 與 notify 。a.b.wait():使一個(gè)線程處于等待狀態(tài),并且所持有的對象的 lock。sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException 異常。notify():喚醒一個(gè)處于等待狀態(tài)的線

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論