V některých situacích je výhodné vytvořit jedinou bázovou třídu pro více tříd odpovídajících konkrétním objektům, i když tato samotná bázová třída žádnému konkrétnímu objektu neodpovídá. Může ovšem nést některá data a poskytovat metody, které jsou odvozeným třídám společné. Taková třída se pak nazývá abstraktní a je označena klíčovým slovem abstract. Překladač jazyka Java pak zajistí, že instanci abstraktní třídy nelze operátorem new přímo vytvořit, mohou se vytvářet pouze instance konkrétních tříd.
Abstraktní třída může deklarovat některé společné metody a poskytovat jejich základní implementaci. Pokud odvozená třída takovou metodu nepředefinuje, pak se pro její instance použije implementace poskytnutá v bázové třídě.
Mohou však nastat i situace, kdy skutečně vyžadujeme, aby odvozené třídy určitou metodu vždy definovaly. Takovou metodu pak také nazýváme abstraktní a označujeme klíčovým slovem abstract, navíc u ní není uvedeno tělo a hlavička metody je zakončena středníkem. Pokud odvozená třída některou abstraktní metodu neimplementuje, musí být také označena jako abstraktní. Tím je zajištěno, že instance konkrétních tříd mají všechny metody implementované.
Výsledné řešení můžeme otestovat takovým způsobem, že vytvoříme pole několika obrazců a pak pro ně postupně vypočteme jednotlivé hodnoty. Povšimněte si toho, jakým způsobem můžeme inicializovat pole objektů (v Javě je pole také objekt, proto se vytváří operátorem new stejně jako jiné objekty).
class TestObrazcu { public static void main(String[] args) { Obrazec[] pole = new Obrazec[] { new Obdelnik(0,0,2,5), new Ctverec(0,0,4), new Kruh(0,0,1) }; for(int i = 0; i < pole.length; i++ ) { System.out.print ("pole["+i+"]:"); System.out.print (" obvod=" + pole[i].obvod()); System.out.println(" obsah=" + pole[i].obsah()); } } }