Seminář 3
Obsah semináře
- Úvod do OOP - motivace, třídy, objekty, atributy, metody
- Pole
- Řetězce
Objektově orientované programování (OOP)
Zde se OOP budeme zabývat spíše intuitivně. Potřebnou teorii a mnoho dalšího se dozvíte v kurzu věnovaném OOP jako takovému. Intuice občas bývá zrádná, nad vším tedy zkuste více pouvažovat a neváhejte se zeptat.
Motivace
Zmínili jsme si pár motivačních příkladů (eshop, STAG) a ukázali si jednoduchou situaci s automobily určenými svými vlastnostmi (SPZ, barva, rychlost, lokace, posádka) a možnými úkony, které s těmito vozy lze provádět (zrychlit, zpomalit, nabrat osobu, vyložit osobu, přelakovat auto, …).
Vzali jsme si pár aut a ukázali si, že sice mají stejný soubor vlastností, ale s různými hodnotami. Soubor vlastností a možných akcí jsme zachytili do
třídy Automobil - jakéhosi blueprintu, nebo výkresu pro všechny objekty daného typu - automobily.
A teď v Javě
Celý proces jsme následně provedli v Javě:
- Vytvořili jsme si třídu
Automobil, která je popsána v samostatném souboruAutomobil.java. Ukázali jsme si, jak definovat požadované vlastnosti - atributy a úkony - metody. - Řekli jsme si o speciálních metodách - konstruktorech (může jich být více) a klíčovém slově
newumožňujícím vytvářet instance dané třídy za použití daného konstruktoru. - Zmínili jsme implicitní konstruktor, který nic nenastavuje.
- Řekli jsme si (znovu) o
nullhodnotě. - Nakonec jsme si vytvořili pár instancí třídy
Automobilodpovídající původnímu příkladu na tabuli. - Vše jsme si rovnou i naprogramovali (a u toho viděli pár zajímavých funkcí IDE). Část kódu
Zmínili jsme další principy - dědičnost, zapouzdření a polymorfismus - a prvky jazyka - gettery/settery, modifikátory přístupu a rozhraní. Na ty se podíváme příště.
Řetězce
- Třída String.
- Základní vlastnosti a vybrané metody třídy String.
- String není to samé jako char[].
- Literály
- Textové bloky
- Metoda
toString()u každého objektu. - Stringy jsou neměnné hodnoty (ukázka v JShellu).
- Problém s appendováním v cyklu. ukázka kódu
- Řešení: StringBuilder (ukázka kódu)
- Stručné shrnutí v Java tutoriálu. Pozor, chybí tam textové bloky.
Pole
- Pole v Javě, jejich vlastnosti a zápis. (ukázka)
- Práce s poli, iterace pomocí
for(var item : array)(ukázka) - Třída Arrays a její vybrané metody.
- Stručné shrnutí v Java tutoriálu.
Úkoly
Úkolů je více, ale jsou jednoduché. Měli byste si na nich procvičit:
- vytváření tříd a jejich instancí (objektů)
- práci se Stringy
- práci s poli
- práci s
nullhodnotou
Zadání:
Vytvořte třídu
Countrys konstruktoremCountry(String name, String phoneCode), která reprezentuje stát. Objekty mají dva atributy -name(jméno státu) aphoneCode(telefonní předvolba, např. +420). Dále definujte metoduprint, která vypíše zemi ve formátuStát{jméno=xxx, předvolba=xxx}a ukončí řádek.Vytvořte třídu
Persons konstruktoremPerson(int id, String firstname, String lastname, int age, String phone, Country country), která reprezentuje osobu. Objekty mají atributy:id(unikátní identifikátor),firstname(jméno),lastname(příjmení),age(věk),phone(telefon),country(stát). Dále definujte metodugetStatus(), která vrátí status osoby: pokud je věk menší než 18, vrátí status “junior”, pokud větší nebo roven 65, vrátí status “senior”, jinak vrátí status “dospělý”.Třídě
Persondefinujte metodugetPhone(), která vrátí telefonní číslo i s předvolbou. Pokud osoba nemá stát přiřazený, vrátí číslo bez předvolby.Třídě
Persondefinujte metoduprint(), která vypíše osobu ve formátuOsoba{id=xxx, jméno=xxx, příjmení=xxx, věk=xxx, telefon=xxx, status=xxx, stát=xxx}a ukončí řádek. Pokud osoba nemá stát přiřazený, vypíšestát=neznámý.Vytvořte třídu
Indexs konstruktoremIndex(Person[] persons, Country[] countries), která reprezentuje rejstřík. Rejstřík obsahuje pole osob a pole států. Dále definujte metoducount(String countryName), která vrací počet osob, žijících v určitém státě.Třídě
Indexdefinujte metoducount(String firstname, String lastname), která vrátí počet osob se stejným jménem a příjmením.Třídě
Indexdefinujte metodusearch(int id), která vyhledá osobu s určitýmid.Třídě
Indexdefinujte metodusearch(String countryName), která vyhledá všechny osoby žijící ve státě určeném jménem.Třídě
Indexdefinujte metodusearch(String firstname, String lastname), která vyhledá všechny osoby se zadaným jménem a příjmením.Třídě
Indexdefinujte metodusetPhoneCode(Person person, String phoneCode), která osobě nastaví zemi podle telefonní předvolby. Pokud je předvolba neplatná, neudělá nic a vrátí hodnotufalse(jinaktrue).Třídě
Indexdefinujte metoduprint(), která vypíše (efektivním způsobem!) obsah rejstříku ve formátu:Rejstřík{ Osoba{id=0, jméno=Prokop, příjmení=Dveře, telefon=+420555444333} Osoba{id=1, jméno=Tomáš, příjmení=Putna, telefon=+420999888777} Osoba{id=2, jméno=Fero, příjmení=Dunaj, telefon=+421123456789} Osoba{id=3, jméno=Johnny, příjmení=Cash, telefon=+1987654321} Osoba{id=4, jméno=Tomáš, příjmení=Putna, telefon=111222333} }
a ukončí řádek.
Odkaz na vytvoření repositáře v Gtihub classroom.