Ve třetím díle překladu oficiálního Java tutoriálu se zaměříme na teorii objektově orientovaného programování.
Jestliže jste dosud nikdy nepoužívali objektově orientovaný jazyk, budete se muset prvně naučit základní koncepty, než začnete psát první kód. Tato lekce vás uvede do objektů, tříd, dědičnosti, rozhraní a balíčků. Každá část dílu ukazuje na to, jak jsou jednotlivé pojmy propojeny s reálným světem a zároveň vás uvede do základů programovacího jazyka Java.
Co je to Objekt?
Objekty jsou klíčem k pochopení technologie objektově orientovaného programování. Podíváte-li se nyní kolem sebe, jistě uvidíte spoustu příkladů objektů z reálného světa: váš pes, váš stůl, vaše televize, vaše kolo.
Reálné objekty sdílí dvě charakteristiky: všechny mají stavy a akce. Psi mají stavy (jméno, barva, rasa, hlad) a akce (štěkání, vrčení, vrtění ocasem). Jízdní kola mají taktéž stavy (momentální otáčky pedálu, zařazený stupeň, momentální rychlost) a akce (změna vybavení, přehození stupně, použití brzd). Identifikace stavů a akcí reálných objektů je dobrá cesta, jak začít myslet v rámci objektově orientovaného programování.
Nyní se chvíli dívejte kolem sebe a hledejte reálné objekty. Pro každý objekt, který uvidíte, si položte tyto dvě otázky: „Jaké možné stavy tento objekt může mít?“ a „Jaké možné akce může tento objekt vykonat?“.Vypište si výsledky vašeho pozorování. Poté, co to uděláte, si všimněte, že reálné objekty se velice liší ve své komplexnosti; vaše stolní lampa má pouze dva možné stavy (vypnuto a zapnuto) a dvě možné akce (zapnout a vypnout), ale vaše stolní rádio může mít mnohem více stavů (vypnuto, zapnuto, momentální hlasitost, naladěná stanice) a akcí (vypnout, zapnout, zesílit zvuk, zeslabit zvuk, najít stanici, změnit frekvenci). Možná najdete objekty, které obsahují jiné objekty. Tyto věci lze do softwaru přeložit pomocí objektově orientovaného programování.
Softwarové objekty sdílí stejný koncept jako objekty z reálného světa: taktéž obsahují stavy a příbuzné akce. Objekt ukládá své stavy ve vlastnostech (v některých programovacích jazycích členské proměnné) a příslušné akce nabízí přes metody (v některých programovacích jazycích členské funkce). Metody operují nad interními stavy objektu a jsou předurčeny k prvotnímu způsob komunikace mezi dvěma objekty. Skrývání interních stavů a jejich nabízení prostřednictvím metod se nazývá zapouzdření dat – jeden ze základních kamenů objektově orientovaného programování.
Ukažme si to na příkladu jízdního kola:
Uchováváním stavů (momentální rychlost, zařazený stupeň a otáčky) a poskytováním metod pro jejich změnu zůstává objektům možnost kontrolovat, jak okolní svět zachází s hodnotami stavů. Například, pokud má objekt přehazovačku, která má pouze 6 stupňů, měla by metoda pro změnu zařazeného stupně odmítnout jakoukoli hodnotu, která je menší než 1 a větší než 6.
Zapouzdřením kódu do jednotlivých softwarových objektů získáme spoustu výhod, mezi které patří:
- Modularita: Zdrojový kód objektu může být napsán a spravován nezávisle na zdrojovém kódu jiných objektů. Jakmile je jednou objekt vytvořen, může být jednoduše předáván přes celý systém.
- Skrývání informací: Kvůli interakci s vlastnostmi objektu pouze přes jeho metody umožňuje objektu skrýt implementační detaily před okolním světem.
- Opětovné používání kódu: Jestliže již jednou objekt existuje (byl možná napsán jiným softwarovým vývojářem), můžete tento objekt snadno používat ve svém programu. Toto umožňuje specialistům vyvinout/otestovat/vyladit specifické objekty, které můžete s důvěrou ve svém programu využít.
- Rozšiřitelnost a snadné ladění: Jestliže začne být nějaký objekt problémový, můžete jej snadno vyjmout ze svého programu a nahradit jej jiným. Toto je analogické s řešením mechanických problémů reálného světa. Jestliže se pokazí brzdy, vyměníte pouze je, ne celé auto.
Co je to Třída?
V reálném světě často najdete příklady objektů, které jsou stejného druhu. Mohou existovat tisíce jízdních kol, které jsou jako jeden model vyrobeny stejně. Každé z jízdních kol bylo vyrobeno podle stejného návrhu a mají stejné komponenty. V objektově orientované terminologii můžeme říct, že právě jedno jízdní kolo je instancí jedné třídy objektů, známé jako jízdní kola.
Třída je návrh, podle kterého jsou jednotlivé objekty vytvářeny.
Následující třída Bicycle
je jedna z možných implementací třídy jízdního kola:
class Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:"+cadence+" speed:"+speed+" gear:"+gear);
}
}
Syntaxe programovacího jazyka Java vám nyní může připadat nová, ale návrh této třídy je založen na předchozích návrzích jízdního kola. Vlastnosti cadence
, speed
a gear
reprezentují možné stavy objektu a metody (changeCadence
, changeGear
, speedUp
, aj.) definují, jak bude objekt komunikovat s okolním světem.
Můžete si všimnout, že třída Bicycle
neobsahuje metodu main
. To je z toho důvodu, protože se nejedná o úplnou aplikaci; jedná se pouze o návrh jízdního kola, který může být použit v aplikaci. Zodpovědnost za vytváření a používání nových objektů třídy Bicycle
leží na nějaké jiné třídě vaší aplikace.
Zde je třída BicycleDemo
, která vytváří dva oddělené objekty třídy Bicycle
a volá jejich metody:
class BicycleDemo {
public static void main(String[] args) {
// Create two different Bicycle objects
Bicycle bike1 = new Bicycle();
Bicycle bike2 = new Bicycle();
// Invoke methods on those objects
bike1.changeCadence(50);
bike1.speedUp(10);
bike1.changeGear(2);
bike1.printStates();
bike2.changeCadence(50);
bike2.speedUp(10);
bike2.changeGear(2);
bike2.changeCadence(40);
bike2.speedUp(10);
bike2.changeGear(3);
bike2.printStates();
}
}
Výstup tohoto programu vypíše koncový stupeň, rychlost a vybavení pro dvě jízdní kola:
cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3
Co je to dědičnost?
Různé druhy reálných objektů mají spoustu stejných vlastností s jinými druhy objektů. Horská, silniční, tandemová kola například sdílí charakteristiky jízdního kola (rychlost, přehoz). Každý z nich však přidává nové vlastnosti, které ho oddělují: tandemová kola mají dvoje sedátka a řídítka; silniční kola odstraňují sedátka; některá horská kola mají přídavný řetěz.
Objektově orientované programování umožňuje třídám dědit obecně používané stavy a akce od jiných tříd. V našem příkladě se třída Bicycle
stane rodičem (superclass) tříd MountainBike
, RoadBike
a TandemBike
. V programovacím jazyce Java je povoleno, aby každá třída měla pouze jednoho přímého rodiče, ale může mít neomezená množství potomků (subclasses):
Syntaxe vytvoření potomka jiné třídy je snadné. Na začátku definice vaší třídy uveďte klíčové slovo extends
následované jménem třídy, od které chcete potomka odvodit:
class MountainBike extends Bicycle {
// zde budou přidané vlastnosti a metody
}
Toto dává třídě MountainBike
stejné vlastnosti a metody, jako má Bicycle
, a zároveň to umožňuje přidat kód, který třídu učiní jedinečnou. Kód potomka se stává lépe čitelným. Nicméně, musíte se pečlivě starat o dokumentaci každé metody a vlastnosti v rodiči, neboť tyto vlastnosti nejsou součástí zdrojového kódu potomka.
Co je to rozhraní?
Jak jste se již naučili, metody definují, jak objekt komunikuje s okolním světem. Metody formují rozhraní s okolním světem; například tlačítka ve předu televize jsou rozhraní mezi vámi a elektrickými obvody na zadní straně plastového obalu. Pomocí tlačítka Power můžete televizi vypnout a zapnout.
V jeho nejběžnější formě je rozhraní (interface) skupina metod s prázdnými těly. Akce jízdního kola, pokud je specifikujeme jako rozhraní, mohou vypadat například takto:
interface Bicycle {
void changeCadence(int newValue);
void changeGear(int newValue);
void speedUp(int increment);
void applyBrakes(int decrement);
}
Pro implementaci tohto rozhraní musíte změnit název vaší třídy (například na ACMEBicycle
) a použít klíčové slovo implements
v deklaraci třídy:
class ACMEBicycle implements Bicycle {
// zbytek třídy bude stejný jako výše
}
Implementací rozhraní bude třída více formálně definovat, jaké akce nabízí. Rozhraní definují vztah mezi třídou a okolním světem a tento vztah je vynucen kompilátorem již v době překladu. Jestliže vaše třída říká, že implementuje nějaké rozhraní, všechny metody, definované v rozhraní, se musí objevit ve zdrojovém kódu třídy předtím, než bude třída úspěšně zkompilována.
Poznámka:
Abyste nyní mohli zkompilovat třídu ACMEBycicle
, budete muset přidat klíčové slovo public
na začátek implementace všech metod, definovaných rozhraním. Důvody se naučíte v příštích dílech tutoriálu.
Co je to balíček?
Balíček (package) je názvový prostor pro skupinu příbuzných tříd a rozhraní. Koncepčně je systém balíčků shodný se systémem složek na vašem pevném disku. Můžete uchovávat HTML stránky v jedné složce, obrázky ve druhé a skripty nebo aplikace v jiné. Protože se software napsaný v Javě může skládat ze stovek nebo dokonce tisíců jednotlivých tříd, je možnost udržet v nich přehled pomocí organizování příbuzných tříd a rozhraní do balíčků.
Java platforma poskytuje enormní knihovnu tříd (skupinu balíčků), určenou pro použití ve vašich aplikacích. Tato knihovna je známa jako „Application Programming Interface“ (zkráceně jako API). Tyto balíčky reprezentují běžné úkony v programování. Pro příklad, objekt String
reprezentují stavy a akce pro řetězce znaků; objekt File
umožňuje vývojáři vytvářet, mazat, prohlížet nebo upravovat soubor na pevném disku; objekt Socket
umožňuje vytvářet a používat síťové sokety; různé objekty GUI, jako jsou tlačítka nebo seznamy, umožňují snadno vytvářet grafické uživatelské rozhraní. Existují doslova tisíce tříd, ze kterých si můžete vybrat. To umožňuje vám, programátorovi, zaměřit se přímo na vytváření aplikací, než na vytváření infrastruktury, aby tyto aplikace vůbec fungovaly.
Dokument Java Platform API Specifikace obsahuje seznam všech balíčků, tříd, rozhraní, vlastností a metod nabízených produktem Java Platform 6, Standard Edition. Načtěte si stránku ve svém oblíbeném internetovém prohlížeči a uložte si ji do oblíbených. Pro vás, jako programátora, se bude jednat o jedno z nejdůležitějších míst, kde si budete moci zjistit referenční podrobnosti.
V příštím díle
V příštím díle se zaměříme na samotné programování a začneme proměnnými.