[英]In Java, what really happens when an interface “extends” another interface?
我是Java編程的新手,現在,我試圖理解OOP概念(繼承性,多態性等)。
我知道,當子類擴展超類(是否抽象)時,子類構造函數首先調用該超類的構造函數(super())。
我的問題是:
1)接口是否一樣? 我讀過一些文章說接口沒有構造函數,那么它們到底是如何擴展的呢?
2)為什么Java不支持多重繼承,但是一個接口可以“ 擴展 ”多個其他接口?
提前致謝。
1)接口是否一樣? 我讀過一些文章說接口沒有構造函數,那么它們到底是如何擴展的呢?
是的,接口中沒有構造函數,您將必須定義一個具體類( 實現該接口)來創建該接口類型的對象。
示例:您可以使用javap java.io.Serializable
來檢查java.io.Serializable
的配置文件,該配置文件是:
public interface java.io.Serializable {
}
表示沒有構造函數。
2)為什么Java不支持多重繼承,但是一個接口可以“擴展”多個其他接口?
是的,您可以擴展多個接口,這是因為,如果兩個接口包含具有相同簽名的抽象方法,那么這對於編譯器而言就不會有歧義。 但這不是類的情況,如果您嘗試擴展兩個具有相同簽名方法的類,那么對於編譯器來說,在不同的類中作為方法聲明調用的方法可能有所不同,這將是模棱兩可。
是的,您可以做到。 一個接口可以擴展多個接口。
interface Maininterface extends inter1, inter2, inter3{
// methods
}
不僅接口,單個類還可以實現多個接口。 那么顯然會產生疑問,如果兩個方法具有相同的方法名稱該怎么辦。
有一個棘手的問題:
interface A
{
void test();
}
interface B
{
void test();
}
class C implements A, B
{
@Override
public void test() {
}
}
然后,單個實現對這兩個都起作用:)
1)接口是否一樣?
並不是的。 接口的構造函數實際上沒有任何意義,因為構造函數定義了一些初始狀態,但是接口沒有狀態。 因此,不會調用構造函數。
我讀過一些文章說接口沒有構造函數,那么它們到底是如何擴展的呢?
您應該考慮將接口擴展為更多類型的擴展,即擴展某種對象的定義行為。 這就像簽訂合同並在末尾添加一些子句–您說的是“ 除了超級接口中定義的方法之外 ,我還希望實現該接口的類也實現______”
擴展類有點類似,因為您也擴展了類型,但事實是,擴展類應被視為為類型添加了其他狀態/實現。 因此,應調用超類構造函數以確保與超類定義關聯的所有狀態都已正確初始化。
2)為什么Java不支持多重繼承,但是一個接口可以“擴展”多個其他接口?
您在這里必須要小心,因為不僅僅是一種多重繼承。 Java 確實支持類型的多重繼承,這就是為什么您可以實現定義類型的多個接口的原因。 Java不支持狀態的多重繼承(並且直到Java 8才允許實現多重繼承。請參見下面的注釋)。 這就是為什么您只能擴展1個類的原因-因為類定義狀態。
因此,由於允許您繼承多個類型,因此對於給定的接口擴展多個接口是完全可以的。 這就像拿一份合同,然后在其后面裝訂其他幾份合同一樣。 只要實現類遵循整個過程,您的程序就應該編譯。
注意:從Java 8開始,您現在可以通過接口中的default
方法繼承多個實現。 在發生沖突的情況下,程序員必須明確實現所討論的方法。
首先,嘗試清除inheritance
的概念。 繼承的基本概念是繼承(獲取)父類的所有屬性(變量和方法)(考慮訪問修飾符),並在子類中進行重寫。
假設我們有Class A
,
class A{
public void doA()
{
}
}
現在如果class B
擴展 A
( 擴展標記的字面意思),它會獲得方法doA()
本質上。 如果您看一下實際上B extends A
的文字部分,則似乎B
是A
的擴展版本。
現在進入界面部分。 如果我有接口InA
interface InA{
doInA();
}
我試圖在class B
繼承它,我需要implement
(再次標記文字)。 所以我將獲得方法doInA()
它B
但是我需要給它一個主體。
在使用Interface to Interface的情況下,現在您已經使用了兩個關鍵字進行繼承。 如果我問您interface InB
將繼承interface InA
,您將在extends
和implements
選擇哪些關鍵工作? 擴展聽起來不合邏輯。 因為InB
沒有實現任何東西,它只會變得更大,它將是InA
的擴展版本。
現在讓我們回答兩個關鍵問題:
1.Is it the same case for Interfaces?
是和否實際上,僅在調用child的構造函數時才調用parent的構造函數。 因此,由於您永遠無法調用子接口的構造函數,因此將不會調用父接口的構造函數。 它不調用父構造函數,但仍保留構造函數調用的技術。
2) How come multiple inheritance is not supported in Java but an interface can "extend" multiple other interfaces?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.