簡體   English   中英

在Java中,為什么在我們定義一個接口時不需要將其標記為抽象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM