1.finally語句塊什么情況不會執(zhí)行
四種情況:
? ? (1)finally語句塊第一行出現(xiàn)異常
? ? (2)程序拋出異常(或者return)之前经窖,調(diào)用system.exits()揣云,退出程序
? ? (3)程序拋出異常(或者return)之前,線程死亡
? ? (4)程序拋出異常(或者return)之前,關(guān)閉CPU
2.java有了基本類型,為什么還要設(shè)計(jì)對應(yīng)的引用類型
? ? (1)可以使用為該引用類型而編寫的方法
? ? (2)Java集合(map、set柱锹、list)等所有集合只能存放引用類型數(shù)據(jù)哪自,不能存放基本類型數(shù)據(jù)(容器中實(shí)際存放的是對象的引用)丰包。
? ? (3)引用類型對象存儲在堆上,可以控制其生命周期壤巷;而基本類型存儲在棧上邑彪,會隨著代碼塊運(yùn)行結(jié)束被回收。
? ? (4)java泛型使用類型擦除法實(shí)現(xiàn)胧华,基本類型無法實(shí)現(xiàn)泛型寄症。
3.怎么理解多態(tài)(多態(tài)的好處)
是什么:多態(tài)是引用變量指向的實(shí)例對象在程序運(yùn)行期才確定;
好處:1.提高的代碼的可維護(hù)性(即可以通過改寫父類屬性與方法來改寫子類共有屬性與方法)
? ? ? ? ? ?2.提高了代碼的可擴(kuò)展性(即子類方法可以被父類的引用變量調(diào)用)
怎么實(shí)現(xiàn):繼承父類矩动、實(shí)現(xiàn)接口
4.什么是反射有巧?
(1)反射是可以在運(yùn)行時得到某個類的完整信息;
(2)獲取類的信息首先要得到該類對應(yīng)的Class對象悲没,拿到Class對象的方式如下篮迎;
(3)拿到class對象后,就可以調(diào)用class對象的成員方法示姿,得到類的信息甜橱,如 getMethod、getField栈戳,getConstructor岂傲,newInstance
(4)反射的原理:
(5)反射的應(yīng)用:
5.自動拆裝箱
什么時候發(fā)生、具體怎么實(shí)現(xiàn)
自動拆箱:當(dāng)基礎(chǔ)類型與引用類型進(jìn)行 “==子檀、+镊掖、-乃戈、×、÷” 運(yùn)算時堰乔,會對引用類型進(jìn)行自動拆箱偏化;
????具體實(shí)現(xiàn),引用類型對象內(nèi)部包含對應(yīng)基本類型的成員變量镐侯,自動拆箱時返回該成員變量即可侦讨;
自動裝箱:使用基礎(chǔ)類型給引用類型變量賦值
? ? 具體實(shí)現(xiàn):調(diào)用引用類型對應(yīng)的靜態(tài)方法valueOf,本質(zhì)是在該方法內(nèi)部調(diào)用構(gòu)造函數(shù)創(chuàng)建對象苟翻。
6.java泛型相關(guān)問題
(1)是什么:泛型就是將類型參數(shù)化韵卤,在編譯時才確定具體的參數(shù)。這種參數(shù)類型可以用在類崇猫、接口和方法的創(chuàng)建中沈条,分別稱為泛型類、泛型接口诅炉、泛型方法蜡歹。
(2)為什么(好處):為了創(chuàng)建容器類,可以實(shí)現(xiàn)類型安全且消除了很多的強(qiáng)制類型轉(zhuǎn)換涕烧;
(3)原理:??泛型只存在于編譯階段月而,不存在與運(yùn)行階段(編譯后的class文件不存在泛型的概念)
? ? 編譯時,使用Object代替泛型參數(shù)T议纯,如果使用T extends XXX 或者 T super XXX父款,則使用XXX代替泛型參數(shù)T
7.序列化反序列化相關(guān)問題
(1)是什么:序列化是將對象轉(zhuǎn)換為字節(jié)序列,以便在網(wǎng)絡(luò)中傳輸或保存在本地瞻凤;
? ? ? ? ? ? ? ? ? ? ? 反序列化是把字節(jié)序列轉(zhuǎn)換為對象憨攒。(通過讀取字節(jié)流中對象的屬性,創(chuàng)建出一個有著同樣屬性的? ? 對象)
(2)為什么:需要對內(nèi)存中的對象進(jìn)行持久化或者網(wǎng)絡(luò)傳輸阀参。序列化反序列化還可以用于深拷貝(因?yàn)樾蛄谢梢詫⒄麄€對象層次寫入字節(jié)流中)
(3)怎么實(shí)現(xiàn):實(shí)現(xiàn)Serializable接口或者Externalizable接口肝集。
(4)serialVersionUID:用來表明類不同版本之間的兼容性
理解:JVM會在序列化的時候,自動創(chuàng)建一個serialVersionUID字段蛛壳,一起序列化成字節(jié)流杏瞻,如果在類中顯示指定了該字段并賦值,則序列化的值會用顯示指定的炕吸;在反序列化的時候伐憾,JVM也會創(chuàng)建一個serialVersionUID(根據(jù)反序列化這邊所在的程序,和字節(jié)流無關(guān))赫模,如果反序列化這邊的類同樣指定了serialVersionUID字段树肃,則JVM創(chuàng)建的serialVersionUID的值就是顯示指定的。在反序列化的時候瀑罗,JVM會比較創(chuàng)建的serialVersionUID值和字節(jié)流中的serialVersionUID值是否一致胸嘴,一致則可以反序列化雏掠,不一致會異常。
? ? 如果不顯示指定劣像,則不能保證序列化和反序列化兩邊JVM創(chuàng)建的serialVersionUID值相等乡话。
(5)對于不想序列化的字段,使用 transient 關(guān)鍵字修飾耳奕,該字段在被反序列化的時候绑青,會被設(shè)置為零值。
(6)序列化和反序列化是針對對象的屋群,靜態(tài)字段不會被序列化(也不需要被序列化)
8.java異常相關(guān)問題
(1)是什么:?Throwable派生出Error闸婴、Exception。Exception又分為運(yùn)行時異常和非運(yùn)行時異常芍躏。
error:程序無法處理的嚴(yán)重錯誤 邪乍,不能通過?catch?來進(jìn)行捕獲,通常會導(dǎo)致程序終止对竣。例如系統(tǒng)崩潰庇楞、內(nèi)存不足;
exception:程序可以處理的異常否纬,需要對其進(jìn)行處理 ;
其中非運(yùn)行時異常必須對其進(jìn)行處理吕晌,運(yùn)行時異常可以由程序員自己決定(因?yàn)檫\(yùn)行時異常中有很多是代碼本身寫錯了,需要的不是處理異常烦味,而是修改代碼聂使,如空指針異常壁拉、數(shù)據(jù)訪問越界異常)谬俄。
(2)java常見異常:
java.lang.InstantiationError:實(shí)例化錯誤。當(dāng)一個應(yīng)用試圖通過new操作符構(gòu)造一個抽象類或者接口時拋出該異常.
java.lang.OutOfMemoryError:內(nèi)存不足錯誤弃理。當(dāng)可用內(nèi)存不足以讓Java虛擬機(jī)分配給一個對象時拋出該錯誤溃论。
java.lang.StackOverflowError:堆棧溢出錯誤。當(dāng)一個應(yīng)用遞歸調(diào)用的層次太深而導(dǎo)致堆棧溢出或者陷入死循環(huán)時拋出該錯誤痘昌。
java.lang.IndexOutOfBoundsException:索引越界異常钥勋。當(dāng)訪問某個序列的索引值小于0或大于等于序列大小時,拋出該異常辆苔。
java.lang.NullPointerException:空指針異常算灸。
java.lang.ArithmeticException:算術(shù)條件異常。譬如:整數(shù)除零等驻啤。
9.java IO流相關(guān)問題
(1)IO流分類:
按流向:輸入流菲驴、輸出流
按操作的數(shù)據(jù)單元:字節(jié)流、字符流
按流的角色:節(jié)點(diǎn)流骑冗、處理流
(2)字節(jié)流和字符流區(qū)別