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

下載本文檔

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

文檔簡介

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

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

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

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

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

6、繼承一個父 類。java中實現(xiàn)多繼承有兩種方式,一是接口,而是內(nèi)部類.實現(xiàn)多個接口如果兩個接口的變量相同那么在調(diào)用 該變量的時候編譯出錯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)用的時候,實參是將自己的一份 拷貝賦給形參,在方法內(nèi),對該參數(shù)值的修改不影響原來實 參,常見的例子就是剛開始學習c語言的時候那個交換方法 的例子了。引用傳遞是在方法調(diào)用的時候,實參將自己的地址傳 遞給形參,此時方法內(nèi)對該參數(shù)值的改變,就是對該實參的 實際操作。在java中只有一種傳遞方式,那就是值傳遞.可能比較 讓人迷惑的就是java中的對象傳遞時,對形參的改變依然會 影響到該對象的內(nè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);)在上面這個例子中,當前輸出結果為:hello world。這并沒有什么問題,可能就是大家平常所理解的引用傳遞,那么 當然會改變StringBuffer的內(nèi)容。但是如果把上面的注釋去 掉,那么就會輸出:hello.此時sb的值并沒有變成ha hello.假 如說是引用傳遞的話,那么形參的s也就

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

  • 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

提交評論