2-Java面試-面向對象
- 2020 年 10 月 11 日
- 筆記
- Spring Cloud
Java面試問題-面向對象
Q1。什麼是多態?
多態被簡要描述為「一個接口,許多實現」。多態性是能夠在不同上下文中為某事物賦予不同含義或用法的一種特徵-具體來說,就是允許諸如變量,函數或對象之類的實體具有多種形式。多態有兩種類型:
- 編譯時多態
- 運行時多態
編譯時多態是方法重載,而運行時多態是使用繼承和接口完成的。
Q2。什麼是運行時多態或動態方法分派?
在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中的抽象是向用戶隱藏實現細節並僅向用戶顯示功能的過程。可以通過兩種方式實現抽象:
- 抽象類(可以實現0-100%的抽象)
- 接口(可以實現100%的抽象)
Q4。Java接口是什麼意思?
Java中的接口是類的藍圖,或者可以說它是抽象方法和靜態常量的集合。在接口中,每個方法都是公共的和抽象的,但不包含任何構造函數。因此,接口基本上是一組帶有空主體的相關方法。例:
public interface Animal {
public void eat();
public void sleep();
public void run();
}
Q5。抽象類和接口有什麼區別?
抽象類 | 接口 |
---|---|
抽象類可以提供完整的默認代碼和/或僅提供必須覆蓋的詳細信息 | 一個接口根本不能提供任何代碼,只能提供簽名 |
對於抽象類,一個類只能擴展一個抽象類 | 一個類可以實現多個接口 |
抽象類可以具有非抽象方法 | 接口的所有方法都是抽象的 |
抽象類可以具有實例變量 | 接口不能有實例變量 |
抽象類可以具有任何可見性:公共,私有,受保護 | 接口可見性必須是公共的(或無) |
如果我們向抽象類添加新方法,則可以選擇提供默認實現,因此所有現有代碼都可能正常工作 | 如果我們向接口添加新方法,則必須跟蹤該接口的所有實現並為新方法定義實現 |
抽象類可以包含構造函數 | 接口不能包含構造函數 |
抽象類很快 | 接口很慢,因為它需要額外的間接才能在實際的類中找到對應的方法 |
Q6。Java中的繼承是什麼?
Java中的繼承是一個類的屬性可以被另一類繼承的概念。它有助於重用代碼並在不同類之間建立關係。在兩種類型的類之間執行繼承:
- 超級類(超級類或基礎類)
- 子類(子類或派生類)
繼承屬性的類稱為「子類」,而繼承屬性的類稱為「父類」。
Q7。Java中繼承有哪些不同類型?
Java支持四種繼承類型:
- 單繼承:在單繼承中,一個類繼承另一個屬性,即將只有一個父類和一個子類。
- 多級繼承:當一個類派生自一個類,而該類又派生自另一個類,即一個類有多個父類但處於不同級別時,這種繼承類型稱為多級繼承。
- 分層繼承:當一個類具有多個子類(子類),或者換句話說,一個以上的子類具有相同的父類時,則這種繼承稱為分層。
- 混合繼承:混合繼承是兩種或多種繼承的組合。
Q8。什麼是方法重載和方法重載?
方法重載:
- 在「方法重載」中,相同類的方法共享相同的名稱,但是每個方法必須具有不同數量的參數或具有不同類型和順序的參數。
- 方法重載是為該方法的行為「增加」或「擴展」更多。
- 它是編譯時的多態性。
- 這些方法必須具有不同的簽名。
- 它在方法重載中可能需要繼承,也可能不需要。
讓我們看下面的示例,以更好地理解它。
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));
}
}
方法覆蓋:
- 在「方法重寫」中,子類具有與父類相同的名稱,名稱和類型,參數和返回類型的方法。
- 方法覆蓋是「改變」方法的現有行為。
- 它是運行時多態性。
- 這些方法必須具有相同的簽名。
- 它始終需要在「方法覆蓋」中進行繼承。
讓我們看下面的示例,以更好地理解它。
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中覆蓋私有或靜態方法。如果您在子類中創建具有相同返回類型和相同方法參數的類似方法,則它將隱藏超類方法;否則,它將隱藏超類方法。這稱為方法隱藏。同樣,您不能覆蓋子類中的私有方法,因為在那裡無法訪問它。您可以做的是在子類中創建另一個具有相同名稱的私有方法。讓我們看下面的示例,以更好地理解它。
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支持嗎?
如果子類從多個類繼承屬性,則稱為多重繼承。Java不允許擴展多個類。
多重繼承的問題在於,如果多個父類具有相同的方法名稱,則在運行時,編譯器將很難從子類中決定執行哪個方法。
因此,Java不支持多重繼承。該問題通常稱為「鑽石問題」。
Q11。 Java中的封裝是什麼?
封裝是一種將數據(變量)和代碼(方法)綁定為一個單元的機制。在這裡,數據對外界是隱藏的,只能通過當前的類方法進行訪問。這有助於保護數據免受任何不必要的修改。我們可以通過以下方式實現Java封裝:
-
將一個類的變量聲明為私有。
-
提供公共的setter和getter方法來修改和查看變量的值。
Q12。什麼是關聯?
關聯是所有對象都有其自己的生命周期且沒有所有者的關係。讓我們以老師和學生為例。多個學生可以與一個老師聯繫,一個學生可以與多個老師聯繫,但是對象之間沒有所有權,並且兩者都有自己的生命周期。這些關係可以是一對一,一對多,多對一和多對多。
Q13。集合是什麼意思?
集合是關聯的一種特殊形式,其中所有對象都有其自己的生命周期,但是有所有權,子對象不能屬於另一個父對象。讓我們以部門和老師為例。一個老師不能屬於多個部門,但是如果刪除該部門的老師對象,則不會銷毀。
Q14。Java中的成分是什麼?
組合還是聚集的一種特殊形式,我們可以稱其為「死亡」關係。這是強類型的聚合。子對象沒有生命周期,如果刪除父對象,則所有子對象也將被刪除。讓我們再次以房屋與房間之間的關係為例。房子可以包含多個房間,沒有獨立的房間生活空間,任何房間都不能屬於兩個不同的房子,如果我們刪除房子,房間將自動刪除。
Q15。什麼是接口?
接口可以定義為沒有數據成員和成員函數的接口。簡單來說,空接口稱為標記接口。Java中Marker接口的最常見示例是Serializable,Cloneable等。可以按以下方式聲明marker接口。
public interface Serializable{
//do something;
}
Q16 。 Java中的對象克隆是什麼?
Java中的對象克隆是創建對象的精確副本的過程。從根本上講,這意味着可以創建狀態與原始對象相似的對象。為此,Java提供了方法clone () 來利用此功能。此方法創建當前對象類的新實例,然後使用與相應字段完全相同的內容初始化其所有字段。要對象clone(),必須實現標記接口java.lang.Cloneable以避免任何運行時異常。您必須注意的一件事是Object clone()是一種受保護的方法,因此您需要重寫它。
Q17。Java中的構造函數是什麼?
複製構造函數是一個成員函數,用於使用同一類的另一個對象初始化一個對象。儘管在Java中不需要複製構造函數,因為所有對象都是通過引用傳遞的。而且,Java甚至不支持自動按值傳遞。
Q18。什麼是Java中的構造函數重載?
在Java中,構造函數重載是一種將任意數量的構造函數添加到每個具有不同參數列表的類的技術。編譯器使用列表中的參數數量及其類型來區分重載的構造函數。
class Demo {
int i;
public Demo(int a) {
i = k;
}
public Demo(int a, int b) {
//body
}
}