Seminář 2
Obsah semináře
- Úvod do OOP:
- motivace,
- třídy, objekty, atributy, metody
- Řetězce
- Pole
Rozcvička
- poznámky k úkolům
- vytvoření projektu v IDE
- základní nástroje IDE, debugger
Objektově orientované programování (OOP)
Zde se OOP budeme zabývat spíše intuitivně tak, abychom mohli začít programovat v Javě. Související teorii a mnoho dalšího se dozvíte v kurzu věnovaném OOP jako takovému (není to prerekvizita). 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 (v dané situaci zajímavých) vlastností, ale s různými hodnotami. Soubor vlastností a možných akcí jsme zachytili do
třídy Car - jakéhosi předpisu, 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
Car, která je popsána v samostatném souboruCar.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 (“objekty dle daného výkresu”) za použití daného konstruktoru. - Zmínili jsme implicitní konstruktor, který nic nenastavuje.
- Řekli jsme si o
nullhodnotě. - Nakonec jsme si vytvořili pár instancí třídy
Carodpoví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).
- 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í
lengtha pomocífor (var item : array)(ukázka) - Třída Arrays a její vybrané metody.
- Stručné shrnutí v Java tutoriálu.
Poznámky a zdroje
- Výchozí hodnoty proměnných.
- Část kódu z hodiny
- OOP v java tutorialu
- Slíbené texty dr. Krajči (heslo šlo emailem).
Ú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í:
- U všech metod zvolte vhodné návratové typy.
- Vytvořte třídu
Countrys konstruktorem
Country(String name, String phoneCode),
která reprezentuje stát.
Instance mají dva atributyname- jméno státu aphoneCode- telefonní předvolba, např. +420.
print, která vypíše zemi ve formátu
Stát{jméno=xxx, předvolba=xxx}
a ukončí řádek.
Mapování stát - předvolba nemusí odpovídat realitě. (Klidně si vymyslete i státy.) - Vytvořte třídu
Persons konstruktorem
Person(int id, String firstname, String lastname, int age, String phone, Country country),
která reprezentuje osobu.
Instance mají atributyid- unikátní identifikátor,firstname- jméno,lastname- příjmení,age- věk,phone- telefon,country- stát.
getStatus(), 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á přiřazený stát, vrátí číslo bez předvolby. - Třídě
Persondefinujte metoduprint(), která vypíše osobu ve formátu
Osoba{id=xxx, jméno=xxx yyy, tel=xxx}
a ukončí řádek. Pokud osoba nemá přiřazený stát, telefon bude bez předvolby, jinak s předvolbou. - Vytvořte třídu
PhoneBooks konstruktorem
PhoneBook(Person[] persons, Country[] countries),
která reprezentuje seznam kontaktů. Seznam obsahuje pole osob a pole států. - Třídě
PhoneBookdefinujte metodu
count(String countryName),
která vrací počet osob, žijících v určitém státě.
Nyní zkuste tříděPhoneBookdefinovat metodu
count(String firstname),
která vrátí počet osob se zadaným křestním jménem. Proč to nejde? - Třídě
PhoneBookdefinujte metodu
search(int id),
která vyhledá osobu s určitýmid. - Třídě
PhoneBookdefinujte metodu
search(String country),
která vyhledá všechny osoby žijící v zadaném státě. - Třídě
PhoneBookdefinujte metodu
search(String firstname, String lastname),
která vyhledá všechny osoby se zadaným (celým) jménem. - Třídě
PhoneBookdefinujte metodu
setPhoneCode(Person person, String phoneCode),
která osobě nastaví zemi (z uloženého pole) podle telefonní předvolby.
Pokud je předvolba neplatná, neudělá nic a vrátí hodnotufalse(jinaktrue). - Třídě
PhoneBookdefinujte metodu
print(), která vypíše (efektivním způsobem!) obsah rejstříku v následujícím formátu:
Rejstřík{
Osoba{id=0, jméno=Tonička Bolavá, tel=+420555444333}
Osoba{id=1, jméno=Vilém Klika, tel=000000000}
Osoba{id=2, jméno=Navážka Nóblhoch, tel=+421123456789}
Osoba{id=3, jméno=Samuel Elánius, tel=+18357801}
Osoba{id=4, jméno=Magráta Česneková, tel=666}
}
- Výsledek odevzdejte emailem s předmětem jj1-02 na tomas.urbanec@upol.cz do 3.10.2023, 14:59 CEST. Odevzdávejte pouze zdrojové kódy, nikoliv celé projekty vygenerované IDE.