本帖最后由 黑馬與你同在 于 2017-8-10 14:13 編輯
JAVA覺(jué)面試題整理之—基礎(chǔ)篇第一部
1喂链、面向?qū)ο蟮奶卣饔心男┓矫妫?/b>
抽象:抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面硼补,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面滥沫。抽象并不打算了解全部問(wèn)題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。抽象包括兩個(gè)方面,一是過(guò)程抽象沮趣,二是數(shù)據(jù)抽象。
繼承:繼承是一種聯(lián)結(jié)類的層次模型坷随,并且允許和鼓勵(lì)類的重用房铭,它提供了一種明確表述共性的方法。對(duì)象的一個(gè)新類可以從現(xiàn)有的類中派生温眉,這個(gè)過(guò)程稱為類繼承缸匪。新類繼承了原始類的特性,新類稱為原始類的派生類(子類)类溢,而原始類稱為新類的基類(父類)凌蔬。派生類可以從它的基類那里繼承方法和實(shí)例變量,并且類可以修改或增加新的方法使之更適合特殊的需要闯冷。
封裝:封裝是把過(guò)程和數(shù)據(jù)包圍起來(lái)砂心,對(duì)數(shù)據(jù)的訪問(wèn)只能通過(guò)已定義的界面。面向?qū)ο笥?jì)算始于這個(gè)基本概念蛇耀,即現(xiàn)實(shí)世界可以被描繪成一系列完全自治辩诞、封裝的對(duì)象,這些對(duì)象通過(guò)一個(gè)受保護(hù)的接口訪問(wèn)其他對(duì)象纺涤。
多態(tài)性:多態(tài)性是指允許不同類的對(duì)象對(duì)同一消息作出響應(yīng)译暂。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語(yǔ)言具有靈活撩炊、抽象外永、行為共享、代碼共享的優(yōu)勢(shì)拧咳,很好的解決了應(yīng)用程序函數(shù)同名問(wèn)題象迎。
2、訪問(wèn)修飾符public,private,protected,以及不寫(默認(rèn))時(shí)的區(qū)別呛踊?
答:
[td]
3砾淌、String 是最基本的數(shù)據(jù)類型嗎?
答:不是谭网。Java中的基本數(shù)據(jù)類型只有8個(gè):byte汪厨、short、int愉择、long劫乱、float、double锥涕、char衷戈、boolean;除了基本類型(primitive type)和枚舉類型(enumeration type)层坠,剩下的都是引用類型(reference type)殖妇。
4、float f=3.4;是否正確破花?
答:不正確谦趣。3.4f
5、short s1 = 1;s1 = s1 + 1;有錯(cuò)嗎?short s1 = 1; s1 += 1;有錯(cuò)嗎座每?
答:對(duì)于short s1 = 1; s1 = s1 + 1;由于1是int類型前鹅,因此s1+1運(yùn)算結(jié)果也是int型,需要強(qiáng)制轉(zhuǎn)換類型才能賦值給short型峭梳。而short s1= 1; s1 += 1;可以正確編譯舰绘,因?yàn)閟1+= 1;相當(dāng)于s1 = (short)(s1 + 1);其中有隱含的強(qiáng)制類型轉(zhuǎn)換。
6葱椭、int和Integer有什么區(qū)別捂寿?答:Java是一個(gè)近乎純潔的面向?qū)ο缶幊陶Z(yǔ)言,但是為了編程的方便還是引入了基本數(shù)據(jù)類型挫以,但是為了能夠?qū)⑦@些基本數(shù)據(jù)類型當(dāng)成對(duì)象操作者蠕,Java為每一個(gè)基本數(shù)據(jù)類型都引入了對(duì)應(yīng)的包裝類型(wrapper class),int的包裝類就是Integer掐松,從Java5開(kāi)始引入了自動(dòng)裝箱/拆箱機(jī)制踱侣,使得二者可以相互轉(zhuǎn)換。
Java 為每個(gè)原始類型提供了包裝類型:
- 原始類型: boolean大磺,char抡句,byte,short杠愧,int待榔,long,float,double
- 包裝類型:Boolean锐锣,Character腌闯,Byte,Short雕憔,Integer姿骏,Long,F(xiàn)loat斤彼,Double
7分瘦、&和&&的區(qū)別?答:&運(yùn)算符有兩種用法:(1)按位與琉苇;(2)邏輯與嘲玫。&&運(yùn)算符是短路與運(yùn)算。邏輯與跟短路與的差別是非常巨大的并扇,雖然二者都要求運(yùn)算符左右兩端的布爾值都是true整個(gè)表達(dá)式的值才是true去团。&&之所以稱為短路運(yùn)算是因?yàn)椋绻?amp;&左邊的表達(dá)式的值是false拜马,右邊的表達(dá)式會(huì)被直接短路掉渗勘,不會(huì)進(jìn)行運(yùn)算。很多時(shí)候我們可能都需要用&&而不是&俩莽,例如在驗(yàn)證用戶登錄時(shí)判定用戶名不是null而且不是空字符串旺坠,應(yīng)當(dāng)寫為:username != null&&!username.equals(“”),二者的順序不能交換扮超,更不能用&運(yùn)算符取刃,因?yàn)榈谝粋€(gè)條件如果不成立,根本不能進(jìn)行字符串的equals比較出刷,否則會(huì)產(chǎn)生NullPointerException異常璧疗。注意:邏輯或運(yùn)算符(|)和短路或運(yùn)算符(||)的差別也是如此。
8馁龟、構(gòu)造器(constructor)是否可被重寫(override)崩侠?答:構(gòu)造器不能被繼承,因此不能被重寫坷檩,但可以被重載却音。
9、兩個(gè)對(duì)象值相同(x.equals(y) == true)矢炼,但卻可有不同的hash code系瓢,這句話對(duì)不對(duì)?答:不對(duì)句灌,如果兩個(gè)對(duì)象x和y滿足x.equals(y) ==true夷陋,它們的哈希碼(hash code)應(yīng)當(dāng)相同。Java對(duì)于eqauls方法和hashCode方法是這樣規(guī)定的:(1)如果兩個(gè)對(duì)象相同(equals方法返回true),那么它們的hashCode值一定要相同骗绕;(2)如果兩個(gè)對(duì)象的hashCode相同藐窄,它們并不一定相同。當(dāng)然爹谭,你未必要按照要求去做枷邪,但是如果你違背了上述原則就會(huì)發(fā)現(xiàn)在使用容器時(shí),相同的對(duì)象可以出現(xiàn)在Set集合中诺凡,同時(shí)增加新元素的效率會(huì)大大下降(對(duì)于使用哈希存儲(chǔ)的系統(tǒng),如果哈希碼頻繁的沖突將會(huì)造成存取性能急劇下降)践惑。
10腹泌、String和StringBuilder、StringBuffer的區(qū)別尔觉?答:Java平臺(tái)提供了兩種類型的字符串:String和StringBuffer/StringBuilder凉袱,它們可以儲(chǔ)存和操作字符串。其中String是只讀字符串侦铜,也就意味著String引用的字符串內(nèi)容是不能被改變的专甩。而StringBuffer/StringBuilder類表示的字符串對(duì)象可以直接進(jìn)行修改。StringBuilder是Java 5中引入的钉稍,它和StringBuffer的方法完全相同涤躲,區(qū)別在于它是在單線程環(huán)境下使用的,因?yàn)樗乃蟹矫娑紱](méi)有被synchronized修飾贡未,因此它的效率也比StringBuffer要高种樱。
11、重載(Overload)和重寫(Override)的區(qū)別俊卤。重載的方法能否根據(jù)返回類型進(jìn)行區(qū)分嫩挤?答:方法的重載和重寫都是實(shí)現(xiàn)多態(tài)的方式,區(qū)別在于前者實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性消恍,而后者實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性岂昭。重載發(fā)生在一個(gè)類中,同名的方法如果有不同的參數(shù)列表(參數(shù)類型不同狠怨、參數(shù)個(gè)數(shù)不同或者二者都不同)則視為重載约啊;重寫發(fā)生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回類型取董,比父類被重寫方法更好訪問(wèn)棍苹,不能比父類被重寫方法聲明更多的異常(里氏代換原則)。重載對(duì)返回類型沒(méi)有特殊的要求茵汰。
12枢里、描述一下JVM加載class文件的原理機(jī)制?答:JVM中類的裝載是由類加載器(ClassLoader)和它的子類來(lái)實(shí)現(xiàn)的,Java中的類加載器是一個(gè)重要的Java運(yùn)行時(shí)系統(tǒng)組件栏豺,它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類文件中的類彬碱。
13、char 型變量中能不能存貯一個(gè)中文漢字奥洼,為什么巷疼?答:char類型可以存儲(chǔ)一個(gè)中文漢字,因?yàn)镴ava中使用的編碼是Unicode(不選擇任何特定的編碼灵奖,直接使用字符在字符集中的編號(hào)嚼沿,這是統(tǒng)一的唯一方法),一個(gè)char類型占2個(gè)字節(jié)(16比特)瓷患,所以放一個(gè)中文是沒(méi)問(wèn)題的骡尽。
14、抽象類(abstract class)和接口(interface)有什么異同擅编?答:抽象類和接口都不能夠?qū)嵗氏福梢远x抽象類和接口類型的引用。一個(gè)類如果繼承了某個(gè)抽象類或者實(shí)現(xiàn)了某個(gè)接口都需要對(duì)其中的抽象方法全部進(jìn)行實(shí)現(xiàn)爱态,否則該類仍然需要被聲明為抽象類谭贪。接口比抽象類更加抽象,因?yàn)槌橄箢愔锌梢远x構(gòu)造器锦担,可以有抽象方法和具體方法俭识,而接口中不能定義構(gòu)造器而且其中的方法全部都是抽象方法。抽象類中的成員可以是private吆豹、默認(rèn)鱼的、protected、public的痘煤,而接口中的成員全都是public的凑阶。抽象類中可以定義成員變量,而接口中定義的成員變量實(shí)際上都是常量蘸拔。有抽象方法的類必須被聲明為抽象類师郑,而抽象類未必要有抽象方法。
15调窍、Java 中會(huì)存在內(nèi)存泄漏嗎宝冕,請(qǐng)簡(jiǎn)單描述。答:理論上Java因?yàn)橛欣厥諜C(jī)制(GC)不會(huì)存在內(nèi)存泄露問(wèn)題(這也是Java被廣泛使用于服務(wù)器端編程的一個(gè)重要原因)菊卷;然而在實(shí)際開(kāi)發(fā)中,可能會(huì)存在無(wú)用但可達(dá)的對(duì)象宝剖,這些對(duì)象不能被GC回收扑眉,因此也會(huì)導(dǎo)致內(nèi)存泄露的發(fā)生。例如hibernate的Session(一級(jí)緩存)中的對(duì)象屬于持久態(tài)赖钞,垃圾回收器是不會(huì)回收這些對(duì)象的腰素,然而這些對(duì)象中可能存在無(wú)用的垃圾對(duì)象避矢,如果不及時(shí)關(guān)閉(close)或清空(flush)一級(jí)緩存就可能導(dǎo)致內(nèi)存泄露搔驼。下面例子中的代碼也會(huì)導(dǎo)致內(nèi)存泄露。
16秒咨、闡述靜態(tài)變量和實(shí)例變量的區(qū)別卓缰。答:靜態(tài)變量是被static修飾符修飾的變量,也稱為類變量砰诵,它屬于類征唬,不屬于類的任何一個(gè)對(duì)象,一個(gè)類不管創(chuàng)建多少個(gè)對(duì)象茁彭,靜態(tài)變量在內(nèi)存中有且僅有一個(gè)拷貝总寒;實(shí)例變量必須依存于某一實(shí)例,需要先創(chuàng)建對(duì)象然后通過(guò)對(duì)象才能訪問(wèn)到它理肺。靜態(tài)變量可以實(shí)現(xiàn)讓多個(gè)對(duì)象共享內(nèi)存摄闸。
17、是否可以從一個(gè)靜態(tài)(static)方法內(nèi)部發(fā)出對(duì)非靜態(tài)(non-static)方法的調(diào)用妹萨?答:不可以年枕,靜態(tài)方法只能訪問(wèn)靜態(tài)成員,因?yàn)榉庆o態(tài)方法的調(diào)用要先創(chuàng)建對(duì)象乎完,在調(diào)用靜態(tài)方法時(shí)可能對(duì)象并沒(méi)有被初始化熏兄。
18、GC是什么树姨?為什么要有GC摩桶?
答:GC是垃圾收集的意思,內(nèi)存處理是編程人員容易出現(xiàn)問(wèn)題的地方帽揪,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰硝清,Java提供的GC功能可以自動(dòng)監(jiān)測(cè)對(duì)象是否超過(guò)作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語(yǔ)言沒(méi)有提供釋放已分配內(nèi)存的顯示操作方法转晰。Java程序員不用擔(dān)心內(nèi)存管理芦拿,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理士飒。要請(qǐng)求垃圾收集,可以調(diào)用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() 防嗡,但JVM可以屏蔽掉顯示的垃圾回收調(diào)用变汪。
垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存蚁趁。垃圾回收器通常是作為一個(gè)單獨(dú)的低優(yōu)先級(jí)的線程運(yùn)行裙盾,不可預(yù)知的情況下對(duì)內(nèi)存堆中已經(jīng)死亡的或者長(zhǎng)時(shí)間沒(méi)有使用的對(duì)象進(jìn)行清除和回收,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對(duì)某個(gè)對(duì)象或所有對(duì)象進(jìn)行垃圾回收他嫡。在Java誕生初期番官,垃圾回收是Java最大的亮點(diǎn)之一,因?yàn)榉?wù)器端的編程需要有效的防止內(nèi)存泄露問(wèn)題钢属,然而時(shí)過(guò)境遷徘熔,如今Java的垃圾回收機(jī)制已經(jīng)成為被詬病的東西。移動(dòng)智能終端用戶通常覺(jué)得iOS的系統(tǒng)比Android系統(tǒng)有更好的用戶體驗(yàn)淆党,其中一個(gè)深層次的原因就在于Android系統(tǒng)中垃圾回收的不可預(yù)知性酷师。
補(bǔ)充:垃圾回收機(jī)制有很多種,包括:分代復(fù)制垃圾回收染乌、標(biāo)記垃圾回收山孔、增量垃圾回收等方式。標(biāo)準(zhǔn)的Java進(jìn)程既有棧又有堆荷憋。棧保存了原始型局部變量台颠,堆保存了要?jiǎng)?chuàng)建的對(duì)象。Java平臺(tái)對(duì)堆內(nèi)存回收和再利用的基本算法被稱為標(biāo)記和清除勒庄,但是Java對(duì)其進(jìn)行了改進(jìn)串前,采用“分代式垃圾收集”。這種方法會(huì)跟Java對(duì)象的生命周期將堆內(nèi)存劃分為不同的區(qū)域实蔽,在垃圾收集過(guò)程中荡碾,可能會(huì)將對(duì)象移動(dòng)到不同區(qū)域:
-
伊甸園(Eden):這是對(duì)象最初誕生的區(qū)域,并且對(duì)大多數(shù)對(duì)象來(lái)說(shuō)盐须,這里是它們唯一存在過(guò)的區(qū)域玩荠。
-
幸存者樂(lè)園(Survivor):從伊甸園幸存下來(lái)的對(duì)象會(huì)被挪到這里。
-
終身頤養(yǎng)園(Tenured):這是足夠老的幸存對(duì)象的歸宿贼邓。年輕代收集(Minor-GC)過(guò)程是不會(huì)觸及這個(gè)地方的阶冈。當(dāng)年輕代收集不能把對(duì)象放進(jìn)終身頤養(yǎng)園時(shí),就會(huì)觸發(fā)一次完全收集(Major-GC)塑径,這里可能還會(huì)牽扯到壓縮女坑,以便為大對(duì)象騰出足夠的空間。
19统舀、String s = new String(“xyz”);創(chuàng)建了幾個(gè)字符串對(duì)象匆骗?答:兩個(gè)對(duì)象劳景,一個(gè)是靜態(tài)區(qū)的”xyz”,一個(gè)是用new創(chuàng)建在堆上的對(duì)象碉就。
20盟广、接口是否可繼承(extends)接口?抽象類是否可實(shí)現(xiàn)(implements)接口瓮钥?抽象類是否可繼承具體類(concrete class)筋量?答:接口可以繼承接口,而且支持多重繼承碉熄。抽象類可以實(shí)現(xiàn)(implements)接口桨武,抽象類可繼承具體類也可以繼承抽象類。
21锈津、一個(gè)”.java”源文件中是否可以包含多個(gè)類(不是內(nèi)部類)呀酸?有什么限制?答:可以琼梆,但一個(gè)源文件中最多只能有一個(gè)公開(kāi)類(public class)而且文件名必須和公開(kāi)類的類名完全保持一致性誉。
22、Java 中的final關(guān)鍵字有哪些用法茎杂?答:(1)修飾類:表示該類不能被繼承艾栋;(2)修飾方法:表示方法不能被重寫;(3)修飾變量:表示變量只能一次賦值以后值不能被修改(常量)蛉顽。
23、Error和Exception有什么區(qū)別先较?答:Error表示系統(tǒng)級(jí)的錯(cuò)誤和程序不必處理的異常携冤,是恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問(wèn)題;比如內(nèi)存溢出闲勺,不可能指望程序能處理這樣的情況曾棕;Exception表示需要捕捉或者需要程序進(jìn)行處理的異常,是一種設(shè)計(jì)或?qū)崿F(xiàn)問(wèn)題菜循;也就是說(shuō)翘地,它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況癌幕。
24衙耕、try{}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally{}里的代碼會(huì)不會(huì)被執(zhí)行勺远,什么時(shí)候被執(zhí)行橙喘,在return前還是后?答:會(huì)執(zhí)行,在方法返回調(diào)用者前執(zhí)行胶逢。