互聯(lián)網(wǎng) Java 工程師面試題(Java 面試題七)

關(guān)于 OOP 和設(shè)計(jì)模式的面試題

這部分包含 Java 面試過程中關(guān)于 SOLID 的設(shè)計(jì)原則,OOP 基礎(chǔ),如類,對象, 接口,繼承,多態(tài),封裝,抽象以及更高級的一些概念,如組合、聚合及關(guān)聯(lián)。 也包含了 GOF 設(shè)計(jì)模式的問題。

103、接口是什么?為什么要使用接口而不是直接使用具體類?

接口用于定義 API。它定義了類必須得遵循的規(guī)則。同時(shí),它提供了一種抽象, 因?yàn)榭蛻舳酥皇褂媒涌?,這樣可以有多重實(shí)現(xiàn),如 List 接口,你可以使用可隨機(jī) 訪問的 ArrayList,也可以使用方便插入和刪除的 LinkedList。接口中不允許寫 代碼,以此來保證抽象,但是 Java 8 中你可以在接口聲明靜態(tài)的默認(rèn)方法,這 種方法是具體的。

104、Java 中,抽象類與接口之間有什么不同?

Java 中,抽象類和接口有很多不同之處,但是最重要的一個(gè)是 Java 中限制一個(gè) 類只能繼承一個(gè)類,但是可以實(shí)現(xiàn)多個(gè)接口。抽象類可以很好的定義一個(gè)家族類 的默認(rèn)行為,而接口能更好的定義類型,有助于后面實(shí)現(xiàn)多態(tài)機(jī)制。

105、除了單例模式,你在生產(chǎn)環(huán)境中還用過什么設(shè)計(jì)模式?

這需要根據(jù)你的經(jīng)驗(yàn)來回答。一般情況下,你可以說依賴注入,工廠模式,裝飾 模式或者觀察者模式,隨意選擇你使用過的一種即可。不過你要準(zhǔn)備回答接下的 基于你選擇的模式的問題。

106、你能解釋一下里氏替換原則嗎?

答案 https://blog.csdn.net/pu_xubo565599455/article/details/51488323

107、什么情況下會(huì)違反迪米特法則?為什么會(huì)有這個(gè)問題?

迪米特法則建議“只和朋友說話,不要陌生人說話”,以此來減少類之間的耦合。

108、適配器模式是什么?什么時(shí)候使用?

適配器模式提供對接口的轉(zhuǎn)換。如果你的客戶端使用某些接口,但是你有另外一 些接口,你就可以寫一個(gè)適配去來連接這些接口。

109、什么是“依賴注入”和“控制反轉(zhuǎn)”?為什么有人使用?

控制反轉(zhuǎn)(IOC)是 Spring 框架的核心思想,用我自己的話說,就是你要做一件 事,別自己可勁 new 了,你就說你要干啥,然后外包出去就好~

依賴注入(DI) 在我淺薄的想法中,就是通過接口的引用和構(gòu)造方法的表達(dá),將 一些事情整好了反過來傳給需要用到的地方~

110、抽象類是什么?它與接口有什么區(qū)別?你為什么要使用過 抽象類?

接口用于規(guī)范,抽象類用于共性.

聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽象類

接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。

111、構(gòu)造器注入和 setter 依賴注入,那種方式更好?

每種方式都有它的缺點(diǎn)和優(yōu)點(diǎn)。構(gòu)造器注入保證所有的注入都被初始化,但是 setter 注入提供更好的靈活性來設(shè)置可選依賴。如果使用 XML 來描述依賴, Setter 注入的可讀寫會(huì)更強(qiáng)。經(jīng)驗(yàn)法則是強(qiáng)制依賴使用構(gòu)造器注入,可選依賴使 用 setter 注入。

112、依賴注入和工程模式之間有什么不同?

雖然兩種模式都是將對象的創(chuàng)建從應(yīng)用的邏輯中分離,但是依賴注入比工程模式 更清晰。通過依賴注入,你的類就是 POJO,它只知道依賴而不關(guān)心它們怎么獲 取。使用工廠模式,你的類需要通過工廠來獲取依賴。因此,使用 DI 會(huì)比使用 工廠模式更容易測試。

113、適配器模式和裝飾器模式有什么區(qū)別?

雖然適配器模式和裝飾器模式的結(jié)構(gòu)類似,但是每種模式的出現(xiàn)意圖不同。適配 器模式被用于橋接兩個(gè)接口,而裝飾模式的目的是在不修改類的情況下給類增加 新的功能。

114、適配器模式和代理模式之前有什么不同?

這個(gè)問題與前面的類似,適配器模式和代理模式的區(qū)別在于他們的意圖不同。由 于適配器模式和代理模式都是封裝真正執(zhí)行動(dòng)作的類,因此結(jié)構(gòu)是一致的,但適配器模式用于接口之間的轉(zhuǎn)換,而代理模式則是增加一個(gè)額外的中間層,以便 支持分配、控制或智能訪問

115、什么是模板方法模式?

模板方法提供算法的框架,你可以自己去配置或定義步驟。例如,你可以將排序 算法看做是一個(gè)模板。它定義了排序的步驟,但是具體的比較,可以使用 Comparable 或者其語言中類似東西,具體策略由你去配置。列出算法概要的方 法就是眾所周知的模板方法

116、什么時(shí)候使用訪問者模式?

訪問者模式用于解決在類的繼承層次上增加操作,但是不直接與之關(guān)聯(lián)。這種模 式采用雙派發(fā)的形式來增加中間層。

117、什么時(shí)候使用組合模式?

組合模式使用樹結(jié)構(gòu)來展示部分與整體繼承關(guān)系。它允許客戶端采用統(tǒng)一的形式 來對待單個(gè)對象和對象容器。當(dāng)你想要展示對象這種部分與整體的繼承關(guān)系時(shí)采 用組合模式。

118、繼承和組合之間有什么不同?

雖然兩種都可以實(shí)現(xiàn)代碼復(fù)用,但是組合比繼承共靈活,因?yàn)榻M合允許你在運(yùn)行 時(shí)選擇不同的實(shí)現(xiàn)。用組合實(shí)現(xiàn)的代碼也比繼承測試起來更加簡單。

119、描述 Java 中的重載和重寫?

重載和重寫都允許你用相同的名稱來實(shí)現(xiàn)不同的功能,但是重載是編譯時(shí)活動(dòng), 而重寫是運(yùn)行時(shí)活動(dòng)。你可以在同一個(gè)類中重載方法,但是只能在子類中重寫方 法。重寫必須要有繼承。

120、Java 中,嵌套公共靜態(tài)類與頂級類有什么不同?

類的內(nèi)部可以有多個(gè)嵌套公共靜態(tài)類,但是一個(gè) Java 源文件只能有一個(gè)頂級公 共類,并且頂級公共類的名稱與源文件名稱必須一致。

121、 OOP 中的 組合、聚合和關(guān)聯(lián)有什么區(qū)別?

如果兩個(gè)對象彼此有關(guān)系,就說他們是彼此相關(guān)聯(lián)的。組合和聚合是面向?qū)ο笾?的兩種形式的關(guān)聯(lián)。組合是一種比聚合更強(qiáng)力的關(guān)聯(lián)。組合中,一個(gè)對象是另一 個(gè)的擁有者,而聚合則是指一個(gè)對象使用另一個(gè)對象。如果對象 A 是由對象 B組合的,則 A 不存在的話,B 一定不存在,但是如果 A 對象聚合了一個(gè)對象 B, 則即使 A 不存在了,B 也可以單獨(dú)存在。

122、給我一個(gè)符合開閉原則的設(shè)計(jì)模式的例子?

開閉原則要求你的代碼對擴(kuò)展開放,對修改關(guān)閉。這個(gè)意思就是說,如果你想增 加一個(gè)新的功能,你可以很容易的在不改變已測試過的代碼的前提下增加新的碼。有好幾個(gè)設(shè)計(jì)模式是基于開閉原則的,如策略模式,如果你需要一個(gè)新的策 略,只需要實(shí)現(xiàn)接口,增加配置,不需要改變核心邏輯。一個(gè)正在工作的例子是 Collections.sort() 方法,這就是基于策略模式,遵循開閉原則的,你不需為新的 對象修改 sort() 方法,你需要做的僅僅是實(shí)現(xiàn)你自己的 Comparator 接口。

123、抽象工廠模式和原型模式之間的區(qū)別?

抽象工廠模式:通常由工廠方法模式來實(shí)現(xiàn)。但一個(gè)工廠中往往含有多個(gè)工廠方 法生成一系列的產(chǎn)品。這個(gè)模式強(qiáng)調(diào)的是客戶代碼一次保證只使用一個(gè)系列的產(chǎn) 品。當(dāng)要切換為另一個(gè)系列的產(chǎn)品,換一個(gè)工廠類即可。

原型模式:工廠方法的最大缺點(diǎn)就是,對應(yīng)一個(gè)繼承體系的產(chǎn)品類,要有一個(gè)同 樣復(fù)雜的工廠類的繼承體系。我們可以把工廠類中的工廠方法放到產(chǎn)品類自身中嗎?如果這樣的話,就可以將兩個(gè)繼承體系為一個(gè)。這也就是原型模式的思想, 原型模式中的工廠方法為 clone,它會(huì)返回一個(gè)拷貝(可以是淺拷貝,也可以是深 拷貝,由設(shè)計(jì)者決定)。為了保證用戶代碼中到時(shí)可以通過指針調(diào)用 clone 來動(dòng) 態(tài)綁定地生成所需的具體的類。這些原型對象必須事先構(gòu)造好。

原型模式想對工廠方法模式的另一個(gè)好處是,拷貝的效率一般對構(gòu)造的效率要高。

124、什么時(shí)候使用享元模式?

享元模式通過共享對象來避免創(chuàng)建太多的對象。為了使用享元模式,你需要確保 你的對象是不可變的,這樣你才能安全的共享。JDK 中 String 池、Integer 池 以及 Long 池都是很好的使用了享元模式的例子。

Java 面試中其他各式各樣的問題
這部分包含 Java 中關(guān)于 XML 的面試題,正則表達(dá)式面試題,Java 錯(cuò)誤和異常 及序列化面試題

125、嵌套靜態(tài)類與頂級類有什么區(qū)別?

一個(gè)公共的頂級類的源文件名稱與類名相同,而嵌套靜態(tài)類沒有這個(gè)要求。一個(gè) 嵌套類位于頂級類內(nèi)部,需要使用頂級類的名稱來引用嵌套靜態(tài)類,如 HashMap.Entry 是一個(gè)嵌套靜態(tài)類,HashMap 是一個(gè)頂級類,Entry 是一個(gè)嵌 套靜態(tài)類。

126、你能寫出一個(gè)正則表達(dá)式來判斷一個(gè)字符串是否是一個(gè)數(shù) 字嗎?

一個(gè)數(shù)字字符串,只能包含數(shù)字,如 0 到 9 以及 +、- 開頭,通過這個(gè)信息, 你可以下一個(gè)如下的正則表達(dá)式來判斷給定的字符串是不是數(shù)字。

1首先要 import java.util.regex.Pattern 和 java.util.regex.Matcher
2public boolean isNumeric(String str){
3Pattern pattern = Pattern.compile("[0-9]*");
4Matcher isNum = pattern.matcher(str);
5if( !isNum.matches() ){
6return false;
7}
8return true;
9}

127、Java 中,受檢查異常 和 不受檢查異常的區(qū)別?

受檢查異常編譯器在編譯期間檢查。對于這種異常,方法強(qiáng)制處理或者通過 throws 子句聲明。其中一種情況是 Exception 的子類但不是 RuntimeException 的子類。非受檢查是 RuntimeException 的子類,在編譯階 段不受編譯器的檢查。

128、Java 中,throw 和 throws 有什么區(qū)別

throw 用于拋出 java.lang.Throwable 類的一個(gè)實(shí)例化對象,意思是說你可以通 過關(guān)鍵字 throw 拋出一個(gè) Error 或者 一個(gè) Exception,如: throw new IllegalArgumentException(“size must be multiple of 2″ )

而 throws 的作用是作為方法聲明和簽名的一部分,方法被拋出相應(yīng)的異常以便 調(diào)用者能處理。Java 中,任何未處理的受檢查異常強(qiáng)制在 throws 子句中聲明。

129、Java 中,Serializable 與 Externalizable 的區(qū)別?

Serializable 接口是一個(gè)序列化 Java 類的接口,以便于它們可以在網(wǎng)絡(luò)上傳輸 或者可以將它們的狀態(tài)保存在磁盤上,是 JVM 內(nèi)嵌的默認(rèn)序列化方式,成本高、 脆弱而且不安全。Externalizable 允許你控制整個(gè)序列化過程,指定特定的二進(jìn) 制格式,增加安全機(jī)制。

130、Java 中,DOM 和 SAX 解析器有什么不同?

DOM 解析器將整個(gè) XML 文檔加載到內(nèi)存來創(chuàng)建一棵 DOM 模型樹,這樣可以 更快的查找節(jié)點(diǎn)和修改 XML 結(jié)構(gòu),而 SAX 解析器是一個(gè)基于事件的解析器, 不會(huì)將整個(gè) XML 文檔加載到內(nèi)存。由于這個(gè)原因,DOM 比 SAX 更快,也要 求更多的內(nèi)存,不適合于解析大 XML 文件。

131、說出 JDK 1.7 中的三個(gè)新特性?

雖然 JDK 1.7 不像 JDK 5 和 8 一樣的大版本,但是,還是有很多新的特性, 如 try-with-resource 語句,這樣你在使用流或者資源的時(shí)候,就不需要手動(dòng)關(guān) 閉,Java 會(huì)自動(dòng)關(guān)閉。Fork-Join 池某種程度上實(shí)現(xiàn) Java 版的 Map-reduce。 允許 Switch 中有 String 變量和文本。菱形操作符(<>)用于類型推斷,不再需 要在變量聲明的右邊申明泛型,因此可以寫出可讀寫更強(qiáng)、更簡潔的代碼。另個(gè)值得一提的特性是改善異常處理,如允許在同一個(gè) catch 塊中捕獲多個(gè)異常。

132、說出 5 個(gè) JDK 1.8 引入的新特性?

Java 8 在 Java 歷史上是一個(gè)開創(chuàng)新的版本,下面 JDK 8 中 5 個(gè)主要的特性: Lambda 表達(dá)式,允許像對象一樣傳遞匿名函數(shù) Stream API,充分利用現(xiàn)代多核 CPU,可以寫出很簡潔的代碼 Date 與 Time API,最終,有一個(gè)穩(wěn)定、簡單的日期和時(shí)間庫可供你使用 擴(kuò)展方法,現(xiàn)在,接口中可以有靜態(tài)、默認(rèn)方法。 重復(fù)注解,現(xiàn)在你可以將相同的注解在同一類型上使用多次。

133、Java 中,Maven 和 ANT 有什么區(qū)別?

雖然兩者都是構(gòu)建工具,都用于創(chuàng)建 Java 應(yīng)用,但是 Maven 做的事情更多, 在基于“約定優(yōu)于配置”的概念下,提供標(biāo)準(zhǔn)的 Java 項(xiàng)目結(jié)構(gòu),同時(shí)能為應(yīng)用自 動(dòng)管理依賴(應(yīng)用中所依賴的 JAR 文件),Maven 與 ANT 工具更多的不同之 處請參見答案。

后續(xù)

這就是所有的面試題,如此之多,是不是?我可以保證,如果你能回答列表中的 所有問題,你就可以很輕松的應(yīng)付任何核心 Java 或者高級 Java 面試。雖然, 這里沒有涵蓋 Servlet、JSP、JSF、JPA,JMS,EJB 及其它 Java EE 技術(shù),也 沒有包含主流的框架如 Spring MVC,Struts 2.0,Hibernate,也沒有包含 SOAP 和 RESTful web service,但是這份列表對做 Java 開發(fā)的、準(zhǔn)備應(yīng)聘 Java web 開發(fā)職位的人還是同樣有用的,因?yàn)樗械?Java 面試,開始的問題都是 Java 基 礎(chǔ)和 JDK API 相關(guān)的。如果你認(rèn)為我這里有任何應(yīng)該在這份列表中而被我遺漏了 的 Java 流行的問題,你可以自由的給我建議。我的目的是從最近的面試中創(chuàng)建一份最新的、最優(yōu)的 Java 面試問題列表。

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

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