Objektovo-orientované programovanie, ak. rok 2023/24

Cvičenie 2

(k prednáške 2)

Projekt

Tento týždeň začínate s prácou na projekte. Na prednáške ste sa oboznámili s rámcovou témou projektu. Zámer svojho projektu musíte prekonzultovať s vyučujúcim na cvičeniach. Máte možnosť to urobiť na tomto a ďalších dvoch cvičeníach. Aby vám vyučujúci mohol poradiť, musíte prísť s dostatočne rozpracovaným základom a premyslenými otázkami.

Do stanoveného termínu musíte odovzdať svoj zámer do AIS-u. Termín je však nastavený tak, že by ste hravo mali zvládnuť odovzdanie v týždennom predstihu, čím získate viac času na realizáciu projektu.

^


Používanie on-line dokumentácie Java SE API

Dokumentácia Java SE je dostupná na webe. Obsahuje veľa užitočných veci vrátane tutoriálu, kompletných kníh o Jave a príkladov.

Ako už viete, Java prichádza s rozsiahlym API, t. j. rozhraním aplikačného programovania (niekedy označovným ako štandardné knižnice, ale sú to rámce). Aby ste toto rozhranie mohli využiť, potrebujete jeho dokumentáciu. Nájdete ju na spomínanej stránke. Priamy odkaz je: Platform, Standard Edition & Java Development Kit Version 17 API Specification.

Už ste používali metódu println(). You may use search, but you may also proceed by observing that this method is always called in the context of the System.out object. Find System class, and then proceed by inspecting its attribute named out, which is of the PrintStream class. Vyhľadajte dokumentáciu tejto metódy. Môžete posužiť vyhľadávanie, ale všimnite si, že táto metóda je vždy volaná v kontexte objektu System.out. Takže nájdite triedu System a pokračujte preskúmaním jej atribútu out, ktorý je triedy PrintStream. V nej už nájdete metódu println().

^


Úlohy

V úlohách budete pracovať s kódom hry s obrami a rytiermi z prednášky (použite finálnu verziu, ktorá je v adresári Game2).

  1. Doplňte do všetkých tried obrov konštruktory s energiou ako parametrom (podľa triedy Knight). Využite možnosť v odvodených triedach obrov zavolať konštruktor triedy, od ktorej dedia pomocou kľúčového slova super(). Upravte metódu main() triedy Game tak, aby využívala konštruktory tried obrov.
  2. Podobne ako na minulom cvičení, vytvorte ďalšiu triedu odvodenú od triedy BadOgre (napr. TerrifyingOgre), v ktorej bude prekonaná metóda eat(). Prekonanú metódu eat() zavolajte pomocou kľúčového slova super. Po nej nech nasleduje dodatočné správanie, akým by napríklad bolo zavolanie vlastnej novej metódy roar(), ktorá jednoducho len vypíše hlásenie. Zaraďte aj obrov tejto novej triedy do stretu. Treba meniť slučku stretu?
  3. Do triedy Game pridajte metódu
    int countEnergy(Energy[] e)
    ktorá bude schopná zrátať energiu obrov alebo rytierov poskytnutých ako parametre. Zavolajte túto metódu v metóde main() a vypíšte jej návratovú hodnotu. Tejto metóde musíte poskytnúť pole Energy[] ako parameter. Ak by ste jej chceli poskytnúť vybrané objekty, museli by ste ich obaliť do poľa Energy[] takto:
    countEnergy(new Energy[]{o[47], k[2], o[99]});
    Ak však signatúru metódy uvediete takto:
    int countEnergy(Energy... e)
    čo je zápis pre metódu s premenlivým počtom parametrov, objekty môžete poskytnúť priamo:
    countEnergy(o[47], k[2], o[99]);
    Aj pri takejto signatúre stále môžete poskytnúť pole Energy[], lebo metódy s premenlivým počtom parametrov sú realizované pomocou polí.
  4. Organizujte projekt hry do balíkov. Napríklad obrov a rytierov spolu s rozhraním pre energiu zaraďte do balíka characters, a triedu Game do balíka Game. Nový balík v prostredí Eclipse vytvoríte napríklad tak, že pravým tlačidlom kliknete na názov projektu v pohľade Package Explorer a zvolíte New / Package. Prvky do balíka stačí potiahnuť. Všimnite si, že prostredie hlási chyby. Do každého súboru v balíku musíte pridať klauzulu:
    package názov_balíka;
    Do každého súboru, ktorý využíva prvky tohto balíka musíte pridať klauzulu, ktorou tento balík sprístupníte:
    import názov_balíka.*;
    Inak budete musieť používať plne kvalifikované názvy, ako napríklad:
    characters.Ogre[] o = new characters.Ogre[100];
    Otvorte zdrojový kód a všimnite si jeho adresárovú štruktúru.
  5. Všimnite si, že sa mimo triedy Knight už nedá pristúpiť k jej atribútu energy. Nastavte aj atribútom energy a hungry triedy Ogre prístup private. Ako zabezpečíte prístup k týmto atribútom? Čo by bolo potrebné upraviť, ak by atribút energy triedy Ogre mal byť vnútorne reprezentovaný ako float, pričom by zvyšok hry s týmto atribútom naďalej pracoval ako keby bol typu int?
  6. Zrušte označenie komentára atribútu hungry triedy BadOgre. Vyskúšajte stret obrov a rytierov. Všimnite si, že žiaden obor rytiera nezje. Toto je dôsledkom javu, ktorý sa volá skrývanie atribútov: rovnomenný atribút v odvodenej triede skryje pôvodný. Keďže boolovské atribúty sú implicitne false, podmienený príkaz v metóde eat() sa nerealizuje a obor rytiera nezje.
  7. Po prejdení inštruktážnej časti k prekladu a spúšťaniu programu z príkazového riadku, skúste preložiť hru s obrami a rytiermi z príkazového riadku alebo aspoň vyhľadajte adresár príslušného Eclipse projektu (v pracovnom adresári Eclipse, tzv. workspace) a všimnite si jeho organizáciu, t. j. štruktúru adresárov a kde sú java, a kde class súbory. Spúsťte program z príkazového riadku príkazom java. Ktorú triedu máte pritom uviesť ako parameter?

^


Preklad a spustenie programu z príkazového riadku

Pre preklad z príkazového riadku musia byť správne nastavené systémové premenné PATH a CLASSPATH. Na počítačoch v CPU by toto malo byť zabezpečené. V prípade, že narazite na problémy pri preklade alebo spúšťaní programu, urobte nasledujúce:

  1. v menu Start otvorte Control Panel a vyberte User Accounts, a následne Change my Environment Variables
  2. v časti User variables vytvorte premennú s názvom PATH s nasledujúcim obsahom: C:\Program Files\Java\jdk1.8.0_[xy]\bin ([xy] nahraďte číslom skutočne inštalovanej verzie); ak taká premenná už jestvuje, pridajte na koniec jej obsahu bodkočiarku a za ňou uvedenú cestu
  3. v tej istej časti vytvorte premennú s názvom CLASSPATH, do ktorej uložite iba bodku (značí aktuálny adresár): .; ak taká premenná už jestvuje, pridajte na koniec jej obsahu bodkočiarku a za ňou bodku

Zmeny platia len pre novootvorené príkazové riadky. Alternatívou k nastaveniu systémovej premennej CLASSPATH je zadávanie cesty k triedam priamo pri preklade prostredníctvom prepínača -classpath.

Preklad a spustenie programu HelloWorld.java

Po nastavení ciest, môžete vyskúšať preklad a spustenie programu HelloWorld.java. Uložte ho do pracovného adresára (vytvorte si vlastný podadresár v adresári, do ktorého môžete zapisovať, pravdepodobne C:\work).

Súbor so zdrojovým kódom môžete otvoriť v Eclipse (cez menu File alebo jednoduchým potiahnutím ikony súboru do okna Eclipse, teda bez vytvárania projektu) alebo v hocijakom editore textu (hoci aj v Notepade). Pre samotný preklad a spustenie programu to samozrejme nie je potrebné.

Samotný preklad spustíte z príkazového riadku, ku ktorému sa dostanete cez menu Start zadaním príkazu cmd. Z neho príkazom

javac HelloWorld.java

spustíte preklad programu. Program by sa mal preložiť úspešne, a prekladač by nemal hlásiť nič. Prekladom vznikne súbor HelloWorld.class. Ten sa dá spustiť príkazom

java HelloWorld

čím sa vypíše pozdrav a dnešný dátum.

Preklad a spustenie programu s viacerými balíkmi

(Ak sa nestihne, tak na ďalšom cvičení.)

Štruktúra adresárov, v ktorých sa nachádzajú zdrojové a výsledné súbory, musí zodpovedať štruktúre balíkov. Stiahnite si príklad programu s balíkmi a rozbaľte ho do pracovného adresára. Týmto by ste mali získať adresár C:\work\Project1) s dvomi zdrojovými súbory. Jeden z nich je Class1.java. Tento súbor obsahuje rovnomennú triedu, ktorá má metódu main(), t. j. dá sa spustiť.

Druhý súbor je ClassP.java. Tento súbor obsahuje tiež jednu, rovnomennú triedu. Na jeho začiatku je deklarované že patrí do balíka my.pack1 a preto musí byť umiestnený do adresára my\pack1. Class1.java importuje balík my.pack, ktorý pozostáva z jedinej triedy ClassP.

Preložme program javacom z príkazového riadku. Otvorte okno príkazového riadku a nastavte sa do adresára C:\work\Project1. Zadajte

javac Class1.java

Ak ste do systémovej premennej classpath nepridali aktuálny adresár, musíte použiť rovnomenný prepínač:

javac -classpath . Class1.java

Po preklade vznikne súbor Class1.class. Spustíte ho jednoducho príkazom:

java Class1

Aj pri spúšťaní programu platí, že ak ste do systémovej premennej classpath nepridali aktuálny adresár, musíte použiť rovnomenný prepínač.

Keďže viete že trieda Class1 potrebuje triedu ClassP, tušíte že aj súbor ClassP.java musel byť preložený. Presvedčte sa že javac tento preložený súbor umiestnil tam, kde našiel zdrojový, t. j. do adresára C:\work\Project1\my\pack1.

Väčšinou však budete chcieť aby preložené súbory boli oddelené od zdrojových súborov. Vytvorte preto adresár pre zdrojové súbory src a preložené súbory bin. Z adresára src spusťte preklad s uvedením cieľového adresára:

javac -d C:\work\Project1\bin Class1.java

V cieľovom adresári nájdete všetky preložené súbory aj so štruktúrou adresárov, ktorá zodpovedá hierarchii balíkov. Aby ste spustili program, musíte sa nastaviť do tohto adresára.

Aj keď preklad z príkazového riadku nie je vhodný pre vývoj rozsiahlejších programov – a teda ani pre vaše projekty – dobré je poznať ho. Odporúčané prostredie je Eclipse, ku ktorému ste dostali už na prvom cvičení krátky tutoriál (HTML/ ZIP). Na vlastných počítačoch môžete používať aj iné prostredia pre vývoj programov v Jave, ale projekt sa musí dať preložiť v prostredí Eclipse inštalovanom v CPU.



Valentino Vranić
vranic at stuba.sk