Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.

Podobné prezentace


Prezentace na téma: "Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída."— Transkript prezentace:

1 Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída B je potomkem třídy A vytvářená třída(potomek) do sebe absorbuje datové atributy a dědí metody z jiné třídy(předek) a dále je rozšiřuje a upravuje vytvářená třída(potomek) do sebe absorbuje datové atributy a dědí metody z jiné třídy(předek) a dále je rozšiřuje a upravuje

2 Dědění nám v odvozené třídě umožňuje vše, co bylo v základní třídě dobré, bez dalšího úsilí ponechat vše, co bylo v základní třídě dobré, bez dalšího úsilí ponechat vše, co nám chybělo, jednoduše dodat vše, co nám chybělo, jednoduše dodat vše, co se nám nelíbilo, změnit vše, co se nám nelíbilo, změnit 1. Dědičnost není pouze jednoúrovňová – potomek nějaké třídy může mít dále své potomky 2. Java podporuje jednonásobnou dědičnost tzn., že každá třída může mít jednoho předka tzn., že každá třída může mít jednoho předka

3 Realizace dědičnosti public class Obdélník { public int šířka; public int výška; public Obdélník ( int šířka, int výška) { this.šířka = šířka; this.výška = výška; } public double délkaÚhlopříčky() { double pom; pom = (šířka * šířka) + (výška * výška); return Math.sqrt(pom); } public int hodnotaŠířky() { return šířka; } public class Kvádr extends Obdélník { public int hloubka; // public Kvádr(int šířka, int výška, int hloubka) { super(šířka, výška); //voláme konstruktor v rodičovské třídě this.hloubka = hloubka; } public double délkaÚhlopříčky() { double pom = super.délkaÚhlopříčky(); pom = (pom * pom) + (hloubka * hloubka); return Math.sqrt(pom); } public static void main(String[] args) { Kvádr kva = new Kvádr(6, 8, 10); System.out.println(“Úhlopříčka: "+ kva.délkaÚhlopříčky()); System.out.println(“Šířka je: " + kva.hodnotaŠířky()); System.out.println("Výška je: " + kva.výška); }

4 třída Kvádr bude dědit od třídy Obdélník, tzn.,že převezme její proměnné instance šířka a výška a její metodu instance hodnotaŠířky() třída Kvádr bude dědit od třídy Obdélník, tzn.,že převezme její proměnné instance šířka a výška a její metodu instance hodnotaŠířky() konstruktor Obdélník() se nedědí, ale je ze třídy Kvádr využíván. Konstruktor rodičovské třídy se volá pomocí klíčového slova super a do závorek se dají skutečné parametry konstruktoru rodičovské třídy tj. zde Obdélník() konstruktor Obdélník() se nedědí, ale je ze třídy Kvádr využíván. Konstruktor rodičovské třídy se volá pomocí klíčového slova super a do závorek se dají skutečné parametry konstruktoru rodičovské třídy tj. zde Obdélník() ve třídě Kvádr využijeme zděděné proměnné šířka, výška ze třídy Obdélník a novou proměnnou hloubka. Totéž platí i o metodách instance z rodičovské třídy. ve třídě Kvádr využijeme zděděné proměnné šířka, výška ze třídy Obdélník a novou proměnnou hloubka. Totéž platí i o metodách instance z rodičovské třídy.

5 ve třídě Kvádr má metoda délkaÚhlopříčky() stejné jméno jako ve třídě Obdélník a stejné formální parametry(zde žádné). Tím došlo ve třídě Kvádr překrytí(overriding, zastínění- hiding) metody délkaÚhlopříčky() deklarované ve třídě Obdélník ve třídě Kvádr má metoda délkaÚhlopříčky() stejné jméno jako ve třídě Obdélník a stejné formální parametry(zde žádné). Tím došlo ve třídě Kvádr překrytí(overriding, zastínění- hiding) metody délkaÚhlopříčky() deklarované ve třídě Obdélník pokud bychom použili stejné jméno, ale jiné formální parametry, došlo by pouze k přetížení(overloading) této metody pokud bychom použili stejné jméno, ale jiné formální parametry, došlo by pouze k přetížení(overloading) této metody překrytou metodu lze volat prostřednictvím klíčového slova super(super.délkaÚhlopříčky()) překrytou metodu lze volat prostřednictvím klíčového slova super(super.délkaÚhlopříčky())

6 Problémy s neimplicitními konstruktory rodičovské třídy V rodiči je konstruktor bez parametrů nebo implicitní V rodiči je konstruktor bez parametrů nebo implicitní V potomkovi může být konstruktor implicitní. Pokud ale v potomkovi konstruktor existuje,nemusí si konstruktor potomka s voláním konstruktoru rodiče dělat starosti V potomkovi může být konstruktor implicitní. Pokud ale v potomkovi konstruktor existuje,nemusí si konstruktor potomka s voláním konstruktoru rodiče dělat starosti V rodiči je konstruktor alespoň s jedním parametrem V rodiči je konstruktor alespoň s jedním parametrem Konstruktor potomka musí existovat a jako svůj první příkaz musí volat pomocí super() konstruktor rodiče Konstruktor potomka musí existovat a jako svůj první příkaz musí volat pomocí super() konstruktor rodiče class Rodič { public int i; public Rodič(int parI) { i = parI; } // public Rodič() { i = 5; } } public class Potomek extends Rodič { public Potomek() { super(8); } public static void main(String[] args) { Potomek pot = new Potomek(); }

7 Finální metody nechceme-li, aby bylo možno metodu překrýt, deklarujeme ji jako konečnou, pomocí klíčového slova final nechceme-li, aby bylo možno metodu překrýt, deklarujeme ji jako konečnou, pomocí klíčového slova final pokud je v rodičovské třídě metoda označena jako final, můžeme ji ve zděděné třídě přetížit, tzn. final zabrání překrytí, ale nikoliv přetížení. pokud je v rodičovské třídě metoda označena jako final, můžeme ji ve zděděné třídě přetížit, tzn. final zabrání překrytí, ale nikoliv přetížení. class Rodič { public int x; public Rodič() { x = 1; } final int getX() { return x;} } public class Potomek extends Rodič { // int getX() { return x * 2; } // chyba // int getX( int a) { return a *x; } public static void main(String[ ] args) { Potomek pot = new Potomek(); System.out.println(" Hodnota je :" + pot.getX()); }

8 Abstraktní metody a třídy třídu, která obsahuje alespoň jednu abstraktní metodu, musíme také deklarovat jako abstraktní, tzn., že v její deklaraci před klíčovým slovem class uvedeme modifikátor abstract třídu, která obsahuje alespoň jednu abstraktní metodu, musíme také deklarovat jako abstraktní, tzn., že v její deklaraci před klíčovým slovem class uvedeme modifikátor abstract Abstraktní třída nemůže vytvářet vlastní samostatné instance Abstraktní třída nemůže vytvářet vlastní samostatné instance ve zděděné třídě je možné vynutit naprogramování této metody použitím klíčového slova abstract u metody v rodičovské třídě ve zděděné třídě je možné vynutit naprogramování této metody použitím klíčového slova abstract u metody v rodičovské třídě abstract class Rodič { public int i; public Rodič() { i = 1; } abstract int getI(); final void setI(int novéI) { i = novéI; } } public class Potomek extends Rodič { int getI() { return i * 2; } void setI() { i = 5; } // přetížená public static void main(String[] args) { // Rodič rod = new Rodič(); // chyba Potomek pot = new Potomek(); pot.setI(3); System.out.println("Hodnota je: " + pot.getI()); pot.setI(); // přetížená System.out.println("Hodnota je: " + pot.getI()); }

9 Finální třídy nechceme-li aby bylo možno odvozovat od třídy potomky, deklarujeme ji jako konečnou. Před class přidáme final nechceme-li aby bylo možno odvozovat od třídy potomky, deklarujeme ji jako konečnou. Před class přidáme final třída nemůže být současně konečná a abstraktní třída nemůže být současně konečná a abstraktní finální třídy mohou být optimalizovány při překladu finální třídy mohou být optimalizovány při překladu u finálních tříd není možné využít polymorfismus u finálních tříd není možné využít polymorfismus final class Rodič { public int i; public Rodič() { i = 1; } // abstract int getI(); // chyba void setI(int novéI) { i = novéI; } }

10 Překrytí proměnné tak, jako je možné překrýt metodu rodičovské třídy, je možné překrýt i proměnnou této třídy tak, jako je možné překrýt metodu rodičovské třídy, je možné překrýt i proměnnou této třídy k překryté instanční proměnné se lze dostat v metodách instance pomocí klíčového slova super k překryté instanční proměnné se lze dostat v metodách instance pomocí klíčového slova super ve statických metodách není tento přístup možný, protože statické metody nemohou používat proměnné instance ve statických metodách není tento přístup možný, protože statické metody nemohou používat proměnné instance class Rodič { public int i; static public long j; } public class Potomek extends Rodič { public long i; static public int j; public Potomek(long novéI) { i = novéI; super.i = 5; } public static void main(String[] args) { Rodič.j = 6; Potomek.j = 7; }


Stáhnout ppt "Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída."

Podobné prezentace


Reklamy Google