Java軟件開發(fā)工程師面試題寶典_第1頁
Java軟件開發(fā)工程師面試題寶典_第2頁
免費預(yù)覽已結(jié)束,剩余51頁可下載查看

下載本文檔

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

文檔簡介

1、這套面試題主要目的是幫助那些還沒有java 軟件開發(fā)實際工作經(jīng)驗, 而正在努力尋找 java 軟件開發(fā)工作的朋友在筆試時更好地贏得筆試和面試。由于這套面試題涉及的范圍很泛,很廣,很雜,大家不可能一 天兩天就看完和學(xué)完這套面試寶典,即使你已經(jīng)學(xué)過了有關(guān)的技術(shù),那么至少也需要一個月的時間才能消 化和掌握這套面試寶典,所以,大家應(yīng)該早作準備,從拿到這套面試寶典之日起,就要堅持在每天閑暇之 余學(xué)習(xí)其中幾道題目,日積月累,等到出去面試時,一切都水到渠成,面試時就自然會游刃有余了。答題時,先答是什么,再答有什么作用和要注意什么(這部分最重要,展現(xiàn)自己的心得)答案的段落分別,層次分明,條理清晰都非常重要,從

2、這些表面的東西也可以看出一個人的習(xí)慣、辦 事風(fēng)格、條理等。要講你做出答案的思路過程,或者說你記住答案的思想都寫下來。把答題想著是辯論賽。答題就是給 別人講道理、擺事實。答題不局限于什么格式和形式,就是要將自己的學(xué)識展現(xiàn)出來!別因為人家題目本來就模棱兩可,你就心里膽怯和沒底氣了,不敢回答了。你要大膽地指出對方題目 很模糊和你的觀點,不要把面試官想得有多高,其實他和你就是差不多的,你想想,如果他把你招進去了, 你們以后就是同事了,可不是差不多的嗎?關(guān)于就業(yè)薪水,如果你是應(yīng)屆生,那不能要高工資,好比大餅的故事,沒有文憑還想拿高工資,就去 中關(guān)村缺什么補什么吧!少數(shù)人基礎(chǔ)確實很好,在校期間確實又做過一

3、些項目,那仍然是可以要到相對高 的工資的。1.1. JavaJava 基礎(chǔ)部分基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的 語法,集合的語法,io 的語法,虛擬機方面的語法。1、一個.java源文件中是否可以包括多個類(不是內(nèi)部 類)?有什么限制?可以有多個類,但只能有一個 public 的類,并且 public 的類名必須與文件名相一致。2、Java 有沒有 goto?java中的保留字,現(xiàn)在沒有在java中使用。3、說說&和&的區(qū)別。&和&都可以用作邏輯與的運算符,表示邏輯與(and),當(dāng)運算符兩邊的表達式的結(jié)果都

4、為true 時,整個運算結(jié)果才為 true,否則,只要有一方為 false,則結(jié)果為 false。&還具有短路的功能,即如果第一個表達式為 false,則不再計算第二個表達式,例如,對于 if(str != null& !str.equals( “”表達式,當(dāng) str 為 null 時,后面的表達式不會執(zhí)行,所以不會出現(xiàn)NullPointerException 如果將 & 改為&,則會拋出 NullPointerException 異常。lf(x=33 & +y0) y 會增長,lf(x=33 & +y0) 不會增長&還可以用作位運算符,

5、當(dāng) &操作符兩邊的表達式不是boolean 類型時,&表示按位與操作,我們通常使用 0 x0f 來與一個整數(shù)進行&運算,來獲取該整數(shù)的最低4 個 bit 位,例如,0 x31 & 0 x0f 的結(jié)果為 0 x01。備注:這道題先說兩者的共同點,再說出 &和&的特殊之處,并列舉一些經(jīng)典的例子來表明自己理解 透徹深入、實際經(jīng)驗豐富。4、在 JAVA 中如何跳出當(dāng)前的多重嵌套循環(huán)?在 Java 中,要想跳出多重循環(huán),可以在外面的循環(huán)語句前定義一個標(biāo)號,然后在里層循環(huán)體的代碼中 使用帶有標(biāo)號的 break 語句,即可跳出外層循環(huán)。例如,ok:for(in

6、t i=0;i10;i+)for(int j=0;j10;j+)System.out.println(“=”+ i +:j=”+ j);if(j = 5) break ok;另外,我個人通常并不使用標(biāo)號這種方式,而是讓外層的循環(huán)條件表達式的結(jié)果可以受到里層循環(huán)體 代碼的控制,例如,要在二維數(shù)組中查找到某個數(shù)字。int arr = 1,2,3,4,5,6,7,9;boolean found = false;for(int i=0;iarr.length & !found;i+) for(int j=0;jarri .l ength;j+)System.out.println(“=”+ i

7、 +:j=”+ j);if(arrij = 5) found = true; break;5、 switch 語句能否作用在 byte 上,能否作用在 long 上,能 否作用在 String 上?在 switch ( expr1)中,expr1 只能是一個整數(shù)表達式或者枚舉常量(更大字體),整數(shù)表達式可以是 int基本類型或 Integer 包裝類型,由于,byte,short,char 都可以隱含轉(zhuǎn)換為 int,所以,這些類型以及這些類型 的包裝類型也是可以的。顯然,long 和 String 類型都不符合 switch 的語法規(guī)定,并且不能被隱式轉(zhuǎn)換成int類型,所以,它們不能作用于sw

8、tich 語句中。6、short si = 1; si = si + 1;有什么錯? short si = 1; si += 1;有什么錯?對于 short si = 1; si = si + 1;由于 s1+1 運算時會自動提升表達式的類型,所以結(jié)果是 int 型,再賦值 給 short 類型si 時,編譯器將報告需要強制轉(zhuǎn)換類型的錯誤。對于 short si = i; si += i;由于+=是 java 語言規(guī)定的運算符,java 編譯器會對它進行特殊處理,因此 可以正確編譯。7、char 型變量中能不能存貯一個中文漢字?為什么?char 型變量是用來存儲 Unicode 編碼的字符的,

9、unicode 編碼字符集中包含了漢字,所以, char 型變量 中當(dāng)然可以存儲漢字啦。不過,如果某個特殊的漢字沒有被包含在Unicode 編碼字符集中,那么,這個 char型變量中就不能存儲這個特殊漢字。補充說明:Unicode 編碼占用兩個字節(jié),所以,char 類型的變量也是占用兩個字節(jié)。備注:后面一部分回答雖然不是在正面回答題目,但是,為了展現(xiàn)自己的學(xué)識和表現(xiàn)自己對問題理解 的透徹深入,可以回答一些相關(guān)的知識,做到知無不言,言無不盡。&用最有效率的方法算出 2 乘以 8 等於幾?2 3,因為將一個數(shù)左移 n 位,就相當(dāng)于乘以了 2 的 n 次方,那么,一個數(shù)乘以8 只要將其左移

10、3 位即可,而位運算 cpu 直接支持的,效率最高,所以, 2 乘以 8 等於幾的最效率的方法是 2 3。9、請設(shè)計一個一百億的計算器首先要明白這道題目的考查點是什么,一是大家首先要對計算機原理的底層細節(jié)要清楚、要知道加減 法的位運算原理和知道計算機中的算術(shù)運算會發(fā)生越界的情況,二是要具備一定的面向?qū)ο蟮脑O(shè)計思想。首先,計算機中用固定數(shù)量的幾個字節(jié)來存儲的數(shù)值,所以計算機中能夠表示的數(shù)值是有一定的范圍 的,為了便于講解和理解,我們先以byte 類型的整數(shù)為例,它用 i 個字節(jié)進行存儲,表示的最大數(shù)值范圍為-i28 到+i27。-i 在內(nèi)存中對應(yīng)的二進制數(shù)據(jù)為iiiiiiii,如果兩個-i 相加

11、,不考慮 Java 運算時的類型提升,運算后會產(chǎn)生進位,二進制結(jié)果為i,iiiiiiiO,由于進位后超過了 byte 類型的存儲空間,所以進位部分被舍棄,即最終的結(jié)果為iiiiiiiO,也就是-2,這正好利用溢位的方式實現(xiàn)了負數(shù)的運算。-i28 在內(nèi)存中對應(yīng)的二進制數(shù)據(jù)為 iOOOOOOO,如果兩個-i28 相加,不考慮 Java 運算時的類型提升,運算后會產(chǎn)生進位, 二進制結(jié)果為 i,OOOOOOOO,由于進位后超過了 byte 類型的存儲空間,所以進位部分被舍棄,即最終的結(jié)果 為OOOOOOOO,也就是 O,這樣的結(jié)果顯然不是我們期望的,這說明計算機中的算術(shù)運算是會發(fā)生越界情況的,兩個數(shù)值

12、的運算結(jié)果不能超過計算機中的該類型的數(shù)值范圍。由于 Java 中涉及表達式運算時的類型自動提升,我們無法用 byte 類型來做演示這種問題和現(xiàn)象的實驗,大家可以用下面一個使用整數(shù)做實驗的例 子程序體驗一下:int a = lnteger.MAX_V ALUE;int b = Integer.MAX_V ALUE;int sum = a + b;先不考慮 long 類型,由于 int 的正數(shù)范圍為 2 的 31 次方,表示的最大數(shù)值約等于2*1000*1000*1000 ,也就是 20 億的大小,所以,要實現(xiàn)一個一百億的計算器,我們得自己設(shè)計一個類可以用于表示很大的整數(shù),并且提供了與另外一個整數(shù)

13、進行加減乘除的功能,大概功能如下:()這個類內(nèi)部有兩個成員變量,一個表示符號,另一個用字節(jié)數(shù)組表示數(shù)值的二進制數(shù)()有一個構(gòu)造方法,把一個包含有多位數(shù)值的字符串轉(zhuǎn)換到內(nèi)部的符號和字節(jié)數(shù)組中()提供加減乘除的功能public class Biglntegerint sign;byte val;public Biginteger(String val) sign =;val =;public BigInteger add(Biglnteger other) public BigInteger subtract(Biglnteger other) public BigInteger multiply

14、(BigInteger other)public BigInteger divide(Biglnteger other)備注:要想寫出這個類的完整代碼,是非常復(fù)雜的,如果有興趣的話,可以參看jdk 中自帶的java.math.Biglnteger 類的源碼。面試的人也知道誰都不可能在短時間內(nèi)寫出這個類的完整代碼的,他要的 是你是否有這方面的概念和意識,他最重要的還是考查你的能力,所以,你不要因為自己無法寫出完整的 最終結(jié)果就放棄答這道題,你要做的就是你比別人寫得多,證明你比別人強,你有這方面的思想意識就可 以了,畢竟別人可能連題目的意思都看不懂,什么都沒寫,你要敢于答這道題,即使只答了一部分,

15、那也 與那些什么都不懂的人區(qū)別出來,拉開了距離,算是矮子中的高個,機會當(dāng)然就屬于你了。另外,答案中 的框架代碼也很重要,體現(xiàn)了一些面向?qū)ο笤O(shè)計的功底,特別是其中的方法命名很專業(yè),用的英文單詞很 精準,這也是能力、經(jīng)驗、專業(yè)性、英語水平等多個方面的體現(xiàn),會給人留下很好的印象,在編程能力和 其他方面條件差不多的情況下,英語好除了可以使你獲得更多機會外,薪水可以高出一千元。10、使用 final 關(guān)鍵字修飾一個變量時,是引用不能變,還 是引用的對象不能變?使用 final 關(guān)鍵字修飾一個變量時, 是指引用變量不能變, 引用變量所指向的對象中的內(nèi)容還是可以改 變的。 例如,對于如下語句:final S

16、tringBuffer a=new StringBuffer(immutable);執(zhí)行如下語句將報告編譯期錯誤:a=new StringBuffer();但是,執(zhí)行如下語句則可以通過編譯:a.append(” broke n!);有人在定義方法的參數(shù)時,可能想采用如下形式來阻止方法內(nèi)部修改傳進來的參數(shù)對象:public void method(final StringBuffer param)實際上,這是辦不到的,在該方法內(nèi)部仍然可以增加如下代碼來修改參數(shù)對象:param.appe nd(a);11、=和 equals 方法究竟有什么區(qū)別?(單獨把一個東西說清楚,然后再說清楚另一個,這樣,它

17、們的區(qū)別自然就出來了,混在一起說,則 很難說清楚)=操作符專門用來比較兩個變量的值是否相等,也就是用于比較變量所對應(yīng)的內(nèi)存中所存儲的數(shù)值是 否相同,要比較兩個基本類型的數(shù)據(jù)或兩個引用變量是否相等,只能用=操作符。如果一個變量指向的數(shù)據(jù)是對象類型的,那么,這時候涉及了兩塊內(nèi)存,對象本身占用一塊內(nèi)存(堆內(nèi)存),變量也占用一塊內(nèi)存,例如Objet obj = new Object();變量 obj 是一個內(nèi)存,new Object()是另一個內(nèi)存,此時,變量 obj 所對應(yīng)的內(nèi)存中存儲的數(shù)值就是對象占用的那塊內(nèi)存的首地址。對于指向?qū)ο箢愋偷?變量,如果要比較兩個變量是否指向同一個對象,即要看這兩個變

18、量所對應(yīng)的內(nèi)存中的數(shù)值是否相等,這 時候就需要用=操作符進行比較。equals 方法是用于比較兩個獨立對象的內(nèi)容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨立的。例如,對于下面的代碼:String a=new Strin g(foo);String b=new String(foo);兩條 new 語句創(chuàng)建了兩個對象,然后用a,b 這兩個變量分別指向了其中一個對象,這是兩個不同的對象,它們的首地址是不同的,即a 和 b 中存儲的數(shù)值是不相同的,所以,表達式a=b 將返回 false,而這兩個對象中的內(nèi)容是相同的,所以,表達式a.equals(b)將返回 true。在實際開發(fā)

19、中,我們經(jīng)常要比較傳遞進行來的字符串內(nèi)容是否等,例如,String input =;input.equals( quit”,許多人稍不注意就使用 =進行比較了,這是錯誤的,隨便從網(wǎng)上找?guī)讉€項目實戰(zhàn) 的教學(xué)視頻看看,里面就有大量這樣的錯誤。記住,字符串的比較基本上都是使用equals 方法。如果一個類沒有自己定義equals 方法,那么它將繼承 Object 類的 equals 方法,Object 類的 equals 方法的實現(xiàn)代碼如下:boolean equals(Object o)return this=o;這說明,如果一個類沒有自己定義equals 方法,它默認的 equals 方法(從

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

21、而是屬于類,所以也稱為類變量,只 要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實例對象,靜態(tài)變量就會被分配空間,靜態(tài)變量就可以被使用了。 總之,實例變量必須創(chuàng)建對象后才可以通過這個對象來使用,靜態(tài)變量則可以直接使用類名來引用。例如,對于下面的程序,無論創(chuàng)建多少個實例對象,永遠都只分配了一個staticVar 變量,并且每創(chuàng)建一個實例對象,這個 staticVar 就會加 1;但是,每創(chuàng)建一個實例對象,就會分配一個 instanceVar,即可能 分配多個instanceVar,并且每個 instanceVar 的值都只自加了 1 次。public class VariantTestpublic sta

22、tic int staticVar = 0;public int instanceVar = 0;public VariantTest()staticVa 葉+;instanceVar+;System.out.println( taticVar= ” + staticVar + ,instanceVar= + instanceVar);備注:這個解答除了說清楚兩者的區(qū)別外,最后還用一個具體的應(yīng)用例子來說明兩者的差異,體現(xiàn)了 自己有很好的解說問題和設(shè)計案例的能力,思維敏捷,超過一般程序員,有寫作能力!13、是否可以從一個static 方法內(nèi)部發(fā)出對非static 方法的調(diào)用?不可以。因為非 st

23、atic 方法是要與對象關(guān)聯(lián)在一起的,必須創(chuàng)建一個對象后, 法調(diào)用,而 static 方法調(diào)用時不需要創(chuàng)建對象,可以直接調(diào)用。也就是說,當(dāng)一個能還沒有創(chuàng)建任何實例對象,如果從一個static 方法中發(fā)出對非 static 方法的調(diào)用,那個非 static 方法是關(guān)聯(lián)到哪個對象上的呢?這個邏輯無法成立,所以,一個static 方法內(nèi)部發(fā)出對非static 方法的調(diào)用。14、Integer 與 int 的區(qū)別int 是 java 提供的 8 種原始數(shù)據(jù)類型之一。Java 為每個原始類型提供了封裝類,Integer 是 java 為 int 提 供的封裝才可以在該對象上進行方static 方法被調(diào)用

24、時,可類。int 的默認值為 0,而 Integer 的默認值為 null,即 Integer 可以區(qū)分出未賦值和值為0 的區(qū)別,int 則無法表達出未賦值的情況, 例如,要想表達出沒有參加考試和考試成績?yōu)? 的區(qū)別,則只能使用 Integer。在 JSP 開發(fā)中,Integer 的默認為 null,所以用 el 表達式在文本框中顯示時,值為空白字符串,而int 默認的默認值為 0,所以用 el 表達式在文本框中顯示時,結(jié)果為0,所以,int 不適合作為 web 層的表單數(shù)據(jù)的類型。在 Hibernate 中,如果將 OID 定義為 Integer 類型,那么 Hibernate 就可以根據(jù)其

25、值是否為 null 而判斷一 個對象是否是臨時的, 如果將 OID 定義為了 int 類型,還需要在 hbm 映射文件中設(shè)置其 unsaved-value 屬性 為 0。另外Integer 提供了多個與整數(shù)相關(guān)的操作方法,例如,將一個字符串轉(zhuǎn)換成整數(shù),Integer 中還定義了表示整數(shù)的最大值和最小值的常量。15、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?Math 類中提供了三個與取整有關(guān)的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應(yīng),例如,ceil 的英文意義是天花板,該方法就表示向上取整,Math.ceil(

26、11.3)的結(jié)果為 12,Math.ceil(-11.3)的結(jié)果是-11; floor 的英文意義是地板,該方法就表示向下取整,Math.ceil(11.6)的結(jié)果為11,Math.ceil(-11.6)的結(jié)果是-12;最難掌握的是 round 方法,它表示“四舍五入”,算法為 Math.floor(x+0.5), 即將原來的數(shù)字加上 0.5 后再向下取整,所以,Math.round(11.5)的結(jié)果為12,Math.round(-11.5)的結(jié)果為-1116、 下面的代碼有什么不妥之處?1.if(username.equals( zxx)2.int x = 1;return x=1?true

27、:false;仃、請說出作用域 public, private, protected,以及不寫時的區(qū)別這四個作用域的可見范圍如下表所示。說明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表示 friendly 作用域當(dāng)前類同一 package 子孫類 其他 packagepublicVVVVprotectedVVVXfriendlyVVXXprivateVXXX備注:只要記住了有 4 種訪問權(quán)限,4 個訪問范圍,然后將全選和范圍在水平和垂直方向上分別按排 從小到大或從大到小的順序排列,就很容易畫岀上面的圖了。18、Overload 和 Override 的區(qū)別。Overloaded 的方法是否

28、可以改變返回值的類型?Overload 是重載的意思,Override 是覆蓋的意思,也就是重寫。重載 Overload 表示同一個類中可以有多個名稱相同的方法,但這些方法的參數(shù)列表各不相同(即參數(shù) 個數(shù)或類型不同)。重寫 Override 表示子類中的方法可以與父類中的某個方法的名稱和參數(shù)完全相同,通過子類創(chuàng)建的實 例對象調(diào)用這個方法時,將調(diào)用子類中的定義方法,這相當(dāng)于把父類中定義的那個完全相同的方法給覆蓋 了,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)。子類覆蓋父類的方法時,只能比父類拋岀更少的異常,或 者是拋岀父類拋岀的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類

29、 方法的訪問權(quán)限只能比父類的更大,不能更小。如果父類的方法是private 類型,那么,子類則不存在覆蓋的限制,相當(dāng)于子類中增加了一個全新的方法。至于 Overloaded 的方法是否可以改變返回值的類型這個問題,要看你倒底想問什么呢?這個題目很模 糊。如果幾個 Overloaded 的方法的參數(shù)列表不一樣,它們的返回者類型當(dāng)然也可以不一樣。但我估計你想 問的問題是:如果兩個方法的參數(shù)列表完全一樣,是否可以讓它們的返回值不同來實現(xiàn)重載Overload。這是不行的,我們可以用反證法來說明這個問題,因為我們有時候調(diào)用一個方法時也可以不定義返回結(jié)果變 量,即不要關(guān)心其返回結(jié)果,例如,我們調(diào)用map.

30、remove(key)方法時,雖然 remove 方法有返回值,但是我們通常都不會定義接收返回結(jié)果的變量,這時候假設(shè)該類中有兩個名稱和參數(shù)列表完全相同的方法,僅 僅是返回類型不同,java 就無法確定編程者倒底是想調(diào)用哪個方法了,因為它無法通過返回結(jié)果類型來判 斷。override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法并且對其重寫,以求達 到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現(xiàn),在接口中一般只是對方法進行了聲明,而我們在實現(xiàn)時,就需要實現(xiàn)接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:1、覆蓋的方法

31、的標(biāo)志必須要和被覆蓋的方法的標(biāo)志完全匹配,才能達到覆蓋的效果;2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;4、 被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行 覆蓋。overload對我們來說可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱相同 的方法,通過定義不同的輸入?yún)?shù)來區(qū)分這些方法,然后再調(diào)用時,VM就會根據(jù)不同的參數(shù)樣式,來選擇合適的方法執(zhí)行。在使用重載要注意以下的幾點:1、在使用重載時只能通過不同的參數(shù)樣式。例如,不同的參數(shù)類型,不同的參數(shù)個數(shù),不同的參

32、數(shù)順序(當(dāng)然,同一方法內(nèi)的幾個參數(shù)類型必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int);2、不能通過訪問權(quán)限、返回類型、拋出的異常進行重載;3、方法的異常類型和數(shù)目不會對重載造成影響;4、 對于繼承來說,如果某一方法在父類中是訪問權(quán)限是priavte,那么就不能 在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重 載的效果。佃、構(gòu)造器 Constructor 是否可被 override?構(gòu)造器 Constructor 不能被繼承,因此不能重寫 Override,但可以被重載 Overload。20、 接口是否可繼承接口?抽象類是否可實現(xiàn)

33、(implements)接口?抽象類是否可繼承具體類( (concrete class)?抽象類中是否可以有靜態(tài)的main 方法?接口可以繼承接口。抽象類可以實現(xiàn)(implements)接口,抽象類是否可繼承具體類。抽象類中可以有靜 態(tài)的main 方法。備注:只要明白了接口和抽象類的本質(zhì)和作用,這些問題都很好回答,你想想,如果你是java 語言的設(shè)計者,你是否會提供這樣的支持,如果不提供的話,有什么理由嗎?如果你沒有道理不提供,那答案就 是肯定的了。只有記住抽象類與普通類的唯一區(qū)別就是不能創(chuàng)建實例對象和允許有abstract 方法。21、寫 clone()方法時,通常都有一行代碼,是什么?cl

34、one 有缺省行為,super.clone();因為首先要把父類中的成員復(fù)制到位,然后才是復(fù)制自己的成員。22、面向?qū)ο蟮奶卣饔心男┓矫嬗嬎銠C軟件系統(tǒng)是現(xiàn)實生活中的業(yè)務(wù)在計算機中的映射,而現(xiàn)實生活中的業(yè)務(wù)其實就是一個個對象協(xié) 作的過程。面向?qū)ο缶幊叹褪前船F(xiàn)實業(yè)務(wù)一樣的方式將程序代碼按一個個對象進行組織和編寫,讓計算機 系統(tǒng)能夠識別和理解用對象方式組織和編寫的程序代碼,這樣就可以把現(xiàn)實生活中的業(yè)務(wù)對象映射到計算 機系統(tǒng)中。面向?qū)ο蟮木幊陶Z言有封裝、繼承、抽象、多態(tài)等 4 個主要的特征。1 封裝:封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實現(xiàn)軟件部件的“高內(nèi)聚、低 耦合”防止程序相

35、互依賴性而帶來的變動影響。在面向?qū)ο蟮木幊陶Z言中,對象是封裝的最基本單 位,面向?qū)ο蟮姆庋b比傳統(tǒng)語言的封裝更為清晰、更為有力。面向?qū)ο蟮姆庋b就是把描述一個對象的屬性和行為的代碼封裝在一個“模塊”中,也就是一個類中,屬性用變量定義,行為用方法進行定義,方法 可以直接訪問同一個對象中的屬性。通常情況下,只要記住讓變量和訪問這個變量的方法放在一起,將一個類中的成員變量全部定義成私有的,只有這個類自己的方法才可以訪問到這些成員變量,這就基本上實 現(xiàn)對象的封裝,就很容易找出要分配到這個類上的方法了,就基本上算是會面向?qū)ο蟮木幊塘恕0盐找粋€ 原則:把對同一事物進行操作的方法和相關(guān)的方法放在同一個類中,把方

36、法和它操作的數(shù)據(jù)放在同一個類 中。例如,人要在黑板上畫圓,這一共涉及三個對象:人、黑板、圓,畫圓的方法要分配給哪個對象呢? 由于畫圓需要使用到圓心和半徑,圓心和半徑顯然是圓的屬性,如果將它們在類中定義成了私有的成員變 量,那么,畫圓的方法必須分配給圓,它才能訪問到圓心和半徑這兩個屬性,人以后只是調(diào)用圓的畫圓方 法、表示給圓發(fā)給消息而已,畫圓這個方法不應(yīng)該分配在人這個對象上,這就是面向?qū)ο蟮姆庋b性,即將 對象封裝成一個高度自治和相對封閉的個體,對象狀態(tài)(屬性)由這個對象自己的行為(方法)來讀取和 改變。一個更便于理解的例子就是,司機將火車剎住了,剎車的動作是分配給司機,還是分配給火車,顯 然,應(yīng)

37、該分配給火車,因為司機自身是不可能有那么大的力氣將一個火車給停下來的,只有火車自己才能 完成這一動作,火車需要調(diào)用內(nèi)部的離合器和剎車片等多個器件協(xié)作才能完成剎車這個動作,司機剎車的 過程只是給火車發(fā)了一個消息,通知火車要執(zhí)行剎車動作而已。抽象:抽象就是找岀一些事物的相似和共性之處,然后將這些事物歸為一個類,這個類只考慮這些事物 的相似和共性之處,并且會忽略與當(dāng)前主題和目標(biāo)無關(guān)的那些方面,將注意力集中在與當(dāng)前目標(biāo)有關(guān)的方面。例如,看到一只螞蟻和大象,你能夠想象岀它們的相同之處,那就是抽象。抽象包括行為抽 象和狀態(tài)抽象兩個方面。例如,定義一個Person 類,如下:class Pers onStr

38、i ng n ame;int age;人本來是很復(fù)雜的事物,有很多方面,但因為當(dāng)前系統(tǒng)只需要了解人的姓名和年齡,所以上面定 義的類中只包含姓名和年齡這兩個屬性,這就是一種抽像,使用抽象可以避免考慮一些與目標(biāo)無關(guān)的 細節(jié)。我對抽象的理解就是不要用顯微鏡去看一個事物的所有方面,這樣涉及的內(nèi)容就太多了,而是 要善于劃分問題的邊界,當(dāng)前系統(tǒng)需要什么,就只考慮什么。繼承:在定義和實現(xiàn)一個類的時候,可以在一個已經(jīng)存在的類的基礎(chǔ)之上來進行,把這個已經(jīng)存在的類 所定義的內(nèi)容作為自己的內(nèi)容,并可以加入若干新的內(nèi)容,或修改原來的方法使之更適合特殊的需要, 這就是繼承。繼承是子類自動共享父類數(shù)據(jù)和方法的機制,這是類

39、之間的一種關(guān)系,提高了軟件的可 重用性和可擴展性。多態(tài):多態(tài)是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)岀的方法調(diào)用在編程時 并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量 發(fā)岀的方法調(diào)用到底是哪個類中實現(xiàn)的方法,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現(xiàn)上,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態(tài),這就是多態(tài)性。多態(tài)性增強了軟件的靈活性和擴展性。 例如,下面代碼中的 UserD

40、ao 是一個接口,它定義引用變量 userDao 指向的實例對象由daofactory.getDao()在執(zhí)行的時候返回,有時候指向的是UserJdbcDao這個實現(xiàn),有時候指向的是UserHibernateDao這個實現(xiàn),這樣,不用修改源代碼,就可以改變userDao指向的具體類實現(xiàn),從而導(dǎo)致userDao.i nsertUser()方法調(diào)用的具體代碼也隨之改變,即有時候調(diào)用的是UserJdbcDao的insertUser方法,有時候調(diào)用的是UserHibernateDao的insertUser方法:UserDao userDao = daofactory.getDao();userDao.

41、i nsertUser(user);比喻:人吃飯,你看到的是左手,還是右手?23、java 中實現(xiàn)多態(tài)的機制是什么?靠的是父類或接口定義的引用變量可以指向子類或具體實現(xiàn)類的實例對象,而程序調(diào)用的方法在運行期才動態(tài)綁定,就是引用變量所指向的具體實例對象的方法,也就是內(nèi)存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。24、abstract class 和 interface 有什么區(qū)別?含有 abstract 修飾符的 class 即為抽象類,abstract 類不能創(chuàng)建的實例對象。含有abstract 方法的類必須定義為 abstract class, abstract clas

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

43、象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方 法。4. 抽象類中的抽象方法的訪問類型可以是public, protected 和(默認類型,雖然eclipse 下不報錯,但應(yīng)該也不行),但接口中的抽象方法只能是public 類型的,并且默認即為publicabstract 類型。5. 抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法6. 抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是 public static final 類型,并且默認即為 public static final 類型。7.一個

44、類可以實現(xiàn)多個接口,但只能繼承一個抽象類。下面接著再說說兩者在應(yīng)用上的區(qū)別:接口更多的是在系統(tǒng)架構(gòu)設(shè)計方法發(fā)揮作用,主要用于定義模塊之間的通信契約。而抽象類在代碼實現(xiàn)方面發(fā)揮作用,可以實現(xiàn)代碼的重用,例如,模板方法設(shè)計模式是抽象類的一個典型應(yīng)用,假設(shè)某個項目的所有 Servlet 類都要用相同的方式進行權(quán)限判斷、記錄訪問日志和處理異常,那么就可以定義一個抽象的基類,讓所有的Servlet 都繼承這個抽象基類,在抽象基類的service 方法中完成權(quán)限判斷、記錄訪問日志和處理異常的代碼,在各個子類中只是完成各自的業(yè)務(wù)邏輯代碼,偽代碼如下:public abstract class BaseSer

45、vlet extends HttpServletpublic final void service(HttpServletRequest request, HttpServletResponse response) throwsIOExcetion,ServletException 記錄訪問日志進行權(quán)限判斷if(具有權(quán)限)trydoService(request,response);catch(Excetpion e) 記錄異常信息protected abstract void doService(HttpServletRequest request, HttpServletResponse

46、response) throwsIOExcetion,ServletException;注意訪問權(quán)限定義成 protected,顯得既專業(yè),又嚴謹,因為它是專門給子類用的public class MyServlet1 extends BaseServletprotected void doService(HttpServletRequest request, HttpServletResponse response) throwsIOExcetion,ServletException本 Servlet 只處理的具體業(yè)務(wù)邏輯代碼父類方法中間的某段代碼不確定,留給子類干,就用模板方法設(shè)計模式。備注

47、:這道題的思路是先從總體解釋抽象類和接口的基本概念,然后再比較兩者的語法細節(jié),最后再 說兩者的應(yīng)用區(qū)別。比較兩者語法細節(jié)區(qū)別的條理是:先從一個類中的構(gòu)造方法、普通成員變量和方法(包 括抽象方法),靜態(tài)變量和方法,繼承性等 6 個方面逐一去比較回答,接著從第三者繼承的角度的回答,特 別是最后用了一個典型的例子來展現(xiàn)自己深厚的技術(shù)功底。25、abstract 的 method 是否可同時是static,是否可同時是native,是否可同時是 synchronized?abstract 的 method 不可以是 static 的,因為抽象的方法是要被子類實現(xiàn)的,而 static 與子類扯不上關(guān)系!

48、native 方法表示該方法要用另外一種依賴平臺的編程語言實現(xiàn)的,不存在著被子類實現(xiàn)的問題,所以, 它也不能是抽象的,不能與 abstract 混用。例如,F(xiàn)ileOutputSteam 類要硬件打交道,底層的實現(xiàn)用的是操 作系統(tǒng)相關(guān)的 api實現(xiàn),例如,在 windows 用 c 語言實現(xiàn)的,所以,查看jdk 的源代碼,可以發(fā)現(xiàn)FileOutputStream 的 open 方法的定義如下:private native void open(String name) throws FileNotFoundException;如果我們要用 java 調(diào)用別人寫的 c 語言函數(shù),我們是無法直接調(diào)用

49、的,我們需要按照java 的要求寫一個 c 語言的函數(shù),又我們的這個 c 語言函數(shù)去調(diào)用別人的 c 語言函數(shù)。由于我們的 c 語言函數(shù)是按 java 的 要求來寫的,我們這個 c 語言函數(shù)就可以與 java 對接上,java 那邊的對接方式就是定義出與我們這個c 函數(shù)相對應(yīng)的方法,java 中對應(yīng)的方法不需要寫具體的代碼,但需要在前面聲明native。關(guān)于 synchronized 與 abstract 合用的問題,我覺得也不行,因為在我?guī)啄甑膶W(xué)習(xí)和開發(fā)中,從來沒見到 過這種情況,并且我覺得synchronized 應(yīng)該是作用在一個具體的方法上才有意義。而且,方法上的synchronized

50、同步所使用的同步鎖對象是 this,而抽象方法上無法確定this 是什么。26、什么是內(nèi)部類? Static Nested Class 和 Inner Class 的不同。內(nèi)部類就是在一個類的內(nèi)部定義的類,內(nèi)部類中不能定義靜態(tài)成員(靜態(tài)成員不是對象的特性,只是 為了找一個容身之處,所以需要放到一個類中而已,這么一點小事,你還要把它放到類內(nèi)部的一個類中, 過分了啊!提供內(nèi)部類,不是為讓你干這種事情,無聊,不讓你干。我想可能是既然靜態(tài)成員類似c 語言的全局變量,而內(nèi)部類通常是用于創(chuàng)建內(nèi)部對象用的,所以,把“全局變量”放在內(nèi)部類中就是毫無意義 的事情,既然是毫無意義的事情,就應(yīng)該被禁止),內(nèi)部類可以

51、直接訪問外部類中的成員變量,內(nèi)部類可以定義在外部類的方法外面,也可以定義在外部類的方法體中,如下所示:public class Outerint out_x = 0;public void method()Inner1 inner1 = new Inner1();public class Inner2/在方法體內(nèi)部定義的內(nèi)部類public method()out_x = 3;Inner2 inner2 = new Inner2();public class Inner1在方法體外面定義的內(nèi)部類在方法體外面定義的內(nèi)部類的訪問類型可以是public,protecte,默認的,private 等 4

52、 種類型,這就好像類中定義的成員變量有 4 種訪問類型一樣,它們決定這個內(nèi)部類的定義對其他類是否可見;對于這種情況, 我們也可以在外面創(chuàng)建內(nèi)部類的實例對象,創(chuàng)建內(nèi)部類的實例對象時,一定要先創(chuàng)建外部類的實例對象, 然后用這個外部類的實例對象去創(chuàng)建內(nèi)部類的實例對象,代碼如下:Outer outer = new Outer();Outer.Inner1 inner1 = outer.new Innner1();在方法內(nèi)部定義的內(nèi)部類前面不能有訪問類型修飾符,就好像方法中定義的局部變量一樣,但這種內(nèi) 部類的前面可以使用 final 或 abstract 修飾符。這種內(nèi)部類對其他類是不可見的其他類無法引

53、用這種內(nèi)部類, 但是這種內(nèi)部類創(chuàng)建的實例對象可以傳遞給其他類訪問。這種內(nèi)部類必須是先定義,后使用,即內(nèi)部類的 定義代碼必須出現(xiàn)在使用該類之前,這與方法中的局部變量必須先定義后使用的道理也是一樣的。這種內(nèi) 部類可以訪問方法體中的局部變量,但是,該局部變量前必須加finaI 修飾符。對于這些細節(jié),只要在eclipse 寫代碼試試,根據(jù)開發(fā)工具提示的各類錯誤信息就可以馬上了解到。在方法體內(nèi)部還可以采用如下語法來創(chuàng)建一種匿名內(nèi)部類,即定義某一接口或類的子類的同時,還創(chuàng) 建了該子類的實例對象,無需為該子類定義名稱:public class Outerpublic void start()new Thre

54、ad(new Runable()public void run();).start();最后,在方法外部定義的內(nèi)部類前面可以加上static 關(guān)鍵字,從而成為 Static Nested Class,它不再具有內(nèi)部類的特性,所有,從狹義上講,它不是內(nèi)部類。Static Nested Class 與普通類在運行時的行為和功能上沒有什么區(qū)別,只是在編程引用時的語法上有一些差別,它可以定義成public、protected、默認的、private等多種類型,而普通類只能定義成 public 和默認的這兩種類型。在外面引用Static Nested Class 類的名稱為“外部類名內(nèi)部類名”。在外面不

55、需要創(chuàng)建外部類的實例對象,就可以直接創(chuàng)建Static Nested Class,例如,假設(shè) Inner 是定義在 Outer 類中的 Static Nested Class,那么可以使用如下語句創(chuàng)建Inner 類:Outer.Inner inner = new Outer.Inner();由于 static Nested Class 不依賴于外部類的實例對象,所以,static Nested Class 能訪問外部類的非 static成員變量。當(dāng)在外部類中訪問Static Nested Class 時,可以直接使用 Static Nested Class 的名字,而不需要加上外部類的名字了,在

56、Static Nested Class 中也可以直接引用外部類的static 的成員變量,不需要加上外部類的名字。在靜態(tài)方法中定義的內(nèi)部類也是 Static Nested Class,這時候不能在類前面加 static 關(guān)鍵字,靜態(tài)方法中 的 StaticNested Class 與普通方法中的內(nèi)部類的應(yīng)用方式很相似,它除了可以直接訪問外部類中的static 的成員變量,還可以訪問靜態(tài)方法中的局部變量,但是,該局部變量前必須加final 修飾符。備注:首先根據(jù)你的印象說出你對內(nèi)部類的總體方面的特點:例如,在兩個地方可以定義,可以訪問 外部類的成員變量,不能定義靜態(tài)成員,這是大的特點。然后再說一

57、些細節(jié)方面的知識,例如,幾種定義 方式的語法區(qū)別,靜態(tài)內(nèi)部類,以及匿名內(nèi)部類。27、內(nèi)部類可以引用它的包含類的成員嗎?有沒有什么限制?完全可以。如果不是靜態(tài)內(nèi)部類,那沒有什么限制!如果你把靜態(tài)嵌套類當(dāng)作內(nèi)部類的一種特例,那在這種情況下不可以訪問外部類的普通成員變量,而 只能訪問外部類中的靜態(tài)成員,例如,下面的代碼:class Outerstatic int x;static class Innervoid test()syso(x);答題時,也要能察言觀色,揣摩提問者的心思,顯然人家希望你說的是靜態(tài)內(nèi)部類不能 訪問外部類的成員,但你一上來就頂牛,這不好,要先順著人家,讓人家滿意,然后再說特 殊

58、情況,讓人家吃驚。28、Anonymous Inner Class (匿名 內(nèi)部類) )是否可以 extends(繼承) )其它類,是否可以 implements(實 現(xiàn))interface(接口 )?可以繼承其他類或?qū)崿F(xiàn)其他接口。不僅是可以,而是必須!29、super .getClass() 方法調(diào)用下面程序的輸出結(jié)果是多少?import java.util.Date;public class Testexte ndsDatepublic static void main( Stri ng args) new Test().test();public void test()System. o

59、ut .println(super .getClass().getName();很奇怪,結(jié)果是 Test這屬于腦筋急轉(zhuǎn)彎的題目,在一個 qq 群有個網(wǎng)友正好問過這個問題,我覺得挺有趣,就研究了 一下,沒想到今天還被你面到了,哈哈。在 test 方法中,直接調(diào)用 getClass().getName()方法,返回的是 Test 類名由于 getClass() 在 Object 類中定義成了 final ,子類不能覆蓋該方法,所以,在test 方法中調(diào)用 getClass().getName()方法,其實就是在調(diào)用從父類繼承的getClass()方法,等效于調(diào)用 super.getClass().

60、getName()方法,所以super.getClass().getName()方法返回的也應(yīng)該是Test如果想得到父類的名稱,應(yīng)該用如下代碼:getClass().getSuperClass().getName();30、 String 是最基本的數(shù)據(jù)類型嗎?基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高 效率節(jié)省空間,我們應(yīng)該用StringBuffer類31、String s = Hello;s = s + world!;這兩行代碼執(zhí)行后,原始的 String 對象中的內(nèi)容到底變了沒有?沒有。因為String被設(shè)計成不可變(immutable)類,所以它的所有對象都

溫馨提示

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

最新文檔

評論

0/150

提交評論