Java 經(jīng)典面試題之簡答題篇(一)

1.面向?qū)ο蟮奶卣饔心男?/h4>

抽象:找出一些事物的相似和共性之處,然后將這些事物歸為一類,這個(gè)類只考慮這些事物的相似和共性之處,并且會(huì)忽略與當(dāng)前主題和目標(biāo)無關(guān)的方面,將注意力集中到與當(dāng)前主題和目標(biāo)有關(guān)的方面。

封裝:面向?qū)ο蟮姆庋b就是把描述一個(gè)對象的屬性和行為的代碼封裝到一個(gè)“模塊”中,也就是一個(gè)類,屬性用變量定義,行為用方法定義,方法可以直接訪問同一個(gè)對象中的屬性。封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目的是實(shí)現(xiàn)軟件部件的“高內(nèi)聚,低耦合”,防止程序相互依賴性而帶來的變動(dòng)影響。在面向?qū)ο蟮木幊陶Z言中,對象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語言中的封裝更為清晰、更為有利。

繼承:在定義和實(shí)現(xiàn)一個(gè)類的時(shí)候,可以在一個(gè)已經(jīng)存在的類的基礎(chǔ)上進(jìn)行,把這個(gè)已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并可以加入若干的新內(nèi)容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動(dòng)共享父類數(shù)據(jù)和方法的機(jī)制,這是類之間的關(guān)系,提高了軟件的可重用性和可擴(kuò)展性。????

多態(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ò)展性。

2.String是最基本的數(shù)據(jù)類型嗎?

????????不是;基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。除了基本數(shù)據(jù)類型(primitive type)和枚舉類型(enumeration type),剩下的都是引用類型。

3.抽象方法

1).類的聲明:abstact class 類名

2).方法的聲明:abstact 返回值 方法名();

3).抽象類不一定有抽象方法,但是有抽象方法的類一定是抽象類

4).如果用非抽象類繼承抽象類,那么這個(gè)抽象類必須自己父類的所有方法,不然會(huì)報(bào)錯(cuò)

5). abstact不能與private、static、final、native并列修飾同一個(gè)方法

4.JSP和Servlet有哪些相同點(diǎn)和不同點(diǎn),他們之間的聯(lián)系是什么?

相同點(diǎn):

1).JSP在本質(zhì)上就是Servlet.

2).JSP是Servlet技術(shù)的擴(kuò)展,本質(zhì)上就是Servlet的簡易方式.

3).JSP編譯后是“類servlet”.

不同點(diǎn):

1).Servlet完全是JAVA程序代碼構(gòu)成,擅長于流程控制和事務(wù)處理,通過Servlet來生成動(dòng)態(tài)網(wǎng)頁很不直觀.

2).JSP由HTML代碼和JSP標(biāo)簽構(gòu)成,可以方便地編寫動(dòng)態(tài)網(wǎng)頁.

3).在實(shí)際應(yīng)用中采用Servlet來控制業(yè)務(wù)流程,而采用JSP來生成動(dòng)態(tài)網(wǎng)頁.

4).在struts框架中,JSP位于MVC設(shè)計(jì)模式的視圖層,而Servlet位于控制層.

5).Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP是Java和HTML組合成一個(gè)擴(kuò)展名為.jsp的文件.

6).JSP側(cè)重于視圖,Servlet主要用于控制邏輯.

7).JSP中嵌入JAVA代碼,而Servlet中嵌入HTML代碼.

5.說出連接池的工作機(jī)制

????????數(shù)據(jù)連接池是把數(shù)據(jù)庫連接放到中間服務(wù)器上,比如tomcat上,那么相當(dāng)于每次你操作數(shù)據(jù)庫的時(shí)候就不需要再"連接"到數(shù)據(jù)庫再進(jìn)行相關(guān)操作,而是直接操作服務(wù)器上的"連接池"。

????????J2EE服務(wù)器啟動(dòng)時(shí)會(huì)建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接??蛻舳顺绦蛐枰B接時(shí),池驅(qū)動(dòng)程序會(huì)返回一個(gè)未使用的池連接并將其標(biāo)記為忙。如果當(dāng)前沒有空閑連接,池驅(qū)動(dòng)程序就新建一定數(shù)量的連接,新建連接的數(shù)量由配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成后,池驅(qū)動(dòng)程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個(gè)連接。

6.多線程有幾種實(shí)現(xiàn)方式?同步有幾種方式?

????????多線程有兩種實(shí)現(xiàn)方法,分別是繼承Thread類與實(shí)現(xiàn)Runnable接口

????????同步的實(shí)現(xiàn)方面有兩種,分別是synchronized,wait與notify

7.描述forword和redirect的區(qū)別

一句話概括:重定向是客戶端行為,轉(zhuǎn)發(fā)是服務(wù)器行為

轉(zhuǎn)發(fā)過程:(froward)

客戶瀏覽器發(fā)送http請求----》web服務(wù)器接受此請求--》調(diào)用內(nèi)部的一個(gè)方法在容器內(nèi)部完成請求處理和轉(zhuǎn)發(fā)動(dòng)作----》將目標(biāo)資源發(fā)送給客戶;在這里,轉(zhuǎn)發(fā)的路徑必須是同一個(gè)web容器下的url,其不能轉(zhuǎn)向到其他的web路徑上去,中間傳遞的是自己的容器內(nèi)的request。在客 戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務(wù)器做了轉(zhuǎn)發(fā)的。轉(zhuǎn)發(fā)行為是瀏覽器只做了一次訪問請求。

重定向過程:(Redirect)

客戶瀏覽器發(fā)送http請求----》web服務(wù)器接受后發(fā)送302狀態(tài)碼響應(yīng)及對應(yīng)新的location給客戶瀏覽器--》客戶瀏覽器發(fā)現(xiàn) 是302響應(yīng),則自動(dòng)再發(fā)送一個(gè)新的http請求,請求url是新的location地址----》服務(wù)器根據(jù)此請求尋找資源并發(fā)送給客戶。在這里 location可以重定向到任意URL,既然是瀏覽器重新發(fā)出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。

8.垃圾回收器的基本原理是什么?垃圾回收器可以馬上收回內(nèi)存嗎?有什么辦法可以主動(dòng)通知虛擬機(jī)進(jìn)行垃圾回收?

1).對于GC來說,當(dāng)程序員創(chuàng)建對象時(shí),GC就開始監(jiān)控這個(gè)對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象,通過這種方式確定哪些對象是"可達(dá)的",哪些對象是"不可達(dá)的"。當(dāng)GC確定一些對象為"不可達(dá)"時(shí),GC就有責(zé)任回收這些內(nèi)存空間

2).可以.

3).程序員可以手動(dòng)執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語言規(guī)范并不保證GC一定會(huì)執(zhí)行.

9.EJB(Enterprise?JavaBean)的優(yōu)點(diǎn)有哪些?

1).性能優(yōu)越

2).強(qiáng)大的容器支持

10.Servlet處理請求的方式是?

????????以線程的方式

11.說出Servlet的生命周期,并說出Servlet和CGI的區(qū)別

1).Servlet的生命周期:Servlet 通過調(diào)用?init ()?方法進(jìn)行初始化,請求到達(dá)時(shí)運(yùn)行其 service() 方法處理客戶端請求,當(dāng)服務(wù)器決定將實(shí)例銷毀的時(shí)候調(diào)用其?destroy() 方法。

2).與cgi的區(qū)別在于servlet處于服務(wù)器進(jìn)程中,它通過多線程方式運(yùn)行其service方法,一個(gè)實(shí)例可以服務(wù)于多個(gè)請求,并且其實(shí)例一般不會(huì)銷毀,而CGI對每個(gè)請求都產(chǎn)生新的進(jìn)程,服務(wù)完成后就銷毀,所以效率上低于servlet。

12.訪問修飾符public,private,protected,以及不寫(默認(rèn))時(shí)的區(qū)別?

????????類的成員不寫訪問修飾時(shí)默認(rèn)為default。默認(rèn)對于同一個(gè)包中的其他類相當(dāng)于公開(public),對于不是同一個(gè)包中的其他類相當(dāng)于私有(private)。受保護(hù)(protected)對子類相當(dāng)于公開,對不是同一包中的沒有父子關(guān)系的類相當(dāng)于私有。

13.int和Integer有什么區(qū)別?

1).Integer是int的包裝類,int則是java的一種基本數(shù)據(jù)類型?

2).Integer變量必須實(shí)例化后才能使用,而int變量不需要

3).Integer實(shí)際是對象的引用,當(dāng)new一個(gè)Integer時(shí),實(shí)際上是生成一個(gè)指針指向此對象;而int則是直接存儲(chǔ)數(shù)據(jù)值

4).Integer的默認(rèn)值是null,int的默認(rèn)值是0

14.請解釋&和&&、|和||的區(qū)別

1).&和&&都可以用作邏輯與的運(yùn)算符,表示邏輯與(and),當(dāng)運(yùn)算符兩邊的表達(dá)式的結(jié)果都為true時(shí),整個(gè)運(yùn)算結(jié)果才為true,否則,只要有一方為false,則結(jié)果為false。&&還具有短路的功能,即如果第一個(gè)表達(dá)式為false,則不再計(jì)算第二個(gè)表達(dá)式,例如,對于if(str != null && !str.equals(“”))表達(dá)式,當(dāng)str為null時(shí),后面的表達(dá)式不會(huì)執(zhí)行,所以不會(huì)出現(xiàn)NullPointerException如果將&&改為&,則會(huì)拋出NullPointerException異常;&還可以用作位運(yùn)算符,當(dāng)&操作符兩邊的表達(dá)式不是boolean類型時(shí),&表示按位與操作,我們通常使用0x0f來與一個(gè)整數(shù)進(jìn)行&運(yùn)算,來獲取該整數(shù)的最低4個(gè)bit位,例如,0x31 & 0x0f的結(jié)果為0x01。

2).普通或(|)表示所有的判斷條件都要執(zhí)行,不管前面是否滿足;短路或(||)表示如果前面的條件已經(jīng)是true了,那么后面無論如何判斷都是true,就不判斷了

15.解釋內(nèi)存中的棧(stack)、堆(heap)和靜態(tài)區(qū)(static area)的用法。

?堆區(qū):

1.存儲(chǔ)的全部是對象,每個(gè)對象都包含一個(gè)與之對應(yīng)的class的信息。(class的目的是得到操作指令)

2.jvm只有一個(gè)堆區(qū)(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身.

3.一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收。

棧區(qū):

1.每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基礎(chǔ)數(shù)據(jù)類型的對象和自定義對象的引用(不是對象),對象都存放在堆區(qū)中

2.每個(gè)棧中的數(shù)據(jù)(原始類型和對象引用)都是私有的,其他棧不能訪問。

3.棧分為3個(gè)部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。

4.由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。

靜態(tài)區(qū)/方法區(qū);

1.方法區(qū)又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。方法區(qū)包含所有的class和static變量。

2.方法區(qū)中包含的都是在整個(gè)程序中永遠(yuǎn)唯一的元素,如class,static變量。

3.全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。

16.swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?

????????在Java 5以前,switch(expr)中,expr只能是byte、short、char、int;從Java 5開始,Java中引入了枚舉類型,expr也可以是enum類型,從Java 7開始,expr還可以是字符串(String),但是長整型(long)在目前所有的版本中都是不可以的。

17.數(shù)組有沒有l(wèi)ength()方法?String有沒有l(wèi)ength()方法?

????????數(shù)組沒有l(wèi)ength()方法,有l(wèi)ength 的屬性。String 有l(wèi)ength()方法。JavaScript中,獲得字符串的長度是通過length屬性得到的,這一點(diǎn)容易和Java混淆。

18.構(gòu)造器(constructor)是否可被重寫(override)?

? ??????構(gòu)造器不能被繼承,因此不能被重寫,但可以被重載。

19.重載和重寫的區(qū)別

????????方法的重載和重寫都是實(shí)現(xiàn)多態(tài)的方式,區(qū)別在于前者實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性,而后者實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性。

重載(Overloading):重載的時(shí)候,方法名要一樣,但是參數(shù)類型和個(gè)數(shù)不一樣,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)。

重寫(Overriding):重寫的時(shí)候,父類中需要被重寫的方法要求與子類中的定義某一方法有相同的方法名、參數(shù)類型和個(gè)數(shù)和返回類型,且子類函數(shù)的訪問修飾權(quán)限不能少于父類。

20.是否可以繼承String類?

? ? ? ? 不能;String類被final修飾,因此不能被繼承。

21.String和StringBuilder、StringBuffer的區(qū)別?

????????Java平臺(tái)提供了兩種類型的字符串:String和StringBuffer/StringBuilder,它們可以儲(chǔ)存和操作字符串。

1).String是只讀字符串,也就意味著String引用的字符串內(nèi)容是不能被改變的。

2).StringBuffer/StringBuilder類表示的字符串對象可以直接進(jìn)行修改。

3).StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,區(qū)別在于它是單線程,而StringBuffer是多線程的

22.描述一下JVM加載class文件的原理機(jī)制

1.裝載:查找和導(dǎo)入class文件;

2.連接:

????(1)檢查:檢查載入的class文件數(shù)據(jù)的正確性;

????(2)準(zhǔn)備:為類的靜態(tài)變量分配存儲(chǔ)空間;

????(3)解析:將符號(hào)引用轉(zhuǎn)換成直接引用(這一步是可選的)

3.初始化:初始化靜態(tài)變量,靜態(tài)代碼塊

????????這樣的過程在程序調(diào)用類的靜態(tài)成員的時(shí)候開始執(zhí)行,所以靜態(tài)方法main()才會(huì)成為一般程序的入口方法。類的構(gòu)造器也會(huì)引發(fā)該動(dòng)作。

23.抽象類(abstract class)和接口(interface)有什么異同?

? ??????抽象類是用來捕捉子類的通用特性的。它不能被實(shí)例化,只能被用作子類的超類。抽象類是被用來創(chuàng)建繼承層級(jí)里子類的模板

? ??????接口是抽象方法的集合。如果一個(gè)類實(shí)現(xiàn)了某個(gè)接口,那么它就繼承了這個(gè)接口的抽象方法。這就像契約模式,如果實(shí)現(xiàn)了這個(gè)接口,那么就必須確保使用這些方法。接口只是一種形式,接口自身不能做任何事情

相同點(diǎn):

1.他們都不能生成實(shí)例,都有抽象方法。

2接口是特殊的抽象類。

3.接口和抽象類的繼承都使用的關(guān)鍵字是extends。

不同點(diǎn):

1.接口的定義的變量默認(rèn)是public?static?final型,且必須給其賦初值。所以在實(shí)現(xiàn)類中不能重新定義,也不能改變其值。而在抽象類中其值在子類中可以重新定義也可以重新賦值。

2.接口的方法默認(rèn)的都是public?abstract類型的。

3.抽象類中可以有構(gòu)造器,但是接口中除了抽象方法什么都沒有。

4.名字不同,接口寫的是public?interface??Shape{};?而抽象類寫的是public??abstract?class?Shape{}。

5.還可以從繼承的角度看,接口可以多繼承,一個(gè)接口可以繼承多個(gè)接口。但是抽象類卻不能,只能是繼承一個(gè)父類,不能繼承多個(gè)父類。

6.abstract class和interface所反映出的設(shè)計(jì)理念不同。其實(shí)abstract class表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guān)系。

7.接口里全部都是抽象方法。而抽象類里可以有抽象方法也可以有其他的方法。

24.Java 中會(huì)存在內(nèi)存泄漏嗎,請簡單描述。

????????理論上Java因?yàn)橛欣厥諜C(jī)制(GC)不會(huì)存在內(nèi)存泄露問題(這也是Java被廣泛使用于服務(wù)器端編程的一個(gè)重要原因);然而在實(shí)際開發(fā)中,可能會(huì)存在無用但可達(dá)的對象,這些對象不能被GC回收,因此也會(huì)導(dǎo)致內(nèi)存泄露的發(fā)生。例如Hibernate的Session(一級(jí)緩存)中的對象屬于持久態(tài),垃圾回收器是不會(huì)回收這些對象的,然而這些對象中可能存在無用的垃圾對象,如果不及時(shí)關(guān)閉(close)或清空(flush)一級(jí)緩存就可能導(dǎo)致內(nèi)存泄露。

25.抽象的(abstract)方法是否可同時(shí)是靜態(tài)的(static),是否可同時(shí)是本地方法(native),是否可同時(shí)被synchronized修飾?

? ??????都不能。抽象方法需要子類重寫,而靜態(tài)的方法是無法被重寫的,因此二者是矛盾的。本地方法是由本地代碼(如C代碼)實(shí)現(xiàn)的方法,而抽象方法是沒有實(shí)現(xiàn)的,也是矛盾的。synchronized和方法的實(shí)現(xiàn)細(xì)節(jié)有關(guān),抽象方法不涉及實(shí)現(xiàn)細(xì)節(jié),因此也是相互矛盾的。

26.GC是什么?為什么要有GC?

? ??????GC是垃圾收集的意思,內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動(dòng)監(jiān)測對象是否超過作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。Java程序員不用擔(dān)心內(nèi)存管理,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理。要請求垃圾收集,可以調(diào)用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉顯示的垃圾回收調(diào)用。

27.接口是否可繼承(extends)接口?抽象類是否可實(shí)現(xiàn)(implements)接口?抽象類是否可繼承具體類(concrete class)?

????????GC是垃圾收集的意思,內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動(dòng)監(jiān)測對象是否超過作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。Java程序員不用擔(dān)心內(nèi)存管理,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理。要請求垃圾收集,可以調(diào)用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉顯示的垃圾回收調(diào)用。

????????垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存。垃圾回收器通常是作為一個(gè)單獨(dú)的低優(yōu)先級(jí)的線程運(yùn)行,不可預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或者長時(shí)間沒有使用的對象進(jìn)行清除和回收,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對某個(gè)對象或所有對象進(jìn)行垃圾回收。

28.一個(gè)".java"源文件中是否可以包含多個(gè)類(不是內(nèi)部類)?有什么限制?

? ??????可以,但一個(gè)源文件中最多只能有一個(gè)公開類(public class)而且文件名必須和公開類的類名完全保持一致。

29.Java 中的final關(guān)鍵字有哪些用法?

(1)修飾類:表示該類不能被繼承

(2)修飾方法:表示方法不能被重寫

(3)修飾變量:表示變量只能一次賦值以后值不能被修改(常量)

30.子父類加載順序

? ? ? ? 先初始化靜態(tài)成員,然后調(diào)用父類構(gòu)造器,再初始化非靜態(tài)成員,最后調(diào)用自身構(gòu)造器。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容