Person z1 = new Person();
V Javě máme následující příkazy:
=
a jeho modifikace (kombinované operátory jako je +=
apod.)if
, switch
, for
, while
, do-while
return
;
Operátor přiřazení =
(assignment)
Rozlišujeme přiřazení
Na pravé straně je výraz vracející hodnotu primitivního typu:
Na levé straně je proměnná téhož nebo širšího typu jako přiřazovaná hodnota:
int
lze přiřadit do long
Při zužujícím přiřazení se také provede konverze, ale může dojít ke ztrátě informace:
int
→ short
Konstrukci =
lze použít i pro přiřazení do objektové proměnné:
Person z1 = new Person();
Co to udělalo?
Person
( new Person()
)
z1
typu Person
Nyní můžeme odkaz na tentýž vytvořený objekt například znovu přiřadit do z2
:
Person z2 = z1;
z1
a z2
ukazují nyní na fyzicky stejný (identický) objekt typu osoba!!!
identifikaceObjektu.názevMetody(skutečné parametry)
, kde:
identifikaceObjektu
, jehož metodu voláme.
(tečka)názevMetody
, jíž nad daným objektem volámeNávrat z metody se děje:
return
return
může být specifikována návratová hodnotaneboli neúplné větvení pomocí if
if (logický výraz) příkaz
true
), provede se příkaz.if (logický výraz) příkaz1 else příkaz2
true
), provede se příkaz1.else
se nemusí uvádět.while
, tj. s podmínkou na začátkuwhile
Tělo cyklu se provádí tak dlouho, dokud platí podmínka, obdoba v Pascalu, C a dalších
while (podmínka) příkaz;
while
se složeným příkazemwhile (podmínka) {
příkaz1;
příkaz2;
příkaz3;
...
}
Větvení, cykly: doporučuji vždy psát se složeným příkazem v těle (tj. se složenými závorkami)!!! Jinak hrozí, že se v těle větvení/cyklu z neopatrnosti při editaci objeví něco jiného, než chceme, např.:
while (i < a.length)
System.out.println(a[i]);
i++;
Pišme proto vždy takto:
while (i < a.length) {
System.out.println(a[i]);
i++;
}
U větvení obdobně:
if (i < a.length) {
System.out.println(a[i]);
}
while
cykluint i = 0;
while (i < args.length) {
System.out.println(args[i]);
i++;
}
while
— celočíselné děleníwhile
pro realizaci
celočíselného dělení se zbytkem.public class DivisionBySubtraction {
public static void main(String[] args) {
int dividend = 10; // dělenec
int divisor = 3; // dělitel
int quotient = 0; // podíl
int remainder = dividend;
while (remainder >= divisor) {
remainder -= divisor;
quotient++;
}
System.out.println("Podil 10/3 je " + quotient);
System.out.println("Zbytek 10/3 je " + remainder);
}
}
do-while
, tj. s podmínkou na koncirepeat
v Pascalu (podmínka je ovšem interpretována opačně)do {
příkaz1;
příkaz2;
příkaz3;
...
} while (podmínka);
do-while
cyklufloat number;
boolean isOK;
// create a reader from standard input
BufferedReader in = new BufferReader(new InputStream(System.in));
// until a valid number is given, try to read it
do {
String input = in.readLine();
try {
number = Float.parseFloat(input);
isOK = true;
} catch (NumberFormatException nfe) {
isOK = false;
}
} while(!isOK);
System.out.println("We've got the number " + number);
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
public class UntilEnteredEnd {
public static void main(String[] args) throws IOException {
BufferedReader input = new BufferedReader(
new InputStreamReader(System.in));
String line = "";
do {
line = input.readLine();
} while (!line.equals("end"));
System.out.println("Uživatel zadal " + line);
}
}
for
for
cyklus v C/C++ jde de-facto o rozšíření cyklu while
.for(počáteční op.; vstupní podm.; příkaz po každém průch.)
příkaz;
{
a }
proto,
že když přidáme další příkaz,
už nezapomeneme dát jej do složených závorek:for (počáteční op.; vstupní podm.; příkaz po každém průch.) {
příkaz1;
příkaz2;
příkaz3;
}
for
cykluProvedení určité sekvence určitý počet krát:
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
0
až 9
.for
se většinou užívá jako cyklus s pevným počtem opakování,
známým při vstupu do cyklu. Tento počet nemusí být vyjádřený konstantou
(přímo zadaným číslem), ale neměl by se v průběhu cyklu měnit.Používejte asymetrické intervaly (ostrá a neostrá nerovnost):
i = 0
ai++
je neostrou nerovností: i
se na začátku rovná 0), zatímcoi < 10
je ostrou nerovností: i
už hodnoty 10 nedosáhne!for
cyklu.for
se téměř vždy vyskytuje tzv. řídicí proměnná,Někteří autoři nedoporučují psát deklaraci řídicí proměnné přímo
for (int i = 0; …
int i; for (i = 0; …
i
přístupná ("viditelná") i za cyklem,
což se však ne vždy hodí.switch case default
select - case - else
switch-case
v C, — zejména se chová jako C při "break-through"switch - case - default
switch(výraz) {
case hodnota1: prikaz1a;
prikaz1b;
prikaz1c;
...
break;
case hodnota2: prikaz2a;
prikaz2b;
...
break;
default: prikazDa;
prikazDb;
...
}
case
.break
,
který předá řízení ("skočí") na první příkaz za ukončovací závorkou
příkazu switch
.switch
další infoŘídicí výraz může nabývat hodnot
byte
, short
, char
a int
, dáleenum
),String
a některých dalších.switch
příklad s číslypublic class MultiBranching {
public static void main(String[] args) {
if (args.length == 1) {
int i = Integer.parseInt(args[0]);
switch (i) {
case 1: System.out.println("jednicka"); break;
case 2: System.out.println("dvojka"); break;
case 3: System.out.println("trojka"); break;
default: System.out.println("neco jineho"); break;
}
} else {
System.out.println("Pouziti: java MultiBranching <cislo>");
}
}
}
switch
příklad se String
Převzato z tutoriálu Oracle
switch (month.toLowerCase()) {
case "january":
monthNumber = 1;
break;
case "february":
monthNumber = 2;
break;
case "march":
monthNumber = 3;
break;
...
switch
příklad se společnými větvemi case
Převzato z tutoriálu Oracle
int month = 2;
int year = 2000;
int numDays = 0;
switch (month) {
case 1: case 3: case 5:
case 7: case 8: case 10:
case 12:
numDays = 31;
break;
case 4: case 6:
case 9: case 11:
numDays = 30;
break;
...
if - else
můžeme samozřejmě vnořovat do sebe.if(podmínka_vnější) {
if(podmínka_vnitřní_1) {
...
} else {
...
}
} else {
if(podmínka_vnitřní_2) {
...
} else {
...
}
}
Je možné "šetřit" a neuvádět složené závorky,
v takovém případě se else
vztahuje vždy k nejbližšímu
neuzavřenému if
, např. znovu předchozí příklad:
if(podmínka_vnější)
if(podmínka_vnitřní1)
...
else // vztahuje se k if(podmínka_vnitřní1)
else // vztahuje se k if(podmínka_vnější)
if (podmínka_vnitřní_2)
...
else // vztahuje se k if (podmínka_vnitřní_2) ...
public class NestedBranching {
public static void main(String args[]) {
int i = Integer.parseInt(args[0]);
System.out.print(i+" je cislo ");
if (i % 2 == 0) {
if (i > 0) {
System.out.println("sude, kladne");
} else {
System.out.println("sude, zaporne nebo 0");
}
} else {
if (i > 0) {
System.out.println("liche, kladne");
} else {
System.out.println("liche, zaporne");
}
}
}
}
if - else if - else
Časteji rozvíjíme pouze druhou (negativní) větev:
if (podmínka1) {
... // platí podmínka1
} else if (podmínka2) {
... // platí podmínka2
} else if (podmínka3) {
... // platí podmínka3
} else {
... // neplatila žádná
}
if - else if - else
public class MultiBranchingIf {
public static void main(String[] args) {
if (args.length == 1) {
int i = Integer.parseInt(args[0]);
if (i == 1)
System.out.println("jednicka");
else if (i == 2)
System.out.println("dvojka");
else if (i == 3)
System.out.println("trojka");
else
System.out.println("jine cislo");
} else {
System.out.println("Pouziti: java MultiBranchingIf <cislo>");
}
}
}
break
switch
.
Syntaxe použití break
v cyklu:
int i = 0;
for (; i < a.length; i++) {
if(a[i] == 0) {
break; // skoci se za konec cyklu
}
}
if (a[i] == 0) {
System.out.println("Nasli jsme 0 na pozici "+i);
} else {
System.out.println("0 v poli neni");
}
switch
jsme již viděli přímo v ukázkách pro switch
.continue
Způsobí přeskočení zbylé části průchodu tělem cyklu
for (int i = 0; i < a.length; i++) {
if (a[i] == 5) continue; // pětku vynecháme
System.out.println(i);
}
1
, 2
, 3
, 4
, 6
, 7
, 8
, 9
, nevypíše hodnotu 5
.break
i continue
public class BreakContinue {
public static void main(String[] args) {
if (args.length == 2) {
int limit = Integer.parseInt(args[0]);
int skip = Integer.parseInt(args[1]);
for (int i = 1; i <= 20; i++) {
if (i == skip)
continue;
System.out.print(i+" ");
if (i == limit)
break;
}
System.out.println("\nKonec cyklu");
} else {
System.out.println(
"Pouziti: java BreakContinue <limit> <vynechej>");
}
}
}
Příklad je pouze ilustrativní — v reálu bychom break
na ukončení cyklu v tomto případě nepoužili a místo toho bychom limit
dali přímo jako horní mez for cyklu.
|
break
a continue
s návěštímUmožní ještě jemnější řízení průchodu vnořenými cykly:
break
přerušen nebocontinue
.public class Label {
public static void main(String[] args) {
outer_loop:
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
System.out.print((i*j)+" ");
if (i*j == 25) break outer_loop;
}
System.out.println();
}
System.out.println("\nKonec cyklu");
}
}
/