1. 程式人生 > >2-Java面試-面向物件

2-Java面試-面向物件

## Java面試問題-面向物件 ### **Q1。什麼是多型?** 多型被簡要描述為“一個介面,許多實現”。多型性是能夠在不同上下文中為某事物賦予不同含義或用法的一種特徵-具體來說,就是允許諸如變數,函式或物件之類的實體具有多種形式。多型有兩種型別: ![img](https://img2020.cnblogs.com/other/2169955/202010/2169955-20201011100542504-849775965.png) 1. 編譯時多型 2. 執行時多型 編譯時多型是方法過載,而執行時多型是使用繼承和介面完成的。 ### ### **Q2。什麼是執行時多型或動態方法分派?** 在Java中,執行時多型性或動態方法分派是一個在執行時而不是在編譯時解決對覆蓋方法的呼叫的過程。在此過程中,將通過超類的引用變數呼叫重寫的方法。讓我們看下面的示例,以更好地理解它。 ```java class Car { void run() { System.out.println( & ldquo; car is running & rdquo;); } } class Audi extends Car { void run() { System.out.prinltn( & ldquo; Audi is running safely with 100 km & rdquo;); } public static void main(String args[]) { Car b = new Audi(); //upcasting b.run(); } } ``` ### **Q3。**Java中的抽象是什麼? 抽象是指處理思想而不是事件的質量。它主要處理隱藏細節並向用戶顯示基本內容。因此,您可以說Java中的抽象是向用戶隱藏實現細節並僅向用戶顯示功能的過程。可以通過兩種方式實現抽象: 1. **抽象類**(可以實現0-100%的抽象) 2. **介面**(可以實現100%的抽象) ### **Q4。Java介面是什麼意思?** Java中的介面是類的藍圖,或者可以說它是抽象方法和靜態常量的集合。在介面中,每個方法都是公共的和抽象的,但不包含任何建構函式。因此,介面基本上是一組帶有空主體的相關方法。例: ```java public interface Animal { public void eat(); public void sleep(); public void run(); } ``` ### **Q5。抽象類和介面有什麼區別?** | **抽象類** | **介面** | | ------------------------------------------------------------ | ------------------------------------------------------------ | | 抽象類可以提供完整的預設程式碼和/或僅提供必須覆蓋的詳細資訊 | 一個介面根本不能提供任何程式碼,只能提供簽名 | | 對於抽象類,一個類只能擴充套件一個抽象類 | 一個類可以實現多個介面 | | 抽象類可以具有非抽象方法 | 介面的所有方法都是抽象的 | | 抽象類可以具有例項變數 | 介面不能有例項變數 | | 抽象類可以具有任何可見性:公共,私有,受保護 | 介面可見性必須是公共的(或無) | | 如果我們向抽象類新增新方法,則可以選擇提供預設實現,因此所有現有程式碼都可能正常工作 | 如果我們向介面新增新方法,則必須跟蹤該介面的所有實現併為新方法定義實現 | | 抽象類可以包含建構函式 | 介面不能包含建構函式 | | 抽象類很快 | 介面很慢,因為它需要額外的間接才能在實際的類中找到對應的方法 | **Q6。Java中的繼承是什麼?** Java中的繼承是一個類的屬性可以被另一類繼承的概念。它有助於重用程式碼並在不同類之間建立關係。在兩種型別的類之間執行繼承: 1. 超級類(超級類或基礎類) 2. 子類(子類或派生類) 繼承屬性的類稱為“子類”,而繼承屬性的類稱為“父類”。 ### **Q7。Java中繼承有哪些不同型別?** Java支援四種繼承型別: 1. **單繼承:**在單繼承中,一個類繼承另一個屬性,即將只有一個父類和一個子類。 2. **多級繼承:**當一個類派生自一個類,而該類又派生自另一個類,即一個類有多個父類但處於不同級別時,這種繼承型別稱為多級繼承。 3. **分層繼承:**當一個類具有多個子類(子類),或者換句話說,一個以上的子類具有相同的父類時,則這種繼承稱為分層。 4. **混合繼承:**混合繼承是兩種*或多種*繼承的組合。 ### **Q8。什麼是方法過載和方法過載?** #### **方法過載:** - 在“方法過載”中,相同類的方法共享相同的名稱,但是每個方法必須具有不同數量的引數或具有不同型別和順序的引數。 - 方法過載是為該方法的行為“增加”或“擴充套件”更多。 - 它是編譯時的多型性。 - 這些方法必須具有不同的簽名。 - 它在方法過載中可能需要繼承,也可能不需要。 讓我們看下面的示例,以更好地理解它。 ```java class Adder { Static int add(int a, int b) { return a + b; } Static double add(double a, double b) { return a + b; } public static void main(String args[]) { System.out.println(Adder.add(11, 11)); System.out.println(Adder.add(12.3, 12.6)); } } ``` #### **方法覆蓋:** - 在“方法重寫”中,子類具有與父類相同的名稱,名稱和型別,引數和返回型別的方法。 - 方法覆蓋是“改變”方法的現有行為。 - 它是執行時多型性。 - 這些方法必須具有相同的簽名。 - 它始終需要在“方法覆蓋”中進行繼承。 讓我們看下面的示例,以更好地理解它。 ```java class Car { void run() { System.out.println("car is running"); } } class Audi extends Car { void run() { System.out.prinltn("Audi is running safely with 100km"); } public static void main(String args[]) { Car b = new Audi(); b.run(); } } ``` ### **Q9。您可以覆蓋Java中的私有或靜態方法嗎?** 您不能在Java中覆蓋私有或靜態方法。如果您在子類中建立具有相同返回型別和相同方法引數的類似方法,則它將隱藏超類方法;否則,它將隱藏超類方法。這稱為方法隱藏。同樣,您不能覆蓋子類中的私有方法,因為在那裡無法訪問它。您可以做的是在子類中建立另一個具有相同名稱的私有方法。讓我們看下面的示例,以更好地理解它。 ```java class Base { private static void display() { System.out.println("Static or class method from Base"); } public void print() { System.out.println("Non-static or instance method from Base"); } class Derived extends Base { private static void display() { System.out.println("Static or class method from Derived"); } public void print() { System.out.println("Non-static or instance method from Derived"); } public class test { public static void main(String args[]) { Base obj = new Derived(); obj1.display(); obj1.print(); } } } } ``` ### **Q10。什麼是多重繼承?Java支援嗎?** ![MultipleInheritance-Java面試問題-Edureka](https://img2020.cnblogs.com/other/2169955/202010/2169955-20201011100542652-2127874644.png)如果子類從多個類繼承屬性,則稱為多重繼承。Java不允許擴充套件多個類。 多重繼承的問題在於,如果多個父類具有相同的方法名稱,則在執行時,編譯器將很難從子類中決定執行哪個方法。 因此,Java不支援多重繼承。該問題通常稱為“鑽石問題”。 ### **Q11。** **Java中的封裝是什麼?** 封裝是一種將資料(變數)和程式碼(方法)繫結為一個單元的機制。在這裡,資料對外界是隱藏的,只能通過當前的類方法進行訪問。這有助於保護資料免受任何不必要的修改。我們可以通過以下方式實現Java封裝: - 將一個類的變數宣告為私有。 - 提供公共的setter和getter方法來修改和檢視變數的值。 ### **Q12。什麼是關聯?** 關聯是所有物件都有其自己的生命週期且沒有所有者的關係。讓我們以老師和學生為例。多個學生可以與一個老師聯絡,一個學生可以與多個老師聯絡,但是物件之間沒有所有權,並且兩者都有自己的生命週期。這些關係可以是一對一,一對多,多對一和多對多。 ### **Q13。集合是什麼意思?** 集合是關聯的一種特殊形式,其中所有物件都有其自己的生命週期,但是有所有權,子物件不能屬於另一個父物件。讓我們以部門和老師為例。一個老師不能屬於多個部門,但是如果刪除該部門的老師物件,則不會銷燬。 ### **Q14。Java中的成分是什麼?** 組合還是聚集的一種特殊形式,我們可以稱其為“死亡”關係。這是強型別的聚合。子物件沒有生命週期,如果刪除父物件,則所有子物件也將被刪除。讓我們再次以房屋與房間之間的關係為例。房子可以包含多個房間,沒有獨立的房間生活空間,任何房間都不能屬於兩個不同的房子,如果我們刪除房子,房間將自動刪除。 **Q15。什麼是介面?** 介面可以定義為沒有資料成員和成員函式的介面。簡單來說,空介面稱為標記介面。Java中Marker介面的最常見示例是Serializable,Cloneable等。可以按以下方式宣告marker介面。 ```java public interface Serializable{ //do something; } ``` **Q16** **。 Java中的物件克隆是什麼?** Java中的物件克隆是建立物件的精確副本的過程。從根本上講,這意味著可以建立狀態與原始物件相似的物件。為此,Java提供了方法**clone** **()** 來利用此功能。此方法建立當前物件類的新例項,然後使用與相應欄位完全相同的內容初始化其所有欄位。要物件clone(),必須實現標記介面**java.lang.Cloneable**以避免任何執行時異常。您必須注意的一件事是Object clone()是一種受保護的方法,因此您需要重寫它。 ### **Q17。Java中的建構函式是什麼?** 複製建構函式是一個成員函式,用於使用同一類的另一個物件初始化一個物件。儘管在Java中不需要複製建構函式,因為所有物件都是通過引用傳遞的。而且,Java甚至不支援自動按值傳遞。 ### **Q18。什麼是Java中的建構函式過載?** 在Java中,建構函式過載是一種將任意數量的建構函式新增到每個具有不同引數列表的類的技術。編譯器使用列表中的引數數量及其型別來區分過載的建構函式。 ```java class Demo { int i; public Demo(int a) { i = k; } public Demo(int a, int b) { //body } } ``` > 歡迎關注 [Java架構師社群](http://javajgs.com/)公眾號. > 本文轉載自[Java架構師必看](http://javajgs.com/archives/5504) ,更多內容點選