[英]In Java, why don't we need to mark a class as abstract when we define an interface in it?
如果我將類定義為
class A {
interface AL {
void method ();
}
}
那為什么編譯器不要求我將類標記為abstract
因為我有一個未定義的方法?
由於method()
是接口AL
的方法,因此代碼可以正常工作。 請注意, method()
不是A
的方法,因此,不需要將類A
抽象化。
沒有實現的方法是嵌套接口聲明的一部分。 它不被視為外部類的一部分。 您可能想看一下為什么嵌套接口聲明是一個好主意。
考慮一個例子:
假設您正在創建一些與動物王國有關的應用程序。
現在,要求您創建狗,貓,獅子等對象。
因此,首先要想到的是,由於這些都屬於動物界,因此我可以創建一個名為“動物”的基類,所有東西都將繼承它。 現在你創造了這樣的東西
class Animal {
legs;
family;
eat();
roam();
sleep();
makeNoise();
}
因此,所有繼承動物類別的動物都將具有這些特征。 您可以將其稱為“ IS-A”關系。 就像狗是動物一樣。
現在,假設您被要求使用動物模擬程序進行一些科學競賽。 您也可以在其中使用該設計。
現在,假設有人要求您在寵物店中使用模擬器。
由於您沒有任何寵物行為。 您所做的是在基類中添加了pet功能,並認為這會起作用。
因此,現在您的程序可以創建具有寵物行為的獅子。 奇怪!!
現在,您需要將所有寵物行為都放在一個地方,並確保所有寵物動物都擁有它。
一種方法是創建具有所有寵物功能的另一個超類並對其進行擴展。 這是JAVA不允許的多重繼承(只是Google致命的死亡鑽石)。 界面就來了。
接口更像是對象實現的一組行為。 而且,由於每個對象都可以有自己的一組實現,因此所有這些方法都應該是抽象的。
它為您提供多態優勢,而不會造成致命的死亡問題。 它更像一個合同,它定義您的對象必須實現以下功能。
所以現在你能做什么
interface PetBehavior{
befriend();
play();
}
來自不同繼承樹的類可以實現此接口。
抽象類為您提供了一個簡短的想法,一個具體的對象可能看起來像,但是一個接口更像一個契約。 它告訴您對象將具有哪些其他功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.