Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Lekce 1 Jazyk Java Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky.
Komentáře Klíčová slova (rezervovaná) Nemohou být využita k jiným než definovaným účelům Příkazy programy se skládají z různých typů příkazů, které reprezentují akce nebo skupiny akcí a končí středníkem Bloky dvojice složených závorek { } Proměnné paměťová místa, ve kterých uchováváme informace
Třídy Základní stavební kámen jazyka Java Každý program v jazyce Java se skládá alespoň z jedné třídy Třída šablona (předpis) pro vytváření objektů Metody Skupina příkazů pro vykonání operací Metoda main speciální typ metody, výchozí bod při spouštění programu Identifikátory Jednoznačný název pro označení proměnných, konstant apod. Musí být souvislé, nelze je přerušovat bílými znaky
Java rozlišuje malá a velká písmena Konvence jazyka Java Code Conventions, k dispozici na www.oracle.com/technetwork/java/codeconventions- 150003.pdf Nepoužíváme znaky s diakritikou (editory ji většinou podporují, ale může být problém s výstupy programů) Třídy První písmeno je velké Pokud více slov v názvu začátek každého slova velké písmeno Název třídy ve většině případů podstatné jméno Příklad: Clovek, Ucet, SporiciUcet
Metody Začínají malým písmenem Většinou se jedná o sloveso Příklad: main(), zalozucet(), zrusucet() Proměnné Stejné zásady jako u metod první písmeno malé, ostatní velká (více slov camelcase) Příklad: pocetstudentu, znamkaprogramovani Konstanty Všechna písmena velká, jednotlivá slova oddělena symbolem podtržení Příklad: MINIMALNI_VEK
Java compiler Je součástí nástrojů obsažených v JDK Provádí kompilaci zdrojového kódu na bytecode javac [nastaveni] [soubory se zdroj. kodem] Příklad: javac HelloWorld.java Výsledkem kompilace je bytecode uložený v souboru se stejným názvem (ve stejné složce) Příklad: HelloWorld.class Příklad nastavení: (do složky classes ) javac d classes HelloWorld.java
Java Virtual Machine java [-nastaveni] class [argumenty] Příklad: java HelloWorld Program v jazyce Java Java API Java Virtual Machine Operační systém
Nelze volit identifikátor s identickým názvem s některým rezervovaným slovem Jde o elementy definované přímo jako součást gramatiky jazyka Nelze je uživatelsky měnit jsou součástí překladače
Klíčová slova Literály (doslovné hodnoty), které lze považovat za klíčová slova true, false, null
Do konce řádku int i; //promenna je typu int Víceřádkové /* * Toto je komentar na * vice radku */ Jednořádkové /* Toto je komentar na cely radek. */
Dokumentační JavaDoc /** * Tyto komentare lze * vyuzit pri vytvareni dokumentace * s vyuzitim nastroje JavaDoc */
Primitivní byte 8 short 16 int 32 long 64 float 32 double 64 int x = 7; //binarne 00000111 Referenční odkazují na objekty v paměti, jejich velikost není pevně dána Student objekt Scanner objekt Student referenční proměnná vstup referenční proměnná
Nejzákladnější forma dat v jazyce Java Při deklaraci proměnné prim. dat. typu dochází k alokaci určitého počtu bitů v paměti Velikost alokované paměti záleží na datovém typu Začínají vždy malým písmenem (dle konvence) Příklady: byte x = 10; char znak = A ; boolean souhlas = true; double = 2563.5;
Pri. Operátor Popis Asoc. 1 (), [] Primární výrazový L 2 ++, -- Inkrement (post, pre) P 2 +, - Unární plus, minus (změna znaménka) 2 ~ Bitový doplněk P 2 () Přetypování P 2! Logická negace P 3 *, /, % Násobení, dělení, zbytek po dělení L 4 +, - Součet, rozdíl, spojování řetězců L 5 <<, >>, >>> Posun vpravo, posun vlevo L 6 <, <=, >, >= Menší, menší rovno, větší, větší rovno (vrací boolean) 6 instanceof Porovnání typů (vrací boolean) L P L
Pri. Operátor Popis Asoc. 7 ==,!= Rovno, není rovno (vrací boolean) L 8 & Logické a bitové AND L 9 ^ Logické a bitové XOR L 10 Logické a bitové OR L 11 && Podmínkové AND (vrací boolean) L 12 Podmínkové OR (vrací boolean) L 13 (? : ) Podmínkový operátor P 14 =, +=, /=, *=, %=, -=, <<=, >>=, >>>=, &=, ~=, ^= Operátory přiřazení Více operátorů se stejnou prioritou rozhoduje asociativita int y = x += 1; // x = 2, vysledek bude 3 P
Základní tvar: if (vyraz) { prikaz; } Výsledkem výrazu musí být vždy true nebo false Blok else je volitelný if (vyraz) { prikaz1; } else { prikaz2; }
Obecný tvar vícenásobného rozhodování switch (vyraz) { case konst1: blok1; case konst2: blok2; default: blokd; } Výraz může být typu char, byte, short, int, enum
Neznámý počet opakování podmínka na začátku Probíhá dokud platí podmínka Nemusí proběhnout ani jednou while (bool. vyraz) { } prikaz;? fals e int x = 2; while (x == 2) { System.out.println(x); ++x; } true
Neznámý počet opakování podmínka na konci Probíhá dokud platí podmínka Proběhne vždy alespoň jednou do { prikaz; } while (bool. vyraz); int x = 2; do { System.out.println(x); ++x; } while (x == 2); true? fals e
Známý počet opakování for (inic.; podminka; iterace) { } telocyklu; for (int i = 0; i < 10; i++) { } System.out.println("i = " + i); for (int i = 20; i > 0; i--) { } System.out.println("i = " + i);
Deklarace referenční proměnné a vytváření objektů Jakého typu má být referenční proměnná Deklarace referenční proměnné Vytvoření objektu Student objekt Student studentnovak = new Student(); studentnovak referenční proměnná Vazba mezi referenční proměnnou a objektem
Příklad: [modifikator] class <JmenoTridy> { <atributy> <konstruktory> <metody> } public class Student { int znamkaprogramovani = 1; } void vyhodnotznamku() { if (znamkaprogramovani == 1) { System.out.println("Student ma znamku vyborne"); } else... }
Základní syntaxe [modifikator] <typ> <identifikator> [ = <inic. hodnota>]; public class Obdelnik { int delka; int sirka; boolean jezobrazen; String oznaceni; } Přístup k atributům tečková notace obdelnik1.delka = 5;
Základní syntaxe [modifikator] <navratovy_typ> <nazev> ([parametry]) { } prikaz1; prikaz2;... public void nastavznamku(int znamka) { } znamkaprogramovani = znamka; Volání metod tečková notace, argumenty studentnovak.nastavznamku(1);
Deklarace ref. proměnné typu pole datovytyp[] pole; datovytyp pole[]; //povoleno, ale nedoporucuje se Vytváření objektů typu pole pole = new datovytyp[pocetprvku]; pole = new double[10]; pole[0] odkazuje na první prvek pole pole[9] odkazuje na poslední prvek pole
Deklarace datovytyp[][] refpromenna; Vytvoření objektu refpromenna = new datovytyp[10][10]; Kombinace dekl. a inicializace datovytyp[][] refpromenna = new datovytyp[10][10]; Alternativa (nedoporučuje se) datovytyp refpromenna[][] = new datovytyp[10][10];
matice 6 7 0 1 matice[0] null 0 1 2 9 8 5 0 1 2 matice[1] int[][] matice = new int[3][]; matice[0] = new int[2]; matice[0][0] = 6; matice[0][1] = 7; matice[1] = new int[3]; matice[1][0] = 9;
Při vytváření objektů se používají konstruktory Nastavují vlastnosti objektů S využitím parametrů Bez parametrů Nemá žádný návratový typ nic nevrací Každá třída disponuje alespoň jedním konstruktorem i pokud nevytváříme konstruktor vlastní (implicitní, bez parametrů) Název konstruktoru se vždy shoduje s názvem třídy a konstruktor je vždy doplněn závorkami jako metody Pokud vytvoříme vlastní konstruktor, tak implicitní konstruktor není k dispozici (pokud si takový konstruktor nevytvoříme) Ukázka pomocí příkazu javap
Stejné názvy metod a konstruktorů (více variant jedné metody nebo konstruktoru) Nelze pouze změnit návratový typ Pokud změněn pouze návratový typ, nejedná se o přetížení Návratový typ může být změněn Přetížení (není přepis metod další přednášky na téma základů dědičnosti) Musí být změněn počet nebo typ parametrů
Stejné názvy instančních proměnných a parametrů použije se vždy bližší definice proměnné this přístup k instančním proměnným a metodám public class Student { String jmeno; } void zmenjmeno(string jmeno) { this.jmeno = jmeno; } public static void main(string[] args) { Student st = new Student(); st.zmenjmeno("adam"); }
Parametry Jsou lokální proměnné metod (jen mají definovanou hodnotu, lze ji měnit až na výjimky final) Typ argumentů musí vždy odpovídat typu parametrů Argumenty mohou být literální hodnoty i proměnné V některých jazycích lze realizovat dva typy předávání parametrů (např. Pascal) Hodnotou kopírování hodnoty argumentu do parametru Odkazem propojení formálního parametru a skutečného argumentu Jazyk Java předávání parametrů hodnotou (pass by value)
Deklarace statických proměnných, metod a konstant Modifikátor static
Balíčky umožňují Organizovat větší projekty Členit programy na logické celky Vytvářet jmenné prostory v každém balíčku vždy jen jedna třída stejného názvu Jedná se o podobnou práci jako se složkami v operačním systému Plný název třídy se skládá z uvedení balíčků a názvu třídy (např. java.lang.math, java.lang.string) Při využívání tříd z balíčků je nutné uvádět příkaz import
Syntaxe třídy <modifikator> class <Jmeno> [extends <Predek>] { } Vícenásobná dědičnost s využitím slova extends není v jazyce Java povolena Předek typu class je vždy pouze jen jeden Jiný typ vícenásobné dědičnosti (jedna třída má více předků) rozhraní Jeden předek může mít i více potomků násl. příklady
U tříd, na základě kterých nemá význam vytvářet objekty Pomocí modifikátoru abstract zamezíme vytvoření objektu V diagramu tříd název třídy odlišíme kurzívou Technik Zamestnanec -jmeno: String -plat: double -datumnarozeni: Date +getdeitals(): String Manazer -oddeleni: String
Přístupová práva Modifikátor V rámci třídy V rámci balíčku Potomek Jiné balíčky private Ano default Ano Ano protected Ano Ano Ano public Ano Ano Ano Ano
Potomek dědí metody od předka Změna implementace metody předka potomkem Překrývání metod (method overriding) Např. metody ve třídách CD, DVD vypis() Metody mohou být překryty pouze tehdy, pokud jsou dostupné Privátní metody nejsou dostupné mimo třídu, kde jsou definovány Proto nemohou být překryty a v takovém případě se nejedná o překryté metody, ale zcela nezávislé metody
Každá třída je potomkem třídy Object I pokud není definován žádný vztah dědičnosti, tak je předkem třídy třída Object Viz příkaz javap
Mnohotvárnost Proměnná m je typ Medium Do ref. proměnné lze přiřadit objekty jakékoliv podtřídy Rovněž v případě parametrů a návratových hodnot Medium m = new CD(); // v poradku String s = m.getautor(); // chyba CD m = new Medium(); // chyba Pokud chceme pracovat jako s objektem CD, přetypování
Princip podobný jako u primitivních datových typů Lze aplikovat také na objekty v hierarchii dědičnosti Souvisí s polymorfismem Object o = new Student(); // implicitni pretypovani Třídu Object tímto způsobem používáme jen v odůvodněných případech Student s = o; // chyba Chyba objekt, na který odkazuje ref. prom. "o" nemusí být objektem typu Student
Syntaxe stejná jako u prim. datových typů Object o = new Student(); // implicitni pretypovani Student s = o; // chyba Student s = (Student) o; // v poradku Explicitní přetypování musí být realizováno při přetypování z předka na potomka Nemusí vždy skončit úspěchem
Test, zda se u objektu jedná o instanci určité třídy Object mujobjekt = new Kruznice();... if (mujobjekt instanceof Kruznice) { System.out.println("Prumer kruznice je: " + ((Kruznice)mujObjekt).getPrumer());... }
Errors způsobené JVM, vnitřní systémové chyby Exceptions způsobené programem a okolnostmi (mohou být zachyceny a ošetřeny)
Kontrolované výjimky Třída Exception a její potomci Použití pro předpokládané chyby Je vyžadováno jejich ošetření programátorem Nekontrolované výjimky Třídy RuntimeException a Error a jejich potomci Použití pro neočekávané chyby
Konstrukce podobná třídám, ale může obsahovat pouze Konstanty Abstraktní metody (neobsahují žádnou implementaci a mají modifikátor abstract) Rozhraní je podobné abstraktním třídám, ale účelem je specifikace chování objektů (např. faktura je splatná, zaměstnancům je nutné platit apod. viz příklady na cvičení).
public interface ISplatne { public double MAX_PLATBA = 100000.0; } public void zaplatit(); stejné Přístup ke konstantám je stejný jako v případě použití tříd