Java軟件開發(fā)常見面試題及答案_第1頁(yè)
Java軟件開發(fā)常見面試題及答案_第2頁(yè)
Java軟件開發(fā)常見面試題及答案_第3頁(yè)
Java軟件開發(fā)常見面試題及答案_第4頁(yè)
Java軟件開發(fā)常見面試題及答案_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Java軟件開發(fā)常見面試題及答Java軟件開發(fā)常見面試題及答案時(shí)間:20161014 14:32來(lái)源:未知 作者:os點(diǎn)擊:101次1.什么是Java虛擬機(jī)?為什么Java被稱作是“平臺(tái)無(wú)關(guān) 的編程語(yǔ)言”?Java虛擬機(jī)是一個(gè)可以執(zhí)行Java字節(jié)碼的虛擬機(jī)進(jìn) 程。Java源文件被編譯成能被Java虛擬機(jī)執(zhí)行的字節(jié)碼文 件。Java被設(shè)計(jì)成允許應(yīng)用程序可以運(yùn)行在任意的平臺(tái),而 不需要程序員為每一個(gè)平臺(tái)單獨(dú)重寫或者是重新編譯。Java虛擬機(jī)讓這個(gè)變?yōu)榭赡?,因?yàn)樗赖讓佑布脚_(tái) 的指令長(zhǎng)度和其他特性。2JDK和JRE的區(qū)別是什么?JDK: java開發(fā)工具包,包含了 JRE、編譯器和其它工具 (如

2、:javaDOCx java 調(diào)試器)JRE:java運(yùn)行環(huán)境,包含java虛擬機(jī)和java程序所需的核心類庫(kù)。如果只是想跑java程序,那么只需安裝JRE,如果要寫 java程序并且運(yùn)行,那就需要JDK 了。3.static”關(guān)鍵字是什么意思?Java中是否可以覆蓋一個(gè) private或者是static的方法?如果一個(gè)類的變量或者方法前面有static修飾,那么表 明這個(gè)方法或者變量屬于這個(gè)類,也就是說可以在不創(chuàng)建對(duì) 象的情況下直接使用當(dāng)父類的方法被private修飾時(shí),表明該方法為父類私 有,對(duì)其他任何類都是不可見的,因此如果子類定了一個(gè)與 父類一樣的方法,這對(duì)于子類來(lái)說相當(dāng)于是一個(gè)新的私

3、有方 法,且如果要進(jìn)行向上轉(zhuǎn)型,然后去調(diào)用該“覆蓋方法”,會(huì) 產(chǎn)生編譯錯(cuò)誤class Parent private fun() )class Child extends Parent private fun() class Test public static void main(String口 args) Parent c = new ChildQ;c.funO; 編譯出錯(cuò)static方法時(shí)編譯時(shí)靜態(tài)綁定的,屬于類,而覆蓋是運(yùn) 行時(shí)動(dòng)態(tài)綁定的(動(dòng)態(tài)綁定的多態(tài)),因此不能覆蓋.4Java支持的基本數(shù)據(jù)類型有哪些?什么是自動(dòng)拆裝箱?java支持的基本數(shù)據(jù)類型有以下9?t:byte,shot,in

4、t,long,float,double,char,boolean,void.自動(dòng)拆裝箱是java從jdkl.5引用,目的是將原始類型 自動(dòng)的裝換為相對(duì)應(yīng)的對(duì)象,也可以逆向進(jìn)行,即拆箱。這 也體現(xiàn)java中一切皆對(duì)象的宗旨。所謂自動(dòng)裝箱就是將原始類型自動(dòng)的轉(zhuǎn)換為對(duì)應(yīng)的對(duì) 象,而拆箱就是將對(duì)象類型轉(zhuǎn)換為基本類型。java中的自動(dòng) 拆裝箱通常發(fā)生在變量賦值的過程中,如:Integer object = 3; 自動(dòng)裝箱int o = object; 拆箱在java中,應(yīng)該注意自動(dòng)拆裝箱,因?yàn)橛袝r(shí)可能因?yàn)?java自動(dòng)裝箱機(jī)制,而導(dǎo)致創(chuàng)建了許多對(duì)象,對(duì)于內(nèi)存小的 平臺(tái)會(huì)造成壓力。5.覆蓋和重載是什么?覆

5、蓋也叫重寫,發(fā)生在子類與父類之間,表示子類中的 方法可以與父類中的某個(gè)方法的名稱和參數(shù)完全相同,通過 子類創(chuàng)建的實(shí)例對(duì)象調(diào)用這個(gè)方法時(shí),將調(diào)用子類中的定義 方法,這相當(dāng)于把父類中定義的那個(gè)完全相同的方法給覆蓋 了,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)。重載是指在一個(gè)類中,可以有多個(gè)相同名稱的方法,但是他們的參數(shù)列表的個(gè)數(shù)或類型不同,當(dāng)調(diào)用該方法時(shí),根 據(jù)傳遞的參數(shù)類型調(diào)用對(duì)應(yīng)參數(shù)列表的方法。當(dāng)參數(shù)列表相 同但返回值不同時(shí),將會(huì)出現(xiàn)編譯錯(cuò)誤,這并不是重載,因 為jvm無(wú)法根據(jù)返回值類型來(lái)判斷應(yīng)該調(diào)用哪個(gè)方法。6Java支持多繼承么?如果不支持,如何實(shí)現(xiàn)?在java中是單繼承的,也就是說一個(gè)類只能

6、繼承一個(gè)父 類。java中實(shí)現(xiàn)多繼承有兩種方式,一是接口,而是內(nèi)部類.實(shí)現(xiàn)多個(gè)接口如果兩個(gè)接口的變量相同那么在調(diào)用 該變量的時(shí)候編譯出錯(cuò)interface interfacel static String field = dd;public void funl();)interface interface2 static String field = dddd11;public void fun2();)class child implements interfacel,interface2 static String field = ddddH;Overridepublic void fun

7、2() )Overridepublic void funl() )內(nèi)部類間接多繼承class Child class Father private void strong() System.out.println(n5n);)class Mother System.out.println(n#);)public void getStrongO Father f = new Father();f.strongO;)public void getCuteQ Mother m = new Mother();m.getCuteQ;)7 .什么是值傳遞和引用傳遞?java中是值傳遞還是引用 傳遞,還是都

8、有?值傳遞就是在方法調(diào)用的時(shí)候,實(shí)參是將自己的一份 拷貝賦給形參,在方法內(nèi),對(duì)該參數(shù)值的修改不影響原來(lái)實(shí) 參,常見的例子就是剛開始學(xué)習(xí)c語(yǔ)言的時(shí)候那個(gè)交換方法 的例子了。引用傳遞是在方法調(diào)用的時(shí)候,實(shí)參將自己的地址傳 遞給形參,此時(shí)方法內(nèi)對(duì)該參數(shù)值的改變,就是對(duì)該實(shí)參的 實(shí)際操作。在java中只有一種傳遞方式,那就是值傳遞.可能比較 讓人迷惑的就是java中的對(duì)象傳遞時(shí),對(duì)形參的改變依然會(huì) 影響到該對(duì)象的內(nèi)容。下面這個(gè)例子來(lái)說明java中是值傳遞.public class Test public static void main(String口 args) StringBuffer sb =

9、new StringBuffer(Hhello );getString(sb);System.out.println(sb);)public static void getString(StringBuffer s) /s = new StringBuffer(Hhan);s.append(world);)在上面這個(gè)例子中,當(dāng)前輸出結(jié)果為:hello world。這并沒有什么問題,可能就是大家平常所理解的引用傳遞,那么 當(dāng)然會(huì)改變StringBuffer的內(nèi)容。但是如果把上面的注釋去 掉,那么就會(huì)輸出:hello.此時(shí)sb的值并沒有變成ha hello.假 如說是引用傳遞的話,那么形參的s也就

10、是sb的地址,此;給S,也就是時(shí)在方法里newStringBuffer。,并將該對(duì)象 說S現(xiàn)在指向了這個(gè)新創(chuàng)建的對(duì)象按照引用傳遞的說法,此 時(shí)對(duì)S的改變就是對(duì)sb的操作,也就是說sb應(yīng)該也指向新 創(chuàng)建的對(duì)象,那么輸出的結(jié)果應(yīng)該為ha world.但實(shí)際上輸 出的僅是hello.這說明sb指向的還是原來(lái)的對(duì)象,而形參s 指向的才是創(chuàng)建的對(duì)象,這也就驗(yàn)證了 java中的對(duì)象傳遞也 是值傳遞。8 ,接口和抽象類的區(qū)別是什么?不同點(diǎn)在于:接口中所有的方法隱含的都是抽象的。而抽象類則可以 同時(shí)包含抽象和非抽象的方法。類可以實(shí)現(xiàn)很多個(gè)接口,但是只能繼承一個(gè)抽象類類如果要實(shí)現(xiàn)一個(gè)接口,它必須要實(shí)現(xiàn)接口聲明的

11、所有方法。但是,類可以不實(shí)現(xiàn)抽象類聲明的所有方法,當(dāng)然, 在這種情況下,類也必須得聲明成是抽象的。抽象類可以在不提供接口方法實(shí)現(xiàn)的情況下實(shí)現(xiàn)接口。Java接口中聲明的變量默認(rèn)都是final的。抽象類可以 包含非final的變量。Java接口中的成員函數(shù)默認(rèn)是public的。抽象類的成 員函數(shù)可以是private, protected或者是public。接口是絕對(duì)抽象的,不可以被實(shí)例化(java 8已支持在接 口中實(shí)現(xiàn)默認(rèn)的方法)。抽象類也不可以被實(shí)例化,但是,如 果它包含main方法的話是可以被調(diào)用的。9 .構(gòu)造器(constructor)是否可被重寫(override)?構(gòu)造方法是不能被子類

12、重寫的,但是構(gòu)造方法可以重 載,也就是說一個(gè)類可以有多個(gè)構(gòu)造方法。10 .Math.round(11.5)等于多少? Math.round(-11.5)f 于多少?Math.round(11.5)= = 12 Math.round(-11.5)= = -11 round方法返回與參數(shù) 最接近的長(zhǎng)整數(shù),參數(shù)加1/2后求 其 floor.11 . String, StringBuffer StringBuilder 的區(qū)別。tring的長(zhǎng)度是不可變的;StringBuffer的長(zhǎng)度是可變的,如果你對(duì)字符串中的內(nèi) 容經(jīng)常進(jìn)行操作,特別是內(nèi)容要修改時(shí),那么使用 StringBuffer,如果最后需要&

13、gt;String,那么使用 StringBuffer 的 toStringO 方法;線程安全;StringBuilder 是從 JDK 5 開始,為 StringBuffer 該類 補(bǔ)充了一個(gè)單個(gè)線程使用的等價(jià)類;通常應(yīng)該優(yōu)先使用 StringBuilder類,因>為它支持所有相同的操作,但由 于它不執(zhí)行同步,所以速度更快。使用字符串的時(shí)候要特別小心,如果對(duì)一個(gè)字符串要經(jīng) 常改變的話,就一定不要用String,否則會(huì)創(chuàng)建許多無(wú)用的對(duì) 象出來(lái).來(lái)看一下比較String s = hello,+world+Hi love you1;StringBuffer Sb = newStringBui

14、lder(nhello).append(world).append(i love you);這個(gè)時(shí)候s有多個(gè)字符串進(jìn)行拼接,按理來(lái)說會(huì)有多個(gè) 對(duì)象產(chǎn)生,但是jvm會(huì)對(duì)此進(jìn)行一個(gè)優(yōu)化,也就是說只創(chuàng)建 了一個(gè)對(duì)象,此時(shí)它的執(zhí)行速度要比StringBuffer拼接快. 再看下面這個(gè):String s2 = hello;String s3 = world;String s4 = Hi love you;String si = s2 + s3 + s4;上面這種情況,就會(huì)多創(chuàng)建出來(lái)三個(gè)對(duì)象,造成了內(nèi)存 空間的浪費(fèi).12JVM內(nèi)存分哪幾個(gè)區(qū),每個(gè)區(qū)的作用是什么?java虛擬機(jī)主要分為以下一個(gè)區(qū):方法區(qū):有

15、時(shí)候也成為永久代,在該區(qū)內(nèi)很少發(fā)生垃圾回收,但 是并不代表不發(fā)生GC,在這里進(jìn)行的GC主要是對(duì)方法區(qū)里 的常量池和對(duì)類型的卸載方法區(qū)主要用來(lái)存儲(chǔ)已被虛擬機(jī)加載的類的信息、常 量、靜態(tài)變量和即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。該區(qū)域是被線程共享的。方法區(qū)里有一個(gè)運(yùn)行時(shí)常量池,用于存放靜態(tài)編譯產(chǎn)生 的字面量和符號(hào)引用。該常量池具有動(dòng)態(tài)性,也就是說常量 并不一定是編譯時(shí)確定,運(yùn)行時(shí)生成的常量也會(huì)存在這個(gè)常 量池中。虛擬機(jī)棧:虛擬機(jī)棧也就是我們平常所稱的棧內(nèi)存,它為java方法 服務(wù),每個(gè)方法在執(zhí)行的時(shí)候都會(huì)創(chuàng)建一個(gè)棧幀,用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接和方法出口等信息。虛擬機(jī)棧是線程私有的,它的生命

16、周期與線程相同。局部變量表里存儲(chǔ)的是基本數(shù)據(jù)類型、ret urn Address類型(指向一條字節(jié)碼指令的地址)和對(duì)象引用,這個(gè)對(duì)象引 用有可能是指向?qū)ο笃鹗嫉刂返囊粋€(gè)指針,也有可能是代表 對(duì)象的句柄或者與對(duì)象相關(guān)聯(lián)的位置。局部變量所需的內(nèi)存 空間在編譯器間確定4 .操作數(shù)棧的作用主要用來(lái)存儲(chǔ)運(yùn)算結(jié)果以及運(yùn)算的操 作數(shù),它不同于局部變量表通過索引來(lái)訪問,而是壓棧和出 棧的方式5 .每個(gè)棧幀都包含一個(gè)指向運(yùn)行時(shí)常量池中該棧幀所屬 方法的引用,持有這個(gè)引用是為了支持方法調(diào)用過程中的動(dòng) 態(tài)連接.動(dòng)態(tài)鏈接就是將常量池中的符號(hào)引用在運(yùn)行期轉(zhuǎn)化為直接引用。本地方法棧本地方法棧和虛擬機(jī)棧類似,只不過本地方法

17、棧為 Native方法服務(wù)。java堆是所有線程所共享的一塊內(nèi)存,在虛擬機(jī)啟動(dòng)時(shí) 創(chuàng)建,幾乎所有的對(duì)象實(shí)例都在這里創(chuàng)建,因此該區(qū)域經(jīng)常 發(fā)生垃圾回收操作。程序計(jì)數(shù)器內(nèi)存空間小,字節(jié)碼解釋器工作時(shí)通過改變這個(gè)計(jì)數(shù)值 可以選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、 異常處理和線程恢復(fù)等功能都需要依賴這個(gè)計(jì)數(shù)器完成。該 內(nèi)存區(qū)域是唯一一個(gè)java虛擬機(jī)規(guī)范沒有規(guī)定任何OOM情 況的區(qū)域。13.如和判斷一個(gè)對(duì)象是否存活?(或者GC對(duì)象的判定方法)判斷一個(gè)對(duì)象是否存活有兩種方法:引用計(jì)數(shù)法所謂引用計(jì)數(shù)法就是給每一個(gè)對(duì)象設(shè)置一個(gè)引用計(jì)數(shù) 器,每當(dāng)有一個(gè)地方引用這個(gè)對(duì)象時(shí),就將計(jì)數(shù)器加一,引 用失效

18、時(shí),計(jì)數(shù)器就減一。當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)器為零時(shí), 說明此對(duì)象沒有被引用,也就是“死對(duì)象”,將會(huì)被垃圾回收.引用計(jì)數(shù)法有一個(gè)缺陷就是無(wú)法解決循環(huán)引用問題,也 就是說當(dāng)對(duì)象A引用對(duì)象B,對(duì)象B又引用者對(duì)象A,那么 此時(shí)A,B對(duì)象的引用計(jì)數(shù)器都不為零,也就造成無(wú)法完成垃 圾回收,所以主流的虛擬機(jī)都沒有采用這種算法。2 .可達(dá)性算法(引用鏈法)該算法的思想是:從一個(gè)被稱為GC Roots的對(duì)象開始向下搜索,如果一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連 時(shí),則說明此對(duì)象不可用。在java中可以作為GC Roots的對(duì)象有以下幾種:虛擬機(jī)棧中引用的對(duì)象方法區(qū)類靜態(tài)屬性引用的對(duì)象方法區(qū)常量池引用的對(duì)象本

19、地方法棧JNI引用的對(duì)象雖然這些算法可以判定一個(gè)對(duì)象是否能被回收,但是當(dāng) 滿足上述條件時(shí),一個(gè)對(duì)象比不一定會(huì)被回收。當(dāng)一個(gè)對(duì)象不可達(dá)GC Root時(shí),這個(gè)對(duì)象并不會(huì)立馬被回收,而是出于一個(gè)死緩的階段,若要被真 正的回收需要經(jīng)歷兩次標(biāo)記如果對(duì)象在可達(dá)性分析中沒有與GC Root的引用鏈,那 么此時(shí)就會(huì)被第一次標(biāo)記并且進(jìn)行一次篩選,篩選的條件是 是否有必要執(zhí)行finalize。方法。當(dāng)對(duì)象沒有覆蓋finalize。 方法或者已被虛擬機(jī)調(diào)用過,那么就認(rèn)為是沒必要的。如果該對(duì)象有必要執(zhí)行finalize。方法,那么這個(gè)對(duì)象將 會(huì)放在一個(gè)稱為FQueue的對(duì)隊(duì)列中,虛擬機(jī)會(huì)觸發(fā)一個(gè)Finalize。線程

20、去執(zhí)行,此線程是低優(yōu)先級(jí)的,并且虛擬機(jī)不 會(huì)承諾一直等待它運(yùn)行完,這是因?yàn)槿绻鹒inalize。執(zhí)行緩慢 或者發(fā)生了死鎖,那么就會(huì)造成FQueue隊(duì)列一直等待, 造成了內(nèi)存回收系統(tǒng)的崩潰。GC對(duì)處于FQueue中的對(duì)象 進(jìn)行第二次被標(biāo)記,這時(shí),該對(duì)象將被移除“即將回收”集合, 等待回收。14 .簡(jiǎn)述java垃圾回收機(jī)制?在java中,程序員是不需要顯示的去釋放一個(gè)對(duì)象的內(nèi) 存的,而是由虛擬機(jī)自行執(zhí)行。在JVM中,有一個(gè)垃圾回 收線程,它是低優(yōu)先級(jí)的,在正常情況下是不會(huì)執(zhí)行的,只 有在虛擬機(jī)空閑或者當(dāng)前堆內(nèi)存不足時(shí),才會(huì)觸發(fā)執(zhí)行,掃 面那些沒有被任何引用的對(duì)象,并將它們添加到要回收的集 合中,進(jìn)行回收。15 .java中垃圾收集的方法有哪些?標(biāo)記清除:這是垃圾收集算法中最基礎(chǔ)的,根據(jù)名字就可以知道, 它的思想就是標(biāo)記哪些要被回收的對(duì)象,然后統(tǒng)一回收。這 種方法很簡(jiǎn)單,但是會(huì)有兩個(gè)主要問題:L效率不

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論