Java: Abstraktní třídy, dědičnost a rozhraní

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Přidán příklad z Greenfootu a klíčové slovo '''super'''.)
(Doplnění abstraktních tříd.)
 
Řádka 2: Řádka 2:
  
 
== Dědičnost ==
 
== Dědičnost ==
; Zápis dědičnosti
+
 
 
* Klíčové slovo <code>extends</code>.
 
* Klíčové slovo <code>extends</code>.
 
* Třída může mít pouze jednu rodičovskou třídu!
 
* Třída může mít pouze jednu rodičovskou třídu!
Řádka 8: Řádka 8:
 
* Potomek může kdykoli nahradit předka. Takže pokud máme proměnnou datového typu <code>Predek</code>, můžeme do ní uložit instanci třídy <code>Potomek</code>. Opačně to však nejde!
 
* Potomek může kdykoli nahradit předka. Takže pokud máme proměnnou datového typu <code>Predek</code>, můžeme do ní uložit instanci třídy <code>Potomek</code>. Opačně to však nejde!
  
; Překrývání metod
+
<div class="Priklad">
 +
public class Zivocich {
 +
    ...
 +
}
 +
public class Moucha '''extends''' Zivocich {
 +
    ...
 +
}
 +
</div>
 +
 
 +
 
 +
=== Překrývání metod ===
 
* Potomek automaticky dědí všechny metody předka. Ty může používat jako vlastní metody.
 
* Potomek automaticky dědí všechny metody předka. Ty může používat jako vlastní metody.
 
* Potomek ale může metodu nadefinovat znovu, čímž ''překryje'' (''override'') původní chování metody předka.
 
* Potomek ale může metodu nadefinovat znovu, čímž ''překryje'' (''override'') původní chování metody předka.
; Příklady
+
 
 
<div class="Priklad">
 
<div class="Priklad">
  public class Zivocich extends Actor {
+
  public class Zivocich {
 
     ...
 
     ...
     public void act() { this.move(5); } ''// Živočichové se pohybují vpravo.''
+
     public void hybejSe() { this.move(5); } ''// Živočichové se pohybují vpravo.''
 
     ...
 
     ...
 
  }
 
  }
Řádka 21: Řádka 31:
 
     ...
 
     ...
 
     '''@Override'''
 
     '''@Override'''
     public void act() {  
+
     public void hybejSe() {  
 
         this.turn(30);  
 
         this.turn(30);  
 
         ''// Moucha se nebude pohybovat, jen se bude točit na místě!''
 
         ''// Moucha se nebude pohybovat, jen se bude točit na místě!''
Řádka 29: Řádka 39:
 
</div>
 
</div>
  
; Odkaz na kód předka
+
=== Odkaz na kód předka ('''super''') ===
 
* Klíčové slovo <code>super</code>.
 
* Klíčové slovo <code>super</code>.
 
* Můžeme odkazovat:
 
* Můžeme odkazovat:
Řádka 77: Řádka 87:
 
; Deklarace rozhraní
 
; Deklarace rozhraní
  
 +
<div class="Priklad">
 
  public interface Zasahnutelne {
 
  public interface Zasahnutelne {
     public void zasah(Strela s);
+
     public void zasah(Strela s)''';'''
 
         ''// Neříkáme, '''jak''' se má objekt chovat.''  
 
         ''// Neříkáme, '''jak''' se má objekt chovat.''  
 
         ''// Jen vyžadujeme, že '''bude mít''' tuto metodu.''
 
         ''// Jen vyžadujeme, že '''bude mít''' tuto metodu.''
 
  }
 
  }
 +
</div>
  
 
; Třída, která implementuje rozhraní
 
; Třída, která implementuje rozhraní
 
+
<div class="Priklad">
  public class Prisera {
+
  public class Prisera '''implements''' Zasahnutelne {
 
   
 
   
 
     ''...''  
 
     ''...''  
Řádka 95: Řádka 107:
 
         this.getWorld().removeObject(this);
 
         this.getWorld().removeObject(this);
 
     }
 
     }
 +
</div>
  
 
== Abstraktní třída ==
 
== Abstraktní třída ==
 
* Klíčové slovo <code>abstract</code>.
 
* Klíčové slovo <code>abstract</code>.
* Těla některých metod nejsou uvedena.
+
* Nelze vytvořit instance této třídy.
 +
* Abstraktní třídu lze ale použít jako společného předka dalších metod, které už abstraktní být nemusí.
 +
 
 +
<div class="Priklad">
 +
public '''abstract''' class Predmet {
 +
 +
    ''...''
 +
}
 +
</div>
 +
 
 +
=== Abstraktní metody ===
 +
* Abstraktní třída může mít abstraktní metody.
 +
* U&nbsp;takových metod není uveden kód, který se bude provádět, pouze fakt, že metoda ve třídě musí být.
 +
* Pokud potomci nebudou abstraktní, musí ke každé abstraktní metodě uvést konkrétní kód.
 +
 
 +
<div class="Priklad">
 +
public '''abstract''' class Predmet {
 +
    '''...'''
 +
 
 +
    public '''abstract''' void pouzij()''';'''
 +
 
 +
    '''...'''
 +
}
 +
 
 +
public class Mic extends Predmet {
 +
 
 +
    '''...'''
 +
 +
    public void pouzij()
 +
    {
 +
        ''... // Co se má stát při volání metody pouzij().''
 +
    }
 +
 
 +
    '''...'''
 +
}
 +
</div>
  
  
Řádka 114: Řádka 162:
 
* Je jakýmsi mezistupněm, kdy přebíráme kód jen některých metod.
 
* Je jakýmsi mezistupněm, kdy přebíráme kód jen některých metod.
 
* Nelze vytvářet instance abstraktní třídy.
 
* Nelze vytvářet instance abstraktní třídy.
 
 
== Odkaz na předka &mdash; <code>super</code> ==
 
* Jsou situace, kdy potřebujeme změnit chování některé metody předka v potomkovi. Mluvíme o překrývání metod.
 
* Pokud potřebujeme v potomkovi přesto použít metodu předka, použijeme k tomu klíčové slovo <code>super</code>.
 
* Klíčovým slovem <code>super</code> lze také zavolat konstruktor předka.
 
  
  
Řádka 146: Řádka 188:
 
  }
 
  }
  
<div class="Varovani">Pozor, musíme si být stoprocentně jisti, že objekt, který je uložen v proměnné datového typu <code>Predek</code> je ve skutečnosti opravdu datového typu <code>Potomek</code>. Pokud by nebyl, běh programu by skončil výjimečný stavem a aplikace by havarovala.</div>
+
<div class="Varovani">Pozor, musíme si být stoprocentně jisti, že objekt, který je uložen v&nbsp;proměnné datového typu <code>Predek</code> je ve skutečnosti opravdu datového typu <code>Potomek</code>. Pokud by nebyl, běh programu by skončil výjimečný stavem a aplikace by havarovala.</div>
  
 
== Související stránky ==
 
== Související stránky ==
 
* [[Objektově orientované programování]]
 
* [[Objektově orientované programování]]

Aktuální verze z 24. 2. 2020, 14:31


Obsah

Dědičnost

public class Zivocich {
    ...
}
public class Moucha extends Zivocich {
    ...
}


Překrývání metod

public class Zivocich {
    ...
    public void hybejSe() { this.move(5); } // Živočichové se pohybují vpravo.
    ...
}
public class Moucha extends Zivocich {
    ...
    @Override
    public void hybejSe() { 
        this.turn(30); 
        // Moucha se nebude pohybovat, jen se bude točit na místě!
    }
    ...
}

Odkaz na kód předka (super)

Příklady
public class Kamion {
    int nosnost;
    ...
    public int getNosnost() { return this.nosnost; }
    ...
}
public class KamionSPrivesem extends Kamion {
    Prives prives;
    ...
    @Override
    public int getNosnost() { 
        int nosnostKamionu = super.getNosnost(); // Volání překryté metody předka.
        return nosnostKamionu+this.prives.getNosnost(); 
    }
    ...
}
public class World {
    ...
    public World(int rozmerX, int rozmerY, int dilek) { ... }
    ...
}
public class MyWorld extends World {
    ...
    public MyWorld() { 
        super(600, 400, 1); // Volání konstruktoru předka.
    }
    ...
}

Rozhraní

Deklarace rozhraní
public interface Zasahnutelne {
    public void zasah(Strela s);
        // Neříkáme, jak se má objekt chovat. 
        // Jen vyžadujeme, že bude mít tuto metodu.
}
Třída, která implementuje rozhraní
public class Prisera implements Zasahnutelne {

    ... 
    ... Může mít různé metody a atributy, ale musí mít metodu zasah(...)!!!
    ...

    public void zasah(Strela s) {
        // Popíšeme, jak se má reagovat na zprávu/metodu zasah(...).
        this.getWorld().removeObject(this);
    }

Abstraktní třída

public abstract class Predmet {

    ... 
}

Abstraktní metody

public abstract class Predmet {
    ...
    public abstract void pouzij();
    ...
}
public class Mic extends Predmet {
    ...

    public void pouzij()
    {
        ... // Co se má stát při volání metody pouzij().
    }
    ...
}


Srovnání konceptů

Dědičnost
Rozhraní
Abstraktní třída


Přetypování

Příklady přetypování
Prekazka prekazka = (Prekazka) this.getOneIntersectingObject(Prekazka.class);
if (prekazka != null) {
    int prekazka.getPruhlednost();
    ...
}
public void actionPerformed(ActionEvent event) {
    Button zdroj = (Button) event.getSource();
    zdroj.getTitle();
    ...
}
Pozor, musíme si být stoprocentně jisti, že objekt, který je uložen v proměnné datového typu Predek je ve skutečnosti opravdu datového typu Potomek. Pokud by nebyl, běh programu by skončil výjimečný stavem a aplikace by havarovala.

Související stránky

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje