java 面试指南_Java面试参考指南–第1部分
java 面試指南
JAVA面向?qū)ο蟮母拍?/h2>
Java in基于面向?qū)ο蟮母拍?#xff0c;它允許更高級(jí)別的抽象以實(shí)際方式解決任何問題。
面向?qū)ο蟮姆椒▽?shí)際對象中的問題解決方案概念化,更易于在整個(gè)應(yīng)用程序中重用。 例如椅子,風(fēng)扇,狗,電腦等。
在Java中,類是定義同類對象的常見行為的藍(lán)圖,模板或原型。 實(shí)例是特定類的實(shí)現(xiàn),并且類的所有實(shí)例都具有類似的屬性,如類定義中所述。 例如,您可以定義一個(gè)名為House with room number的類作為屬性,并創(chuàng)建實(shí)例,例如2個(gè)房間的房子,3個(gè)房間的房子等。
優(yōu)點(diǎn):
以下是面向?qū)ο筌浖_發(fā)的一些優(yōu)點(diǎn):
- 維護(hù)成本較低,主要是因?yàn)樗悄K化的。
- 由于具有繼承等功能,因此可以更快地進(jìn)行開發(fā),從而具有更好的代碼可重用性。
- 改進(jìn)的代碼可靠性和靈活性
- 由于真實(shí)世界的建模而易于理解。
- 在對象級(jí)別更好的抽象。
- 從一個(gè)開發(fā)階段過渡到另一階段的過程中降低了復(fù)雜性。
OOPS有四個(gè)主要功能:
- 封裝形式
- 遺產(chǎn)
- 多態(tài)性
- 抽象化
封裝形式:
封裝為其他對象提供了隱藏和暴露對象的契約,可以訪問其他對象。 在Java中,我們使用私有訪問修飾符來隱藏方法和變量以限制外部環(huán)境。 Java還提供了不同的訪問修飾符,例如public,default,protected和private,它們用于隱藏不同級(jí)別的可見性,但最終目標(biāo)是封裝不需要更改的事物。 按照最佳實(shí)踐,一個(gè)班級(jí)應(yīng)該只有一個(gè)理由進(jìn)行更改,而封裝將現(xiàn)實(shí)帶入實(shí)現(xiàn)“ 一個(gè)道理 ”的設(shè)計(jì)原則。
按照封裝中的最佳實(shí)踐,意味著要隱藏經(jīng)常更改的內(nèi)容,以避免破壞其他類。
好處:以下是封裝的一些優(yōu)點(diǎn): ?
- 我們可以通過隱藏對象的屬性來保護(hù)對象的內(nèi)部狀態(tài)。
- 它通過防止對象以意外方式彼此交互來提高代碼模塊化。
- 增加可用性
- 維護(hù)特定對象的合同
- 封裝促進(jìn)維護(hù)
- 可以獨(dú)立進(jìn)行代碼更改
多態(tài)性:
多態(tài)性是(在編程中)針對不同底層形式(數(shù)據(jù)類型)呈現(xiàn)相同接口的能力。 這意味著類在共享公共接口時(shí)具有不同的功能,并且可以通過傳遞特定的類引用來動(dòng)態(tài)調(diào)用。
經(jīng)典示例是Shape類以及可以從中繼承的所有類(正方形,圓形,十二面體,不規(guī)則多邊形,splat等)。
在此示例中,每個(gè)類都有其自己的Draw()函數(shù),并且客戶端代碼可以簡單地執(zhí)行以下操作:
Shape shape=new Square ();Shape.area() to get the correct behavior for any shape.多態(tài)的好處在于,使用不同類的代碼不需要知道正在使用哪個(gè)類,因?yàn)樗鼈兌家韵嗤姆绞绞褂谩?
面向?qū)ο蟮木幊陶Z言用來實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性的過程稱為動(dòng)態(tài)綁定。
注意 :多態(tài)性是在運(yùn)行時(shí)根據(jù)用于調(diào)用它的對象選擇更多專門方法的能力。 不涉及抽象類的情況下可能會(huì)發(fā)生多態(tài)。
優(yōu)點(diǎn):
- 創(chuàng)建可重用代碼:這意味著一旦創(chuàng)建,實(shí)現(xiàn)和測試了類,就可以輕松使用它而無需關(guān)心類中編寫的內(nèi)容。
- 它提供了更通用且松散耦合的代碼。
- 編譯時(shí)間要短得多,并且可以加快開發(fā)速度。
- 動(dòng)態(tài)綁定:
- 相同的接口可用于創(chuàng)建具有不同實(shí)現(xiàn)的方法
- 可以通過使用相同的方法簽名替換完整的實(shí)現(xiàn)
方法重載以實(shí)現(xiàn)多態(tài)性:重載處理兩種方法: 一個(gè)在父類中,另一個(gè)在子類中,并且具有相同的名稱和簽名。
通過覆蓋,您可以針對不同的對象類型以不同的方式定義相同的操作
例如
while(it.hasNext()) {Shape s = (Shape) it.next();totalArea += s.area(dim); //polymorphic method call. Will call right object method}
方法重載或臨時(shí)多態(tài)性或靜態(tài)多態(tài)性:
重載處理同一個(gè)類中具有相同名稱但具有不同方法簽名的多個(gè)方法。 通過重載,您可以以不同的方式為不同的數(shù)據(jù)定義相同的操作。 有時(shí)它說是靜態(tài)多態(tài)性,但實(shí)際上不是多態(tài)性。
方法重載無非就是擁有兩個(gè)名稱相同但參數(shù)列表不同的方法。 它與繼承和多態(tài)性無關(guān)。 重載方法與重載方法不同。 [ Head First Java ]
Java中通過泛型進(jìn)行的參數(shù)多態(tài)性:
在類聲明中,字段名稱可以與不同類型關(guān)聯(lián),而方法名稱可以與不同參數(shù)和返回類型關(guān)聯(lián)。 Java通過泛型支持參數(shù)多態(tài)性。
列表就是一個(gè)例子,它可以接受泛型所包含的數(shù)據(jù)類型。
List<String> list = new ArrayList<String>();為什么我們不能在Java中覆蓋靜態(tài)方法?
覆蓋取決于擁有類的實(shí)例。 多態(tài)性的關(guān)鍵是您可以對一個(gè)類進(jìn)行子類化,并且實(shí)現(xiàn)那些子類的對象對于在超類中定義的相同方法(在子類中被重寫)將具有不同的行為。 靜態(tài)方法未與類的任何實(shí)例關(guān)聯(lián),因此該概念不適用。
影響Java設(shè)計(jì)的因素有兩個(gè)。 一個(gè)是對性能的關(guān)注:Smalltalk對其速度太慢提出了很多批評(píng)(垃圾收集和多態(tài)調(diào)用是其中的一部分),Java的創(chuàng)建者決心避免這種情況。 另一個(gè)決定是Java的目標(biāo)受眾是C ++開發(fā)人員。 使靜態(tài)方法按其實(shí)際方式工作對C ++程序員來說是很有益的,而且非常快,因?yàn)闊o需上層類層次結(jié)構(gòu)即可確定要調(diào)用的方法,您可以直接進(jìn)入類并調(diào)用指定的方法。 [堆棧溢出]
遺產(chǎn):
它是在派生類中包含基類的行為(即方法)和狀態(tài)(即變量),以便它們可以在該派生類中訪問。 繼承的主要優(yōu)點(diǎn)是它提供了代碼重用的正式機(jī)制,并且避免了重復(fù)
繼承的類通過重用父行為并添加新功能來擴(kuò)展應(yīng)用程序的功能。 這將使設(shè)計(jì)緊密耦合,因?yàn)槿绻某?#xff0c;則必須知道子類的所有詳細(xì)信息,以免破壞
它是軟件可重用性的一種形式,其中從現(xiàn)有類(超類)創(chuàng)建新類(子類),從而增強(qiáng)功能,同時(shí)使用超類的某些屬性。
因此,如果您有一個(gè)Parents類,那么您就有一個(gè)擴(kuò)展Parent的Child類,Child繼承了Person擁有的所有東西。
優(yōu)點(diǎn):
- 提高可重用性
- 在邏輯上建立“是”關(guān)系:例如,狗是動(dòng)物
- 模塊化代碼
- 避免重復(fù)
退稅:
- 緊密耦合 :子類取決于父類的實(shí)現(xiàn),這就是緊密耦合的原因。
抽象:
抽象意味著根據(jù)其接口和功能而不是其實(shí)現(xiàn)細(xì)節(jié)來開發(fā)類。 抽象類公開接口,不包括實(shí)際實(shí)現(xiàn)。 它將對象實(shí)現(xiàn)與其行為或?qū)崿F(xiàn)分開。 通過隱藏?zé)o關(guān)的細(xì)節(jié),抽象降低了復(fù)雜性。
優(yōu)點(diǎn):
- 通過使用抽象,我們可以將可以分組的事物分離為另一種類型。
- 可以將經(jīng)常更改的屬性和方法分組為一個(gè)單獨(dú)的類型,以便不必對主要類型進(jìn)行更改。 這為OOAD原則增加了力量-“代碼應(yīng)為擴(kuò)展而開放,而為修改而封閉”。
- 簡化域模型的表示。
抽象與封裝之間的區(qū)別
封裝是用作抽象的一部分的策略。 封裝是指對象的狀態(tài)–對象封裝其狀態(tài)并將其從外部隱藏起來; 類的外部用戶通過其方法與之交互,但無法直接訪問類的狀態(tài)。 因此,該類將與狀態(tài)相關(guān)的實(shí)現(xiàn)細(xì)節(jié)抽象出來。
抽象是一個(gè)更通用的術(shù)語。 也可以通過(以及其他)子分類來實(shí)現(xiàn)。 例如,標(biāo)準(zhǔn)庫中的List類是對一系列項(xiàng)目的抽象,這些項(xiàng)目按其位置索引。List的具體示例是ArrayList或LinkedList。 與列表進(jìn)行交互的代碼抽象出它正在使用哪種列表的詳細(xì)信息[堆棧溢出]
如果不通過封裝隱藏基礎(chǔ)狀態(tài),那么通常不可能進(jìn)行抽象–如果一個(gè)類公開其內(nèi)部狀態(tài),則它無法更改其內(nèi)部工作方式,因此無法抽象
什么是抽象類和抽象方法?
在設(shè)計(jì)中,您希望基類僅為其派生類提供一個(gè)接口。 這意味著,您不希望任何人實(shí)際實(shí)例化基類的對象。 您只需要對其進(jìn)行上載(隱式上載,這將為您提供多態(tài)行為),以便可以使用其接口。 這可以通過使用abstract關(guān)鍵字使該類抽象化來實(shí)現(xiàn)。
對不實(shí)例化抽象類提供了一些限制,無論誰使用,都應(yīng)實(shí)現(xiàn)抽象方法。 并提供多態(tài)性
抽象類可以包含抽象方法和具體方法。 在類中,如果一個(gè)方法被聲明為抽象,則該類必須被聲明為抽象。 但是,與此相反不一定是正確的。 如果將class聲明為abstract class,則其中可能沒有abstract方法。
如果一個(gè)方法不提供實(shí)際的實(shí)現(xiàn),而僅提供方法簽名,則稱為抽象方法。 擴(kuò)展抽象類的子類留有實(shí)際的實(shí)現(xiàn)。
抽象方法無法實(shí)例化; 另一個(gè)類只能擴(kuò)展它。
什么時(shí)候使用抽象類?
抽象類使您可以定義一些默認(rèn)行為,并強(qiáng)制子類提供任何特定行為。
例如:List是接口,而AbstractList提供List的默認(rèn)行為,可以按原樣使用或在子類(例如ArrayList)中完善它。
什么是接口?
interface關(guān)鍵字通過完全避免任何方法或函數(shù)的實(shí)現(xiàn),使抽象類的這一概念更進(jìn)一步。 您只能聲明方法或函數(shù),而不能提供實(shí)現(xiàn)。 實(shí)現(xiàn)接口的類應(yīng)提供實(shí)際的實(shí)現(xiàn)。 接口是OO設(shè)計(jì)中非常有用且常用的方面,因?yàn)樗峁┝私涌诤蛯?shí)現(xiàn)的分離,并使您能夠 :
界面優(yōu)勢:
接口和抽象類之間的區(qū)別:
- 接口是要求類(無論要實(shí)現(xiàn)接口的人)以其在接口中定義的方式實(shí)現(xiàn)接口的契約。 它是帶有方法聲明的空外殼。
- 抽象類定義一些常見的行為,并要求子類為該類定義不常見或特定的行為
- 可以以任何可見性定義抽象類的方法和成員,而接口的所有方法都必須定義為public
- 繼承抽象類時(shí),子類必須定義抽象方法,而一個(gè)接口可以擴(kuò)展另一個(gè)接口,而不必定義方法
- 子類只能擴(kuò)展一個(gè)抽象(或任何其他)類,而一個(gè)接口可以擴(kuò)展或一個(gè)類可以實(shí)現(xiàn)多個(gè)其他接口。
- 子類可以定義具有相同或更少限制性可見性的抽象方法,而實(shí)現(xiàn)接口的類必須定義具有完全相同的可見性的方法
- 接口不包含構(gòu)造函數(shù),而抽象類包含構(gòu)造函數(shù)。
- 在Java接口中聲明的變量默認(rèn)為final。 抽象類可能包含非最終變量
- 默認(rèn)情況下,Java接口的成員是公共的。 Java抽象類可以具有類成員的常用風(fēng)格,例如private,protected等。
組成:
通過實(shí)現(xiàn)繼承或組合可以實(shí)現(xiàn)代碼的可重用性,但是用于代碼重用的組合方法比繼承提供了更強(qiáng)的封裝性,因?yàn)閷蠖祟惖母牟槐仄茐娜魏蝺H依賴于前端類的代碼。
組合是在類中實(shí)現(xiàn)具有關(guān)系的設(shè)計(jì)技術(shù)。 我們可以使用Java繼承或?qū)ο蠼M合進(jìn)行代碼重用
合成是關(guān)于表達(dá)對象之間的關(guān)系。 想想椅子的例子。 椅子有座位。 椅子有靠背。 椅子有一組腿。 短語“具有”表示椅子擁有或至少使用另一個(gè)對象的關(guān)系。 正是這種“有”的關(guān)系才是構(gòu)成的基礎(chǔ)
優(yōu)點(diǎn):
- 控制可見度
- 實(shí)現(xiàn)可以代替運(yùn)行時(shí)間
- 松耦合作為接口類不依賴于實(shí)現(xiàn)。
組成與繼承之間的區(qū)別?
| 沒有。 | 組成(有) | 繼承(是) |
| 1個(gè) | 提倡多態(tài)和代碼重用 | 提倡多態(tài)和代碼重用 |
| 2 | 在運(yùn)行時(shí)完成時(shí)獲取對象 | 在編譯時(shí)動(dòng)態(tài)獲取對象 |
| 3 | 可以在運(yùn)行時(shí)替換實(shí)現(xiàn) | 可以在編譯時(shí)替換實(shí)現(xiàn) |
| 4 | 子類不依賴于父類,而是支持松散耦合(特別是在接口驅(qū)動(dòng)下) | 子類取決于父類的實(shí)現(xiàn),這就是為什么緊密耦合的原因 |
| 5 | 在房屋設(shè)有浴室時(shí)使用。 說房子是浴室是不正確的 | 繼承是單向的。 例如,房屋是建筑物。 但是建筑物不是房子 |
注意:不要僅使用繼承來獲得代碼重用。 如果沒有“存在”關(guān)系,則使用組合進(jìn)行代碼重用。
對象關(guān)系中組合和聚合之間的差異
聚合:聚合是一個(gè)類別屬于一個(gè)集合的關(guān)聯(lián)。 這是整體關(guān)系的一部分,其中一部分可以沒有整體而存在。 這是較弱的關(guān)系。 無循環(huán)依賴性。 示例:訂單和產(chǎn)品
組合:組合是一個(gè)類別屬于一個(gè)集合的關(guān)聯(lián)。 這是整體關(guān)系的一部分,其中沒有整體就不可能存在一部分。 如果整體被刪除,則所有部分都被刪除。 這是更牢固的關(guān)系。 例如多邊形和點(diǎn),訂單和訂單詳細(xì)信息 ?
參考文獻(xiàn):
- http://stackoverflow.com/
- http://en.wikipedia.org/
- 有效的Java?
翻譯自: https://www.javacodegeeks.com/2014/02/java-interview-reference-guide-part-1.html
java 面試指南
總結(jié)
以上是生活随笔為你收集整理的java 面试指南_Java面试参考指南–第1部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学校的英文怎么读 学校的英文是什么
- 下一篇: java依赖注入_Java依赖注入选项