Seminář 1
Jazyk Java a platforma Java
Jazyk Java
- objektově orientovaný jazyk
- dědičnost s maximálně jedním rodičem
- syntax vychází z C/C++, tj vypadá podobně
- ale na rozdíl od C/C++ máme
- automatická správa paměti
- kontrola mezí polí
- pouze bezpečné prvky jazyka
- jiný objektový systém
- portabilita
- systém výjimek
- více implementací (Oracle, OpenJDK, …)
- bohatá standardní knihovna a mnoho dalších knihoven
- nová verze dvakrát ročně (od Java 10)
Platforma Java
- sada mnoha nástrojů umožňující vývoj (nejen) v Javě
- dostupné pro různorodý hardware (portabilita)
- JVM - Java Virtual Machine
- JIT - Just In Time kompilace (Java bytecode)
- JDK - Java Development Kit
- JRE - Java Runtime Environment
- podporuje mnoho dalších jazyků: Scala, Groovy, Clojure, Kotlin, …
- JavaCard, Java ME, Java SE, Jakarta EE
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
.
(ukázka)
Základní příkazy JShellu
/help
- nápověda/list obj
- vypíše definici obj, při použití bez argumentu vypíše definice všech nadefinovaný objektů./vars
- vypíše nadefinované proměnné a jejich obsah/metoda
- vypíše nadefinované funkce (metody)/history
- vypíše historii zadaných vstupů- Mnoho dalších užitečných - projděte si
\help
.
(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
- Starší, ale pěkný tutoriál k základům Javy. Neobsahuje novinky po verzi 8!
- Novinky v jednotlivých verzích Javy od 9.
- Popis odvozování typů lokálních proměnných, tj používání
var
. - Konvence k používání
var
. - Popis switche jako výrazu.
- JShell tutoriál.
Úkoly
Pro vypracování všech úkolů použijte JShell.
Napište funkci
printSquare
beroucí jeden argument typuint
, která na obrazovku vytiskne čtverec zadané velikost.Tj
printSquare(3)
vytiskne--- | | ---
Napište funkci
nasob
beroucí dva argumenty typuint
vracející jejich součin, ale používající z aritmetických operací pouze sčítání a odčítání.Napište funkci vypisující prvních 100 prvočísel.
Napište funkci
slovo
vypisující pro zadané číslo v rozsahu 1 až 10 jemu odpovídající české slovo.Tj
slovo(3)
vypíšetři
.Výsledné kódy si z JShellu exportujte do souboru.