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