Abstraktní třída i rozhraní jsou primárně používány pro abstrakci, jsou však od sebe velmi odlišné. Oba jsou jádrem Java, ale mají vlastní využití aplikací. I když oba pojmy mohou být navzájem synonymní, nemohou být použity zaměnitelně.
Mezi nimi jsou značné rozdíly. Zatímco metoda rozhraní je ve výchozím nastavení abstraktní, abstrakt může obsahovat abstraktní i ne abstraktní metody. Protože Java 8, rozhraní mají také implementaci metod a mohou mít v Javě statické i výchozí metody. Pojďme studovat rozdíl mezi těmito dvěma podrobně.
Abstraktní třída v Javě je třída, která je prohlášena za abstraktní - může nebo nemusí obsahovat abstraktní metody. Je to docela podobné rozhraní Java s tou výjimkou, že může obsahovat implicitní implementaci metody. Stejně jako v objektově orientovaném programování je abstrakce v Javě dosaženo pomocí abstraktních tříd a rozhraní. V Javě znamená abstrakce skrývat irelevantní podrobnosti před uživatelem a zaměřit se pouze na podstatné detaily, aby se zvýšila účinnost, čímž se sníží složitost. Klíčové slovo „abstrakt“ se používá k vytvoření abstraktní třídy těsně před klíčovým slovem třídy v deklaraci třídy.
Abstraktní třída může nebo nemusí obsahovat abstrakční metody (metody bez těla), ale pokud má třída alespoň jednu abstrakční metodu, musí být deklarována jako abstraktní. Metody bez abstraktů však lze použít pouze v abstraktní třídě, ale pouze k implementaci výchozího chování. Metody v abstraktní třídě mohou mít modifikátory přístupu, jako jsou soukromé, veřejné, statické a chráněné, v závislosti na úrovni viditelnosti. Abstraktní třídu nelze konkretizovat a neposkytuje 100% abstrakci, protože může mít konkrétní metodu.
Rozhraní sice vypadá jako třída, ale není. Protože Java nepodporuje vícenásobné dědictví, je někdy rozhraní ideální pro poskytnutí základu pro hierarchii tříd. Rozhraní je spíše plán třídy, která se také používá k dosažení abstrakce v Javě. Obsahuje abstraktní metody a statické konstanty. Zjednodušeně řečeno, rozhraní je kolekce abstraktních metod, které se používají k určení chování, které má třída implementovat. Na rozdíl od abstraktní třídy poskytuje rozhraní plnou abstrakci v Javě. Může mít metody i proměnné stejně jako třída, ale metody deklarované v rozhraní jsou ve výchozím nastavení abstraktní.
Abstraktní třída | Rozhraní |
Abstraktní klíčové slovo se používá k vytvoření abstraktní třídy a lze ji použít s metodami. | Klíčové slovo rozhraní se používá k vytvoření rozhraní, ale nelze jej použít s metodami. |
Třída může rozšířit pouze jednu abstraktní třídu. | Třída může implementovat více než jedno rozhraní. |
Abstraktní třída může mít jak abstraktní, tak ne abstraktní metody. | Rozhraní může mít pouze abstraktní metody. |
Proměnné nejsou ve výchozím nastavení konečné. Může obsahovat nekonečné proměnné. | Proměnné jsou ve výchozím nastavení v rozhraní konečné. |
Implementaci rozhraní může zajistit abstraktní třída. | Rozhraní nemůže zajistit implementaci abstraktní třídy. |
Může mít metody s implementacemi. | Poskytuje absolutní abstrakci a nemůže mít implementaci metod. |
Může mít veřejné, soukromé, statické a chráněné modifikátory přístupu. | Metody jsou implicitně veřejné a abstraktní v rozhraní Java. |
Nepodporuje vícenásobné dědictví. | Podporuje více dědictví. |
Je ideální pro opakované použití kódu a perspektivu vývoje. | Je ideální pro deklaraci typu. |
Pro abstrakci se používá abstraktní třída i rozhraní; mají však spravedlivý podíl na rozdílech. Hlavní rozdíl mezi těmito dvěma je způsoben abstrakčními metodami. Zatímco první může nebo nemusí mít abstraktní metody, druhá je implicitně abstraktní. Abstraktní třída může mít jak abstraktní, tak ne abstraktní metody. Rozhraní, na druhé straně, může mít pouze abstraktní metody, a proto nemůže mít implementaci, což jednoduše znamená, že rozhraní nemůže mít ne abstraktní metody. Nelze vytvořit instanci abstraktní třídy, která zakazuje vytváření objektu. Rozhraní, na druhé straně, může vypadat jako třída, ale není.