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ě
new
umožň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
null
hodnotě. - Nakonec jsme si vytvořili pár instancí třídy
Automobil
odpoví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
null
hodnotou
Zadání:
Vytvořte třídu
Country
s 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
Person
s 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ě
Person
definujte 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ě
Person
definujte 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
Index
s 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ě
Index
definujte metoducount(String firstname, String lastname)
, která vrátí počet osob se stejným jménem a příjmením.Třídě
Index
definujte metodusearch(int id)
, která vyhledá osobu s určitýmid
.Třídě
Index
definujte metodusearch(String countryName)
, která vyhledá všechny osoby žijící ve státě určeném jménem.Třídě
Index
definujte metodusearch(String firstname, String lastname)
, která vyhledá všechny osoby se zadaným jménem a příjmením.Třídě
Index
definujte 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ě
Index
definujte 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.