Co je dědičnost v jazyce Java?

Vývojáři navržili Java od začátku jako kompletní a objektově orientovaný programovací jazyk.

OOP a dědictví

Použití objektově orientovaného programování používá pojem dědičnosti pro rozšíření funkčnosti objektů. Přemýšlejte o tom, kdy programátor vytvoří objekt. Později zjistíte, že musíte vytvořit velmi podobný objekt s jen malými rozdíly (snad rozšířit funkci staršího objektu v novém kontextu). Zde se děje dědičnost. Objekt, který programátor "odvozuje" od jiného objektu "base" dědí metody a proměnné třídy a pak může přidat další funkce (jako v následujícím příkladu Java):

veřejná třída Sphere {public int radius; }}

veřejná třída Ball rozšiřuje kouli {public string color; / / Ball přidává proměnnou "color", ale také používá proměnnou "radius"}

Vícenásobné dědictví

V určitém okamžiku může být programátor pokoušen odvodit jednu třídu několika tříd. Toto je známé jako "více dědictví" a přestože se zdá být užitečné, může to způsobit problémy, například důležitý "diamantový problém". K tomuto problému dochází, pokud dvě třídy dědí ze stejné třídy (jako třídy B a C odvozené z třídy A), zatímco jiný třída (D) pochází z B a C. Když je vytvořen objekt D, systém jej zachází jako typ základní třídy (třída "míč" nebo míč a "koule" nebo koule, například). V problémech s diamanty nemůže systém rozhodně rozhodnout, která třída D (typ ABD nebo typ ACD?) Je ten, který způsobuje problémy.

Java a dědičná dědičnost

Kvůli problémům s dědičným dědictvím ji Java nedovoluje. Ale ve skutečnosti lze třídy získané z několika základních tříd dosáhnout bezpečným způsobem pomocí "rozhraní". Rozhraní je podobné třídě, ale definuje nejen strukturu třídy, ale i její skutečný kód. Základní třída, která implementuje rozhraní, nemusí nezbytně "dědit" funkčnost rozhraní: pouze slibuje využití její struktury. Vzhledem k tomu, že třída, která implementuje rozhraní, nedědí z jiné třídy (a není typem základní třídy), může programátor implementovat několik rozhraní používajících stejnou třídu.

Příklad: dědičnost a rozhraní

Následující příklad ukazuje rozdíl mezi dědičností objektů a rozhraním. Třída, která zdědí od druhého, získá přístup ke základní třídě, protože se v podstatě stává typem této třídy (jako u tříd "Ball" a "Sphere"). Třída, která implementuje rozhraní, pouze slibuje implementaci struktury jeho rozhraní: není to typ rozhraní:

rozhraní Základní {int doubleA (); // poznámka: v rozhraní není definován žádný reálný kód}

veřejná třída B implementuje Basic {

public int;

public int doubleA () // třída B musí definovat metodu "doubleA ()" pro implementaci "Basic" {return a * 2;}}