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
}
}
歡迎關注 Java架構師社區公眾號.
本文轉載自Java架構師必看 ,更多內容點擊查看!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/167647.html
標籤:Java
上一篇:桶排序的簡單實作
