面試題答案詳解_第1頁
面試題答案詳解_第2頁
面試題答案詳解_第3頁
面試題答案詳解_第4頁
面試題答案詳解_第5頁
已閱讀5頁,還剩406頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、筆試題之 Java 基礎部分基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法, 線程的語法,集合的語法,io 的語法,虛擬機方面的語法,其他。有些題來自網(wǎng)上搜集整理,有些題來自傳智播客學員面試后的反饋,說真的,少數(shù)一些網(wǎng)上的面試題,懷疑其是否還有存在價值!1、一個".java"源文件中是否可以包括多個類(不是內(nèi)部類)?有什么限制?可以有多個類,但只能有一個 public 的類,并且 public 的類名必須與文件名相一致。2、Java 有沒有 goto?java 中的保留字,現(xiàn)在沒有在 java 中使用。3、說說&和&&

2、;的區(qū)別。&和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表true 時,的結(jié)果整個運算結(jié)果才為 true,否則,只要有一方為 false,則結(jié)果為 false。&&還具有短路的功能,即如果第一個表if(str != null為 false,則不再計算第二個表,例如,對于&& !str.equals(“”)表NullPointerException,當 str 為 null 時,后面的表執(zhí)行,所以出現(xiàn)如果將&&改為&,則會拋出 NullPointerException 異常。If(x=33 &

3、amp; +y>0) y 會增長,If(x=33 && +y>0)增長&還可以用作位運算符,當&操作符兩邊的表們通常不是 boolean 類型時,&表示按位與操作,我使用 0x0f 來與一個整數(shù)進行&運算,來獲取該整數(shù)的最低 4 個 bit 位,例如,0x31 & 0x0f 的結(jié)果為 0x01。備注:這道題先說兩者的共同點,再說出&&和&的特殊之處,并列舉一些經(jīng)典的例子來表明自己理解透徹深入、實際經(jīng)驗豐富。4、在 JAVA 中如何跳出當前的多重嵌套循環(huán)?在 Java 中,要想跳出多重循環(huán),可以在外面的循

4、環(huán)語句前定義一個標號,然后在里層循環(huán)體的代碼中使用帶有標號的 break 語句,即可跳出外層循環(huán)。例如,ok:for(int i=0;i<10;i+)for(int j=0;j<10;j+)System.out.println(“i=”+ i + “,j=” + j);if(j = 5) break ok;另外,我個人通常并不使用標號這種方式,而是讓外層的循環(huán)條件表循環(huán)體的結(jié)果可以受到里層代碼的,例如,要在二維數(shù)組中查找到某個數(shù)字。int arr = 1,2,3,4,5,6,7,9;boolean found = false;for(int i=0;i<arr.length

5、&& !found;i+)for(int j=0;j<arri.length;j+)System.out.println(“i=”+i+“,j=”+j);if(arrij =5)found = true;break;5、switch 語句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?在 switch(expr1)中,expr1 只能是一個整數(shù)表式可以是 int或者枚舉常量(更大字體),整數(shù)表達基本類型或 Integer 包裝類型,由于,byte,short,char 都可以隱含轉(zhuǎn)換為 int,所以,這些類型以及這些類型的包裝類型也是可以

6、的。顯然,long 和 String 類型都不符合 switch 的語被隱式轉(zhuǎn)換成 int定,并且不能類型,所以,它們不能作用于 swtich 語句中。6、short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?對于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 運算時會自動提升表int 型,再賦值的類型,所以結(jié)果是給 short 類型 s1 時,編譯器將報告需要強制轉(zhuǎn)換類型的錯誤。對于 short s1 = 1; s1 += 1;由于 += 是 java 語言規(guī)定的運算符,java 編譯器會對它進行特殊處理

7、,因此可以正確編譯。7、char 型變量中能不能存貯一個中文漢字?為什么?char 型變量是用來char 型變量Unicode 編碼的字符的,unicode 編碼字符集中包含了漢字,所以,中當然可以漢字啦。不過,如果某個特殊的漢字沒有被包含在 unicode 編碼字符集中,那么,這個 char型變量中就不能的變量也是占這個特殊漢字。補充說明:unicode 編碼占用兩個字節(jié),所以,char 類型用兩個字節(jié)。備注:后面一部分回答雖然不是在正面回答題目,但是,為了展現(xiàn)的學識和表現(xiàn)題理解對問的透徹深入,可以回答一些相關的知識,做到知無不言,言無不盡。8、用最有效率的方法算出 2 乘以 8 等於幾?2

8、 << 3,因為將一個數(shù)左移 n 位,就相當于乘以了 2 的n 次方,那么,一個數(shù)乘以 8 只要將其左移 3 位即可,而位運算 cpu 直接支持的,效率最高,所以,2 乘以 8 等於幾的最效率的方法是 2 << 3。9、請設計一個一百億的計算器首先要明白這道題目的考查點是什么,一是大家首先要對計算機原理的底層細節(jié)要清楚、要知道加減法的位運算原理和知道計算機中的算術運算會發(fā)生越界的情況,二是要具備一定的面向?qū)ο蟮脑O計思想。首先,計算機中用固定數(shù)量的幾個字節(jié)來的數(shù)值,所以計算機中能夠表示的數(shù)值是有一定的范圍的,為了便于講解和理解,我們先以 byte 類型的整數(shù)為例,它用 1

9、 個字節(jié)進行最大數(shù)值范圍,表示的為-128 到+127。-1 在內(nèi)存中對應的二進制數(shù)據(jù)為 11111111,如果兩個-1 相加,不考慮 Java運算時的類型提升,運算后會產(chǎn)生進位,二進制結(jié)果為 1,11111110,由于進位后超過了 byte 類型的間,所以進位部空分被舍棄,即最終的結(jié)果為 11111110,也就是-2,這正好利用溢位的方式實現(xiàn)了負數(shù)的運算。-128 在內(nèi)存中對應的二進制數(shù)據(jù)為 10000000,如果兩個-128 相加,不考慮 Java 運算時的類型提升,運算后會產(chǎn)生進位,二進制結(jié)果為 1,00000000,由于進位后超過了 byte 類型的即最終的結(jié)果空間,所以進位部分被舍棄

10、,為 00000000,也就是 0,這樣的結(jié)果顯然不是我們期望的,這說明計算機中的算術運算是會發(fā)生越界情況的,兩個數(shù)值的運算結(jié)果不能超過計算機中的該類型的數(shù)值范圍。由于 Java 中涉及表算時的類型自運動提升,我們無法用 byte 類型來做演示這種問題和現(xiàn)象的實驗,大家可以用下面一個使用整數(shù)做實驗的例子程序體驗一下:inta =Integer.MAX_VALUE;intb =Integer.MAX_VALUE;intsum= a + b;System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);先不考慮 long 類型,由于 int 的正數(shù)范圍為 2 的 3

11、1 次方,表示的最大數(shù)值約等于2*1000*1000*1000,也就是 20 億的大小,所以,要實現(xiàn)一個一百億的計算器,我們得示很大的整數(shù),設計一個類可以用于表并且提供了與另外一個整數(shù)進行加減乘除的功能,大概功能如下:()這個類內(nèi)部有兩個成員變量,一個表示符號,另一個用字節(jié)數(shù)組表示數(shù)值的二進制數(shù)()有一個構造方法,把一個包含有多位數(shù)值的字符串轉(zhuǎn)換到內(nèi)部的符號和字節(jié)數(shù)組中()提供加減乘除的功能public class BigIntegerint sign;byteval;publicBiginteger(Stringval)sign =;val = ;public BigInteger add(

12、BigInteger other)publicBigIntegersubtract(BigIntegerother)publicBigIntegermultiply(BigIntegerother)publicBigIntegerdivide(BigInteger other)備注:要想寫出這個類的完整代碼,是非常復雜的,如果有的話,可以參看 jdk 中自帶的java.math.BigInteger 類的源碼。面試的人也知道誰都不可能在短時間內(nèi)寫出這個類的完整代碼的,他要的是你是否有這方面的概念和意識,他最重要的還是考查你的能力,所以,你不要因為寫出完整的無法最終結(jié)果就放棄答這道題,你要做的就

13、是你比別人寫得多,證明你比別人強,你有這方面的思想意識就可以了,畢竟別人可能連題目的意思都看不懂,什么都沒寫,你要敢于答這道題,即使只答了一部分,與那些什么都不懂的人區(qū)別出來,拉開了距離,算是矮子中的高個,機會當然就屬于你了。另外,中的框架代碼也很重要,體現(xiàn)了一些面向?qū)ο笤O計的功底,特別是其中的方法命名很專業(yè),用的英文單詞很精準,這也是能力、經(jīng)驗、專業(yè)性、英語水平等多個方面的體現(xiàn),會給人留下很好的印象,在編程能力和其他方面條件差不多的情,英語好除了可以使你獲得機會外,薪水可以高出一千元。10、使用 final 關鍵字修飾一個變量時,是不能變,還是的對象不能變?使用 final 關鍵字修飾一個變

14、量時,是指是可以改變量不能變,變量所指向的對象中的內(nèi)容還變的。例如,對于如下語句:final StringBuffer a=new StringBuffer("immutable");執(zhí)行如下語句將報告編譯期錯誤:a=new StringBuffer("");但是,執(zhí)行如下語句則可以通過編譯:a.append(" broken!");有人在定義方法的參數(shù)時,可能想采用如下形式來方法內(nèi)部修改傳進來的參數(shù)對象:public void method(final StringBuffer param)實際上,這是辦不到的,在該方法內(nèi)部仍然可以

15、增加如下代碼來修改參數(shù)對象:param.append("a");11、"="和 equals 方法究竟有什么區(qū)別?(單獨把一個東西說清楚,然后再說清楚另一個,這樣,它們的區(qū)別自然就出來了,混在一起說,則很難說清楚)=操作符專門用來比較兩個變量的值是否相等,也就是用于比較變量所對應的內(nèi)存中所數(shù)值是的否相同,要比較兩個基本類型的數(shù)據(jù)或兩個變量是否相等,只能用=操作符。如果一個變量指向的數(shù)據(jù)是對象類型的,那么,這時候涉及了兩塊內(nèi)存,對象本身占用一塊內(nèi)存(堆內(nèi)存),變量也占用一塊內(nèi)存,例如 Objet obj = new Object();變量 obj 是一個內(nèi)

16、存,new Object()是另一個內(nèi)存,此時,變量 obj 所對應的內(nèi)存中對象類型的的數(shù)值就是對象占用的那塊內(nèi)存的首地址。對于指向變量,如果要比較兩個變量是否指向同一個對象,即要看這兩個變量所對應的內(nèi)存中的數(shù)值是否相等,這時候就需要用=操作符進行比較。equals 方法是用于比較兩個同,它比較對象的內(nèi)容是否相同,就好比去比較兩個人的長相是否相的兩個對象是的。例如,對于下面的代碼:String a=newString("foo");String b=newString("foo");兩條 new 語句創(chuàng)建了兩個對象,然后用 a,b 這兩個變量分別指向了其

17、中一個對象,這是兩個不同的對象,它們的首地址是不同的,即 a 和 b 中false,而這的數(shù)值是不相同的,所以,表a=b 將返回兩個對象中的內(nèi)容是相同的,所以,表a.equals(b)將返回 true。在實際開發(fā)中,我們經(jīng)常要比較傳遞進行來的字符串內(nèi)容是否等,例如,String input= ;input.equals(“quit”),許多人稍不注意就使用=進行比較了,這是錯誤的,隨便從網(wǎng)上找?guī)讉€項目實戰(zhàn)的教學法??纯?,里面就有大量這樣的錯誤。記住,字符串的比較基本上都是使用 equals 方如果一個類沒有定義 equals 方法,那么它將繼承 Object 類的 equals 方法,Obje

18、ct 類的equals 方法的實現(xiàn)代碼如下:boolean equals(Object o)return this=o;這說明,如果一個類沒有的)就是使定義 equals 方法,它默認的 equals 方法(從 Object 類繼承用=操作符,也是在比較兩個變量指向的對象是否是同一對象,這時候使用 equals 和使用= 會得到同樣的結(jié)果,如果比較的是兩個的兩個實例對的對象則總返回 false。如果你編寫的類希望能夠比較該類創(chuàng)建象的內(nèi)容是否相同,那么你必須覆蓋 equals 方法,由你為兩個對象的寫代碼來決定在什么情況即可認內(nèi)容是相同的。12、靜態(tài)變量和實例變量的區(qū)別?在語法定義上的區(qū)別:靜態(tài)

19、變量前要加 static 關鍵字,而實例變量前則不加。在才會被行時的區(qū)別:實例變量屬于某個對象的屬性,必須創(chuàng)建了實例對象,其中的實例變量分配空間,才能使用這個實例變量。靜態(tài)變量不屬于某個實例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實例對象,靜態(tài)變量就會被分配空間,靜態(tài)變量就可以被使用了??傊?,實例變量必須創(chuàng)建對象后才可以通過這個對象來使用,靜態(tài)變量則可以直接使用類名來。例如,對于下面的程序,無論創(chuàng)建多少個實例對象,永遠都只分配了一個 staticVar 變量,并且每創(chuàng)建一個實例對象,這個 staticVar 就會加 1;但是,每創(chuàng)建一個實例對象,就會分配一個i

20、nstanceVar,即可能分配多個 instanceVar,并且每個 instanceVar 的值都只自加了 1 次。public class VariantTestpublicstatic int staticVar=0;publicint instanceVar = 0;publicVariantTest()staticVar+;instanceVar+;System.out.println(“staticVar=”+ staticVar + ”,instanceVar=”+ instanceVar);備注:這個解答除了說清楚兩者的區(qū)別外,最后還用一個具體的應用例子來說明兩者的差異, 體

21、現(xiàn)了有很好的解說問題和設計案例的能力,思維敏捷,超過一般程序員,有寫作能力!13、是否可以從一個 static 方法內(nèi)部發(fā)出對非 static 方法的調(diào)用?不可以。因為非 static 方法是要與對象關聯(lián)在一起的,必須創(chuàng)建一個對象后,才可以在該對象上進行方法調(diào)用,而 static 方法調(diào)用時不需要創(chuàng)建對象,可以直接調(diào)用。也就是說,當一個 static 方法被調(diào)用時,可能還沒有創(chuàng)建任何實例對象,如果從一個 static 方法中發(fā)出對非 static 方法的調(diào)用,那個非static 方法是關聯(lián)到哪個對象上的呢?這個邏輯無法成立,所以,一個 static 方法內(nèi)部發(fā)出對非 static 方法的調(diào)用。

22、14、Integer 與 int 的區(qū)別int 是 java 提供的 8 種原始數(shù)據(jù)類型之一。Java 為每個原始類型提供了封裝類,Integer 是java 為 int 提供的封裝類。int 的默認值為 0,而 Integer 的默認值為 null,即 Integer 可以區(qū)分出未賦值和值為 0 的區(qū)別,int 則無法表達出未賦值的情況,例如,要想表達出沒有參加只能使用 Integer。和成績?yōu)?0 的區(qū)別,則在 JSP 開發(fā)中,Integer 的默認為 null,所以用 el 表串,而 int 默認在文本框中顯示時,值為空白字符的默認值為 0,所以用 el 表的表單數(shù)據(jù)的在文本框中顯示時,

23、結(jié)果為 0,所以,int 不適合作為 web 層類型。在 Hibernate 中,如果將 OID 定義為 Integer 類型,那么 Hibernate 就可以根據(jù)其值是否為null 而一個對象是否是臨時的,如果將 OID 定義為了 int 類型,還需要在 hbm unsaved-value 屬性文件中設置其為 0。另外,Integer 提供了多個與整數(shù)相關的操作方法,例如,將一個字符串轉(zhuǎn)換成整數(shù),Integer 中還定義了表示整數(shù)的最大值和最小值的常量。15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?Math 類中提供了三個與取整有關的方法:ce

24、il、floor、round,這些方法的作用與它們的英文名稱的含義相對應,例如,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;最難掌握的是 round 方法,它表示“四舍五入”,算法為Math.floor(x+0.5),即將原來的數(shù)字加上 0.5 后再向下取整,所以,Math.round(11.5)的結(jié)果為 12,Math.round(-

25、11.5)的結(jié)果為-11。15、下面的代碼有什么不妥之處?1. if(username.equals(“zxx”)2. int x = 1;return x=1?true:false;1、請說出作用域 public,private,protected,以及不寫時的區(qū)別這四個作用域的可見范圍如下表所示。說明:如果在修飾的元素上面沒有寫任何修飾符,則表示 friendly。作用域 當前類 同一 package 子孫類 其他 packagepublic protected ×friendly × ×private × × ×備注:只要記住了

26、有 4 種別按排權限,4 個范圍,然后將全選和范圍在水平和垂直方向上分從小到大或從大到小的順序排列,就很容易畫出上面的圖了。2、Overload 和 Override 的區(qū)別。Overloaded 的方法是否可以改變返回值的類型?Overload 是重載的意思,Override 是覆蓋的意思,也就是重寫。重載 Overload 表示同一個類中可以有多個名稱相同的方法,但這些方法的參數(shù)列表各不相同(即參數(shù)個數(shù)或類型不同)。重寫 Override 表示子類中的方法可以與父類中的某個方法的名稱和參數(shù)完全相同,通過子類創(chuàng)建的實例對象調(diào)用這個方法時,將調(diào)用子類中的定義方法,這相當于把父類中定義的那個完全

27、相同的方法給覆蓋了,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有問題。子類的方法的權限只能比父類的更大,不能更小。如果父類的方法是 private 類型,那么,子類則不存在覆蓋的限制,相當于子類中增加了一個全新的方法。至于 Overloaded 的方法是否可以改變返回值的類型這個問題,要看你倒底想問什么呢?這個題目很模糊。如果幾個 Overloaded 的方法的參數(shù)列表不一樣,它們的返回者類型當然也可以不一樣。但我估計你想問的問題是:如果兩個方法的參數(shù)列表完全一樣,是否可以讓

28、它們的返回值不同來實現(xiàn)重載Overload。這是不行的,我們可以用反證法來說明這個問題,因為我們有時候調(diào)用一個方法時也可以不定義返回結(jié)果變量,即不要關心其返回結(jié)果,例如,我們調(diào)用 map.remove(key)方法時,雖然 remove 方法有返回值,但是我們通常都的方法,僅定義接收返回結(jié)果的變量,這時候假設該類中有兩個名稱和參數(shù)列表完全相同僅是返回類型不同,java 就無法確定編程者倒底是想調(diào)用哪個方法了,因為它無法通過返回結(jié)果類型來判斷。override 可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法并且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現(xiàn),在接口

29、中一般只是對方法進行了,而我們在實現(xiàn)時,就需要實現(xiàn)接口的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:1、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;4、被覆蓋的方法不能為 private,否則在其子類中只是新定義了一個方法,并沒有對其進行覆蓋。overload 對我們來說可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入?yún)?shù)來區(qū)分這些方法,然后再調(diào)

30、用時,VM 就會根據(jù)不同的參數(shù)樣式,來選擇合適的方法執(zhí)行。在使用重載要注意以下的幾點:1、在使用重載時只能通過不同的參數(shù)樣式。例如,不同的參數(shù)類型,不同的參數(shù)個數(shù),不同的參數(shù)順序(當然,同一方法內(nèi)的幾個參數(shù)類型必須不一樣,例如可以是fun(int,float),但是不能為 fun(int,int));2、不能通過權限、返回類型、拋出的異常進行重載;3、方法的異常類型和數(shù)目對重載造成影響;4、對于繼承來說,如果某一方法在父類中是權限是 priavte,那么就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而達到重載的效果。3、4 月 21 號貢獻的一些題?朱 wenchao,女:3

31、500,21 歲搞了多個重載方法,參數(shù)分別是 int ,char,和 double,然后將 doublex = 2,傳遞進去,會選擇哪個方法?說說對 javaee 中的 session 的理解,你是怎么用 session 的?陳 yong, 4000一個房子里有椅子,椅子有腿和背,房子與椅子是什么關系,椅子與腿和背是什么關系?如果房子有多個椅子,就是聚合關系,否則是一種關聯(lián)關系,當然,聚合是一種特殊的關聯(lián)。椅子與腿和背時組合關系。說說 has a 與 is a 的區(qū)別。答:is-a 表示的是屬于得關系。比如兔子屬于一種動物(繼承關系)。has-a 表示組合,包含關系。比如兔子包含有腿,頭等組件

32、;工廠模式的類圖45 月 15 號貢獻的一些題?1. 線程如何同步和通訊。 同學回答說 synchronized 方法或代碼塊!面試官似乎不太滿意!只有多個 synchronized 代碼塊使用的是同一個監(jiān)視器對象,這些 synchronized 代碼塊之間才具有線程互斥的效果,假如 a 代碼塊用 obj1 作為監(jiān)視器對象,假如 b 代碼塊用 obj2 作為監(jiān)視器對象,那么,兩個并發(fā)的線程可以同時分別進入這兩個代碼塊中。 這里還可以分析一下同步的原理。對于同步方法的分析,所用的同步監(jiān)視器對象是 this接著對于靜態(tài)同步方法的分析,所用的同步監(jiān)視器對象是該類的 Class 對象接著對如何實現(xiàn)代碼

33、塊與方法的同步進行分析。2.ClassLoader 如何加載 class 。jvm 里有多個類加載,每個類加載可以負責加載特置的類,例如,bootstrap 類加載負責加載 jre/lib/rt.jar 中的類, 我們extclassloader 負責用的 jdk 中的類都位于 rt.jar 中。加載 jar/lib/ext/*.jar 中的類,appclassloader 負責 classpath 指定的目錄或 jar 中的類。除了bootstrap 之外,其他的類加載器本身也都是 java 類,它們的父類是 ClassLoader。3.Servlet 的生命周期4.抽象類的作用5.Arra

34、yList 如何實現(xiàn)的數(shù)據(jù)按自定義的方式有序存放class MyBean implements Comparablepublic int compareTo(Object obj)if(! obj instanceof MyBean)throw new ClassCastException()/具體異常的名稱,我要查 jdk 文檔。MyBean other = (MyBean) obj;return age > other.age?1:age=other.age?0:-1;class MyTreeSet private ArrayList datas = new ArrayList();

35、public void add(Object obj)for(int i=0;i<datas.size();i+)if(pareTo(datas.get(i) != 1)datas.add(i,obj);6.分層設計的好處;把各個功能按調(diào)用流程進行了模塊化,模塊化帶來的好處就是可以隨意組合,舉例說明:如果要一個用戶,流程為顯示界面并通過界面接收用戶的輸入,接著進行業(yè)務邏輯處理,在處理業(yè)務邏輯又數(shù)據(jù)庫,如果這些步驟全部按流水帳的方式放在一個方法中編寫,這也是可以的,但這其中的壞處就是,當界面要修改時,由于代碼一個方法內(nèi),可能會碰壞業(yè)務邏輯和數(shù)據(jù)庫的碼,同樣,當修改業(yè)務邏輯或數(shù)據(jù)庫的代碼時,

36、也會碰壞其他部分的代碼。分層就是要把界面部分、業(yè)務邏輯部分、數(shù)據(jù)庫部分的代碼放在各自的方法或類中編寫,這樣就出現(xiàn)牽一發(fā)而動全身的問題了。這樣分層后,還可以方便切換各層,譬如原來的界面是 Swing,現(xiàn)在要改成 BS 界面,如果最初是按分層設計的,這時候不需要涉及業(yè)務和數(shù)據(jù)的代碼,只需編寫一條 web界面就可以了。下面的參考,不建議照搬照套,一定要改成的語言,發(fā)現(xiàn)內(nèi)心的感受:分層的好處:1,實現(xiàn)了軟件之間的解耦;2.便于進行分工3.便于維護4,提高軟件組件的重用5.便于替換某種,比如持久層用的是 hibernate,需要更換用 toplink,就不用該其他業(yè)務代碼,直接把配置一改。6.便于功能的

37、擴展。7。便于適用用戶需求的不斷變化7.序列化接口的 id 有什么用?對象經(jīng)常要通過 IO 進行傳送,讓你寫程序傳遞對象,你會怎么做?把對象的狀態(tài)數(shù)據(jù)用某種格式寫入到硬盤,->“zxx,male,28,30000”.,既然大家都要這么干,并且沒有個統(tǒng)一的干法,于是,sun 公司就提出一的解決方案,它會把對象變成某個格式進行輸入和輸出,這種格式對程序員來說是透明(transparent)的,但是,我們的某個類要想能被 sun 的這種方案處理,必須實現(xiàn) Serializable 接口。ObjectOutputStream.writeObject(obj);Object obj = Objec

38、tInputStream.readObject();假設兩年前我保存了某個類的一個對象,這兩年來,我修改該類,刪除了某個屬性和增加了另外一個屬性,兩年后,我又去那個保存的對象,或有什么結(jié)果?未知!sun 的 jdk就會蒙了。為此,一個解決辦法就是在類中增加版本后,每一次類的屬性修改,都應該把版本號升級一下,這樣,在時,比較對象時的版本號與當前類的版本號,如果不一致,則直接報版本號不同的錯!9.hashCode 方法的作用?說(網(wǎng)友提供的一段,待改進:hashcode 這個方法是用來鑒定 2 個對象是否相等的。那你會說,不是還有 equals 這個方法嗎?不錯,這 2 個方法都是用來2 個對象是

39、否相等的。但是他們是有區(qū)別的。一般來講,equals 這個方法是給用戶調(diào)用的,如果你想equals 方法,2 個對象是否相等,你可以重寫然后在代碼中調(diào)用,就可以表面上看或他們是否。簡單來講,equals 方法主要是用來從者從內(nèi)容上看,2 個對象是不是相等。舉個例子,有個學生類,屬性只有姓名和們可以認為,那么我只要姓名和相等,那么就說這 2 個對象是相等的。hashcode 方法一般用戶斷 key 是去調(diào)用,比如在 hashmap 中,由于 key 是不可以重復的,他在判不是重復的時候就說 equals了 hashcode 這個方法,而且也用到了 equals 方法。這里不可以重復是和 hash

40、code 只要有一個不等就可以了!所以簡單來講,hashcode 相當于是一個對象的編碼, 就好像文件中的 md5,他和 equals 不同就在于他返回的是 int 型的,比較起來不直觀。我們一般在覆蓋 equals 的同時也要覆蓋 hashcode,讓他們的邏輯一致。舉個例子,還是剛剛的例子,如果姓名和相等就算 2個對象相等的話,那么 hashcode 的方法也要返回姓名的 hashcode 值加上值,這樣從的 hashcode邏輯上,他們就一致了。要從物理上2 個對象是否相等,用=就可以了。)10.webservice 問得很多11.設計出計算任意正整數(shù)的階層。4.在 oracle 數(shù)據(jù)庫

41、中需要出前 8 條的 sql 語句怎么寫?5.什么是 SOA,談談你的 SOA 的理解。service orientied architecture6.如何實現(xiàn)線的通訊。新題目:編程:1.編寫一個函數(shù)將一個十六進制數(shù)的字符串參數(shù)轉(zhuǎn)換成整數(shù)返回。String str = “13abf”;int len= str.length;int sum= 0;for(inti=0;i<len;i+)char c = str.charAt(len-1-i);int n = Character.digit(c,16);sum += n * (1<<(4*i);其實,也可以用 Integer.p

42、arseInt(str,16),但面試官很可能是想考我們的編碼基本功。編程 2:的還款方式中最常用的是一種叫“等額本息”,還款法,即借款人在約定還款期限內(nèi)的每一期(月)歸還的金額(產(chǎn)生的利息+部分本金)都是相等的,現(xiàn)有一筆總額為T 元的N 年期住房,年利率為 R,要求算出每一期的還款的本金和利息總額,請寫出解決思路和任意一種編程語言實現(xiàn)的主要代碼。思路:既然是按月還款,要將 N 年按月來計算,即要還 N*12,這樣就可以求出每月要還的本金。由于每月要還的那部分本金所欠的時間不同,所以,它們所產(chǎn)生的利息是不同的,該部分本金的利息為:部分本金額*所欠月數(shù)*月利率。應該是這么個算法,如果利息還計利息

43、,如果月還款不按年利率來算,算不明白的。int monthMoney = T/N/12;float monthRate = R/12;int totalMonth = N * 12;float totalRate = 0;for(int i=1;i<=totalMonth;i+)totalRate += monthMoney * monthRate* i;int result = monthMoney + totalRate/N/12;幾道題:1.*Spring 的 DI 是什么(學員注:除了 IOC,AOP 這些概念,還不太清楚 DI 的概念)2.*任意數(shù)字序列“123456”之類,輸

44、出它們所有的排列組合3.*什么是 AOP(學員注:會用,但感覺說不清楚)我注:由上面這些題,可以看出,思想很重要,只有琢磨思想和原理的能很好地回答這些問題!2 題的:Stringstr = “xafdvs”;chararr1 = str.toCharArray();chararr2 = Arrays.copyOf(arr1,arr1.length);for(int i=0;i<arr1.length-1;i+)for(int j = i+1;j<arr2.length;j+)syso: arr1i + “,” + arr2j;3 題的:1.概念介紹:所謂 AOP,即 Aspect

45、orientied program,就是面向方面的編程,2.解釋什么是方面:貫穿到系統(tǒng)的各個模塊中的系統(tǒng)一個功能就是一個方面,比如,日志,統(tǒng)一異常處理,事務處理,檢查,這些功能都是軟件系統(tǒng)的一個面,而不是一點,在各個模塊中都要出現(xiàn)。3.什么是面向方面編程:把系統(tǒng)的一個方面的功能封裝成對象的形式來處理4.怎么進行面向方面編程:把功能模塊對應的對象作為切面嵌入到原來的各個系統(tǒng)模塊中,采用技術,會調(diào)用目標,同時把切面功能的代碼(對象)加入進來,所以,用 spring 配置對象時只要要配兩個屬性,分別表示目標和切面對象(Advisor)。3、構造器 Constructor 是否可被 override?

46、構造器 Constructor 不能被繼承,因此不能重寫 Override,但可以被重載 Overload。4、接口是否可繼承接口? 抽象類是否可實現(xiàn)(implements)接口? 抽象類是否可繼承具體類(concrete class)? 抽象類中是否可以有靜態(tài)的 main 方法?接口可以繼承接口。抽象類可以實現(xiàn)(implements)接口,抽象類是否可繼承具體類。抽象類中可以有靜態(tài)的 main 方法。備注:只要明白了接口和抽象類的本質(zhì)和作用,這些問題都很好回答,你想想,如果你是java 語言的設計者,你是否會提供這樣的支持,如果不提供的話,有什么理由嗎?如果你沒不提供,那就是肯定的了。只有記

47、住抽象類與普通類的唯一區(qū)別就是不能創(chuàng)建實例對象和有 abstract 方法。5、寫 clone()方法時,通常都有一行代碼,是什么?clone 有缺省行為,super.clone();因為首先要把父類中的成員的成員。到位,然后才是6、面向?qū)ο蟮奶卣饔心男┓矫嬗嬎銠C軟件系統(tǒng)是現(xiàn)實生活中的業(yè)務在計算機中的對象協(xié),而現(xiàn)實生活中的業(yè)務其實就是一個個作的過程。面向?qū)ο缶幊叹褪前船F(xiàn)實業(yè)務一樣的方式將程序代碼按一個個對象進行組織和編寫,讓計算機系統(tǒng)能夠識別和理解用對象方式組織和編寫的程序代碼,這樣就可以把現(xiàn)實生活中的業(yè)務對象到計算機系統(tǒng)中。面向?qū)ο蟮木幊陶Z言有封裝、繼承 、抽象、多態(tài)等 4 個主要的特征。1

48、 封裝:封裝是保證軟件部件具有優(yōu)良的模塊性的基礎,封裝的目標就是要實現(xiàn)軟件部件的“高內(nèi)聚、低耦合”,防止程序相互依賴性而帶來的變動影響。在面向?qū)ο蟮木幊陶Z言中,對象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語言的封裝更為清晰、更為對象的屬。面向?qū)ο蟮姆庋b就是把描述一個性和行為的代碼封裝在一個“模塊”中,也就是一個類中,屬性用變量定義,行為用方法進行定義,方法可以直接同一個對象中的屬性。通常情一起,將一,只要記住讓變量和這個變量的方法放在個類中的成員變量全部定義成私有的,只有這個類就基本上實的方法才可以到這些成員變量,這現(xiàn)對象的封裝,就很容易找出要分配到這個類上的方法了,就基本上算是會面向?qū)ο蟮木?/p>

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

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

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

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

53、etDao()在執(zhí)行的時候返回,有時候指向的是 UserJdbcDao 這個實現(xiàn),有時候指向的是 UserHibernateDao 這個實現(xiàn),這樣,不用修改源代碼,就可以改變 userDao 指向的具體類實現(xiàn),從而導致 userDao.insertUser()方法調(diào)用的具體代碼也隨之改變,即有時候調(diào)用的是UserJdbcDao 的 insertUser 方法,有時候調(diào)用的是 UserHibernateDao 的 insertUser 方法:UserDao userDao = daofactory.getDao();userDao.insertUser(user);比喻:人吃飯,你看到的是左手,

54、還是右手?7、java 中實現(xiàn)多態(tài)的機制是什么?靠的是父類或接口定義的在變量可以指向子類或具體實現(xiàn)類的實例對象,而程序調(diào)用的方法運行期才動態(tài)綁定,就是個對象變量所指向的具體實例對象的方法,也就是內(nèi)存里正在運行的那的方法,而不是變量的類型中定義的方法。8、abstract class 和 interface 有什么區(qū)別?含有 abstract 修飾符的 class 即為抽象類,abstract 類不能創(chuàng)建的實例對象。含有abstract 方法的類必須定義為 abstract class,abstract class 類中的方法不必是抽象的。abstract class 類中定義抽象方法必須在具體(Concrete)子類中實現(xiàn),所以,不能有抽象構造方法或抽象靜態(tài)方法。如果的子類沒有實現(xiàn)抽象父類中的所有抽象方法,那么子類也必須定義為 abstract 類型。接口(interface)可以說中的方法定抽象類的一種特例,接口中的所有方法都必須是抽象的。接口義默認為 public abstract 類型,接口中的成員變量類型默認為 public static final。下面比較一下兩者的語法區(qū)別:1.抽象類可以有構造方法,接口中不能有構造方法。2.抽象類中可以有普通

溫馨提示

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

評論

0/150

提交評論