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ě
new
umožň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
null
hodnotě. - Nakonec jsme si vytvořili pár instancí třídy
Car
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).
- 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í
length
a 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
null
hodnotou
Zadání:
- U všech metod zvolte vhodné návratové typy.
- Vytvořte třídu
Country
s 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
Person
s 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ě
Person
definujte 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ě
Person
definujte 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
PhoneBook
s konstruktorem
PhoneBook(Person[] persons, Country[] countries)
,
která reprezentuje seznam kontaktů. Seznam obsahuje pole osob a pole států. - Třídě
PhoneBook
definujte metodu
count(String countryName)
,
která vrací počet osob, žijících v určitém státě.
Nyní zkuste tříděPhoneBook
definovat metodu
count(String firstname)
,
která vrátí počet osob se zadaným křestním jménem. Proč to nejde? - Třídě
PhoneBook
definujte metodu
search(int id)
,
která vyhledá osobu s určitýmid
. - Třídě
PhoneBook
definujte metodu
search(String country)
,
která vyhledá všechny osoby žijící v zadaném státě. - Třídě
PhoneBook
definujte metodu
search(String firstname, String lastname)
,
která vyhledá všechny osoby se zadaným (celým) jménem. - Třídě
PhoneBook
definujte 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ě
PhoneBook
definujte 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.