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.

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 podporován v některých IDE (na IDE se podíváme příště).

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)

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];

K typům se dostaneme příště.

(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 (v preview od 12) switch použít jako příkaz i jako výraz.

Switch (klasicky) jako příkaz:

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

Switch (nově) 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)

Aktualizace V čersvtvé Java 17 je ve stavu preview i možnost pattern matchingu ve switch příkazech/výrazech.

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 (funkce)

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).

Zdroje

Úkoly

Pro vypracování všech úkolů použijte JShell.

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

    Tj printSquare(3) vytiskne

    ---
    | |
    ---
  2. Napište funkci nasob 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í.

  3. Napište funkci vypisující prvních 100 prvočísel.

  4. Napište funkci slovo vypisující pro zadané číslo v rozsahu 1 až 10 jemu odpovídající české slovo.

    Tj slovo(3) vypíše tři.

  5. Výsledné kódy si z JShellu exportujte do souboru.