Objektově orientované programování

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Vytvoření stránky)
 
(Realizace konstruktů OOP v Javě: Kompletně přepsáno)
Řádka 59: Řádka 59:
 
**jinak používáme skládání + delegování
 
**jinak používáme skládání + delegování
  
== Realizace konstruktů OOP v Javě ==
+
== Zápis konstruktů OOP v Javě ==
* Každý objekt je instancí některé třídy.
+
=== Objekty, třídy ===
* Univerzální předek je třída Object, ostatní třídy jsou jejími potomky.
+
*Každý objekt je instancí některé třídy
;Metody
+
*univerzální předek je třída Object
*popisují, jak objekt reaguje na zprávu
+
**ostatní třídy jsou jejími potomky
*parametry
+
; Vytváření objektů
*návratový typ (příkaz <code>return</code>)
+
*operátor new
*přetěžování (overloading) metod
+
*konstruktor
**× overlaying (překrývání)
+
**implicitní konstruktor
**metody se mohou lišit počtem parametrů a jejich typem (nebo obojím)
+
=== Zprávy ===
*atomizace metod
+
* Reakci objektu na zprávu popisují metody:
**metoda by měla řešit jednu konkrétní věc
+
; Metoda má:
**pro dílčí podúkoly by měla delegovat volání na další metody či jiné objekty
+
* název
**délka metody bez deklarace proměnných cca 5 řádků
+
* parametry (mají typ a název)
*Instanční a třídní proměnné
+
* návratový typ (používá se klíčové slovo <code>return</code>)
*Vytváření objektů
+
; Přetěžování metod  (overloading)
**konstruktor
+
*Jedna třída může mít více metod se stejným jménem.
***implicitní
+
*Metody se stejným jménem se musí lišit:
**operátor new
+
**počtem parametrů
*Dědičnost × rozhraní
+
**typem parametrů
**Rozhraní
+
**(nebo obojím)
***nemá implementaci metod
+
; Překrývání metod (overlaying)
**Abstraktní třída
+
*souvisí s dědičností a polymorfismem
***některé metody jsou abstraktní
+
*potomek může na stejnou zprávu reagovat jinak, než předek
**překrývání metod
+
** pak říkáme, že metoda v potomkovi „překrývá“ metodu předka
**přístupnost metod a atributů
+
; Atomizace metod
***modifikátory
+
*metoda by měla řešit jednu konkrétní věc
;Operátory
+
*pro dílčí podúkoly by měla delegovat volání na další metody či jiné objekty
 +
*délka metody bez deklarace proměnných cca 5 řádků
 +
=== Atributy ===
 +
*Atributy jsou realizovány proměnnými.
 +
; Instanční proměnné
 +
*Každá instance má svoji vlastní hodnotu.
 +
*:Například třída UcebniSkupina může mít atribut počet žáků (kteří do dané skupiny chodí). Odpovídající proměnná musí být instanční, protože každá učební skupina může mít jiný počet žáků. (Je to vlastnost konkrétní skupiny.)
 +
*Zabírají paměť tolikrát, kolik instancí třídy vytvoříme.
 +
; Třídní proměnné
 +
* klíčové slovo <code>static</code>
 +
*Hodnota je společná pro všechny instance dané třídy.
 +
*:Například je-li maximální počet žáků v učební skupině dán zákonem (pro všechny učební skupiny stejný), pak tento atribut budeme realizovat třídní proměnnou třídy UcebniSkupina.
 +
*Zabírají paměť jen jednou, bez ohledu na počet instancí.
 +
; Přístupnost metod a atributů (určena modifikátory)
 +
*<code>private</code>
 +
**přístupnost pouze ze tříd v jednom balíčku
 +
**implicitní volba (zvoleno automaticky, když neuvedeme)
 +
*<code>protected</code>
 +
**přístupnost navíc ze tříd, které jsou potomky třídy, kde je použito
 +
*<code>public</code>
 +
**přístupnost z libovolné třídy
 +
=== Dědičnost ===
 +
*Klíčové slovo <code>extends</code>.
 +
*Třída může mít pouze jednu rodičovskou třídu!
 +
=== Abstraktní třída ===
 +
*Klíčové slovo <code>abstract</code>
 +
*Některé metody jsou abstraktní:
 +
**nemají tělo
 +
**uvádíme pouze hlavičku
 +
*Těla abstraktních metod budou doplněna v potomcích třídy.
 +
*Nelze vytvořit instanci abstraktní třídy.
 +
=== Rozhraní (interface) ===
 +
*„Čistě abstraktní třída“.
 +
*Všechny metody jsou abstraktní.
 +
*Klíčové slovo <code>implements</code>.
 +
*Třída může implementovat více rozhraní.
 +
<div class="Poznamka">
 +
Nepleťte s pojmem „rozhraní třídy“ ve smyslu souhrnu všech metod!<br />
 +
Pokud implementujeme interface, pak „slibujeme“, že součástí rozhraní třídy jsou minimálně metody, zahrnuté v interface.
 +
</div>
 +
=== Operátory <code>this</code> a <code>super</code> ===
 
* <code>this</code>... odkaz na objekt, jehož metodu právě provádíme.
 
* <code>this</code>... odkaz na objekt, jehož metodu právě provádíme.
 
* <code>super</code>... odkaz na rodičovskou třídu (používáme typicky v konstruktoru nebo k volání překrytých metod).
 
* <code>super</code>... odkaz na rodičovskou třídu (používáme typicky v konstruktoru nebo k volání překrytých metod).

Verze z 23. 5. 2012, 23:38


Obsah

Co je to OOP?

Základní paradigma OOP

Cíle

Model systému pohledem OOP (konstrukty OOP)

Objekt
Zprávy, rozhraní
třída a instance
Atributy
Stav objektu

Rysy OOP

Abstrakce (abstraction)
Zapouzdření (encapsulation)
Polymorfismus (polymorphism)
Skládání (agregation)
Delegování (delegation)
Dědičnost (inheritance)

Zápis konstruktů OOP v Javě

Objekty, třídy

Vytváření objektů

Zprávy

Metoda má
Přetěžování metod (overloading)
Překrývání metod (overlaying)
Atomizace metod

Atributy

Instanční proměnné
Třídní proměnné
Přístupnost metod a atributů (určena modifikátory)

Dědičnost

Abstraktní třída

Rozhraní (interface)

Nepleťte s pojmem „rozhraní třídy“ ve smyslu souhrnu všech metod!
Pokud implementujeme interface, pak „slibujeme“, že součástí rozhraní třídy jsou minimálně metody, zahrnuté v interface.

Operátory this a super

Příklady použití rysů OOP v knihovnách Javy

Polymorfismus
Skládání

Zdroje

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