Seminář 1

Jazyk Java a platforma Java

Jazyk Java

Platforma Java

Konvence

Více možností, vyberte si jednu a té se držte. Veškerý odevzdaný kód musí dodržovat konvence, jinak bude vrácen k přepracování.

Čitelnost kódu je velmi důležitá vlastnost.

Vývojá prostředí

JShell

JShell je REPL pro prototypování a experimentování s kódem v Javě. Pro nás je ideální, protože nám z počátku umožní vyhnout se prvkům jazyka souvisejícím s objektově orientovaným programováním (OOP), kterým zatím pravděpodobně nerozumíte. Do OOP budete detailně zasvěceni v jiném kurzu. Zde si to v příštích několika seminářích projdeme jen tak, abychom mohli efektivně používat jazyk Java. Do té doby (a klidně i poté) bude JShell výborným pomocníkem.

REPL spustíme příkazem jshell v příkazové řádce, případně je (částečně) podporován v některých IDE (vizte níže).

Chcete-li, aby jshell zobrazoval více informací, tak jej spusťte s parametrem -v, tedy jshell -v.

JShell tutoriál

(ukázka)

Základní příkazy JShellu

(ukázka)

IDE (Integrated development environment)

IDE nabízí spoustu možností, jak si usnadnit práci. Využívejte toho!

I v IDE můžete mít navíc spuštěný (omezený) JShell pro pokusy.

Základní konstrukce jazyka Java

Teď se podíváme na syntaxi jazyka a základní konstrukce, které musíte ovládat.

Příkazy a bloky

Příkazy ukončujeme středníkem, např.

 System.out.println("Ahoj světe!");

je příkaz vypisující typické Ahoj světe!.

Bloky jsou uzavřeny do složených závorek, např.

 {
    System.out.println("Ahoj světe!");
    System.out.println("Jak se máš?");
    System.out.println("BUM!");
 }

Proměnné

Zatím jsme neřešili typy. Toto lze snadno obejít pomocí automatického odvozování typů lokálních proměnných. Chcete-li v JShellu vytvořit pojmenovanou proměnnou použijte var. REPL si sám doplní typ z kontextu. Například

 var oblibeneCislo = 10;

nebo

var tajneHeslo = "topS3cr3t";

Tato vlastnost funguje v Javě obecně pro lokální proměnné (od verze 10).

Ale pozor, nejde napsat jen var x;, v tomto případě interpret nemá z čeho odvodit typ a volání skončí chybou.

Obecně se proměnné deklarují ve tvaru

typ identifikator [ = vychozi_hodnota];

Základní informace k typům máte níže.

(ukázka)

Podmíněný příkaz

Podmíněné příkazy vypadají podobně jako v C:

if (condition) {
   statements;
}

if (condition) {
   statements;
} else {
   statements;
}

if (condition) {
   statements;
} else if (condition) {
   statements;
} else {
   statements;
}

Máme i ternární operátor (a je to výraz):

x = (y == 27) ? 10 : 20;

(ukázka)

Switch

V Javě lze (od verze 16) switch použít jako příkaz i jako výraz.

Switch jako příkaz:

switch (condition) {
   case ABC:
      statements;
      /* falls through */
   case DEF:
      statements;
      break;
   case XYZ:
      statements;
      break;
   default:
      statements;
      break;
}

Switch jako výraz:

switch (condition) {
   case label_1, label_2, label_3 -> value_1;
   .
   .
   .
   case label_n                    -> value_m;
   default -> default_value;
}

Alternativně switch jako výraz s použitím yield;:

switch (condition) {
   case label_1:
   case label_2:
   case label_3:
      statements;
      yield value_1;
   .
   .
   .
   case label_n:
      statements;
      yield value_m;
   default:
      statements;
      yield default_value;
}

Switch výrazy musí být vyčerpávající, tedy jednotlivé větve musí zahrnout každý možný případ. Lze vyřešit default větví. U switch přes malé enumy (výčtové typy, uvidíme později) lze vypsat všechny možnosti a default vynechat - kompilátor si jej doplní. Navíc ze switch výrazů nelze utéct pomocí break; či continue;, protože musí vrátit hodnotu.

Pro switch příkazy tato omezení neplatí.

(ukázka)

Poznámka: V čerstvé Java 21 je možnost pattern matchingu ve switch příkazech/výrazech. Ve starších verzích dostupné v preview.

Cykly

U všech cyklů fungují příkazy break; a continue;. Příkaz break; cyklus ukončí, continue; přejde k další iteraci.

For cyklus

for (initialization; condition; update) {
   statements;
}

Případně

for (initialization; condition; update);

While cyklus

while (condition) {
   statements;
}

Případně

while (condition);

Do-while cyklus

do {
   statements;
} while (condition);

(ukázka)

Metody

return-type name (type1 arg1, type2 arg2, ..., typen argn) {
    statements;
    return return-value;
}

(ukázka)

Pokud metoda nemá nic vracet, její návratový typ return-type je void (bude se hodit v úkolech níže).

Datové typy

Primitivní

Objektové

Vrátíme se k ním později.

Další

void - pro definování nic nevracejících funkcí/metod.

Přetypování

Operátory

Unární

Postfixové

Prefixové

Binární

Multiplikativní

Aditivní

Posun

Relační

Relační - (ne)rovnost

Bitové

Logické

Ternární

Přiřazení

O něco úplnější tabulka s operátory v Javě.

Zdroje

Úkoly

  1. Napište funkci primes beroucí jeden argument typu int, která vypíše všechna prvočísla menší než zadaný argument oddělená čárkou a mezerou (ve standardním pořadí). Za posledním vypsaným číslem bude taktéž čárka a mezera.

    Příklad: primes(10); vypíše: "2, 3, 5, 7, " (bez uvozovek).

  2. Napište funkci multiply beroucí dva argumenty typu int vracející jejich součin, ale používající z aritmetických operací pouze sčítání a odčítání.

    Příklad: multiply(5,6); vrátí 30.

  3. Napište funkci printSquare beroucí jeden argument typu int, která na obrazovku vytiskne čtverec zadané velikost.

    Příklad: printSquare(2) vytiskne
                 --
                |  |
                |  |
                 --

    Tedy obecně čtverec z mezer velikosti n × n ohraničený znakem - shora a zespoda a znakem | zprava a zleva. Pro neplatná zadání funkce neudělá nic.

  4. Napište funkci numberToString vracející pro zadané číslo v rozsahu 1 až 10 jemu odpovídající anglické slovo a pro čísla mimo zadaný rozsah vrátí slovo “unknown”.

    Příklad: numberToString(3) vrátí řetězec "three".

  5. Výsledné kódy z JShellu exportujte do textového souboru a ten odevzdejte emailem s předmětem jj1-01 na tomas.urbanec@upol.cz do 26.9.2023, 14:59 CEST.

Nepovinné úkoly (usnadní vám práci v dalších seminářích)):

  1. Projděte si novinky v jednotlivých verzích Javy od 9. Získate tím hrubý přehled o vývoji Javy v posledních letech.
  2. Seznamte se s vybraným IDE.