Java 8 zavedla defaultní metody v rozhraní, čímž trochu smyla rozdíl mezi rozhraním a abstraktní třídou. V tomto příspěvku se tedy podíváme blíže na rozhraní, jejich defaultní metody, abstraktní třídy a rozdíly mezi rozhraními a abstraktními třídami. Defaultním metodám se věnoval i tento dřívější příspěvek.
Rozhraní:
Může obsahovat statické metody.
Může obsahovat metody, které jsou implementovány (mají tělo).
Pro implementaci rozhraní se používá klíčové slovo implements.
Rozhraní nemůže mít instanční proměnné.
Rozhraní může mít pouze proměnné typu public static final (konstanty).
Metody v rozhraní jsou defaultně public abstract.
Defaultní metody:
Byly zavedeny v Javě 8.
Defaultní metoda umožňuje mít implementaci metody v rozhraní.
Defaultní metody v rozhraní nám umožňují přidávat do rozhraní nové metody bez toho, abychom rozbili původní kód.
Metoda označená jako default musí být v rozhraní implementována.
Abstraktní třída:
Metody, které neimplementuje, musí být označeny jako abstract.
Abstaktní metody nemohou mít tělo. Nemohou být v abstraktní třídě implementovány.
Může obsahovat instanční proměnné.
Statické metody nemohou být označeny jako abstract.
Rozdíl mezi rozhraním a abstraktní třídou:
Rozhraní nemá konstruktor.
Rozhraní může obsahovat pouze konstanty (public static final), kdežto v abstraktní třídě mohou být deklarovány i proměnné jiného typu (třídní, statické nefinální, privátní, …). Abstraktní třídy tedy mohou mít stav.
A hlavně jak bylo napsáno v jedné odpovědi na Stackoverflow: „The main difference between an abstract class and interface in Java 8 is the fact that an abstract class is a class and an interface is an interface.“ (Třída je třída a rozhraní je rozhraní 🙂 ).