6. Programování v jazyce JAVA: vlastnosti a koncepce jazyka. Principy objektového programování.



PREVIOUS

Chapter 1 Objektové programování

Objektově orientované programování (zkracováno na OOP) je metodika vývoje softwaru, založená na následujících myšlenkách, koncepci:
  1. Objekty – jednotlivé prvky modelované reality (jak data, tak související funkčnost) jsou v programu seskupeny do entit, nazývaných objekty. Objekty si pamatují svůj stav a navenek poskytují operace (přístupné jako metody pro volání).
  1. Abstrakce – programátor, potažmo program, který vytváří, může abstrahovat od některých detailů práce jednotlivých objektů. Každý objekt pracuje jako černá skříňka, která dokáže provádět určené činnosti a komunikovat s okolím, aniž by vyžadovala znalost způsobu, kterým vnitřně pracuje.
  1. Zapouzdření – zaručuje, že objekt nemůže přímo přistupovat k „vnitřnostem“ jiných objektů, což by mohlo vést k nekonzistenci. Každý objekt navenek zpřístupňuje rozhraní, pomocí kterého (a nijak jinak) se s objektem pracuje.
  1. Skládání – Objekt může obsahovat jiné objekty.
  1. Delegování – Objekt může využívat služeb jiných objektů tak, že je požádá o provedení operace.
  1. Dědičnost – objekty jsou organizovány stromovým způsobem, kdy objekty nějakého druhu mohou dědit z jiného druhu objektů, čímž přebírají jejich schopnosti, ke kterým pouze přidávají svoje vlastní rozšíření. Tato myšlenka se obvykle implementuje pomocí rozdělení objektů do tříd, přičemž každý objekt je instancí nějaké třídy. Každá třída pak může dědit od jiné třídy (v některých programovacích jazycích i z několika jiných tříd).
  1. Polymorfismus – odkazovaný objekt se chová podle toho, jaké třídy je instancí. Pokud několik objektů poskytuje stejné rozhraní, pracuje se s nimi stejným způsobem, ale jejich konkrétní chování se liší podle implementace. U polymorfismu podmíněného dědičností to znamená, že na místo, kde je očekávána instance nějaké třídy, můžeme dosadit i instanci libovolné její podtřídy, neboť rozhraní třídy je podmnožinou rozhraní podtřídy. U polymorfismu nepodmíněného dědičností je dostačující, jestliže se rozhraní (nebo jejich požadované části) u různých tříd shodují, pak jsou vzájemně polymorfní.
Objektový přístup programování trochu jinak:
  • Modelování problému jako systému spolupracujících tříd
  • Třída modeluje jeden koncept
  • Třídy umožní generování instancí, objektů příslušné třídy
  • Jednotlivé objekty spolu spolupracují, „posílají si zprávy“,
  • Třída je „vzorem“ pro strukturu a vlastnosti generovaných objektů
  • Každý objekt je charakteristický specifickými hodnotami svých atributů a společnými vlastnostmi třídy

1.1 Třída

Třída je základem uživatelského programu v jazyku Java (nebo obecně v OOP). Třída = koncept. Každá třída je reprezentována svými prvky, objekty dané třídy. Každá třída je charakterizována svými vlastnostmi, svými funkčními možnostmi a svými parametry. Třída tedy popise nějaký “objekt” reálného problému a udržuje jeho parametry a poskytuje metody pro práci s ním. Třída v bodech:
  • musí být deklarována hlavní funkce main (NOTE: bylo v přednášce, ale není to pravda, třídy bez třídy main se běžně používá, např. jako knihovna). Funkce main musí být statická, volá se ještě před vytvořením nějaké instance, slouží pro spuštění programu, testování.
  • jsou deklarovány další (static) funkce (či procedury) třídy, případně i v jiných třídách: projekt, package
  • mohou být deklarovány statické proměnné, které jsou použitelné jako nelokální proměnné ve funkcích dané třídy
  • program probíhá spuštěním příkazů metody main
Třída je definována množinou identifikátorů, které mají třídou definovaný význam:
– data: proměnné, konstanty (členské proměnné, datové složky, atributy)
– metody: pracovně funkce a procedury
1.1.1 Třída = předpis vs. Objekt = instance třídy
Třída jako šablona pro generování konkrétních instancí třídy, tzv. objektů. Jednotlivé instance třídy (objekty) mají stejné metody, ale nacházejí se v různých stavech – Stav objektu je určen hodnotami instančních, členských proměnných. Schopnosti objektu jsou dány instančními metodami třídy. V jazyku Java lze objekty (instance tříd) vytvářet pouze dynamicky pomocí operátoru new a přistupovat k nim pomocí referenčních proměnných (podobně jako u pole). Třída bez vytvořené instance (objektu) může „pracovat“ pouze „staticky“ (mohou být použity jen její statické metody či proměnné – procedurální přístup). Statické proměnné = společné pro všechny instance třídy.
1.1.2 Konstruktor třídy
Konstruktory = speciální metody pro generování instancí tříd, konkrétních objektů.
  • vytvoří objekt
  • případně nastaví vlastnosti objektu
  • jméno konstruktoru je totožné se jménem třídy (jediná metoda začínající velkým písmenem)
  • volání pomocí operátoru new, např. malyObdelnik = new Obdelnik(2,5);
  • neosahuje návratový typ - nic nevrací, vytváří objekt
  • není-li konstruktor vytvořen, je vygenerován implicitní konstruktor s prázdným seznamem parametrů – je-li konstruktor deklarován, implicitní zaniká
1.1.2.1 Přetěžování (nejen konstruktoru třídy)
Umožňuje objektům volání jedné metody se stejným jménem, ale s jinou implementací. Provádí se to tak, že se deklaruje více metod se stejným názvem, které se mohou lišit různým počtem, typem argumentů popř. jejich pořadím. Umožňuje volat vytvoření instance s různými parametry - různým počtem i typem parametrů. Př.:
public class Obdelnik { 
// vsechny konstruktory lze pouzit zvenci pro vytvoreni objektu
// kontruktor pro volani se vsemi tremi vlastnostmi,
Obdelnik(int s, int v, Color c){ 
sirka = s;
vyska = v;
barva = c;
}