850 likes | 1.01k Views
JAVA Tutoriál. Ing. Lumír Návrat, A1018 Tel: +420 59 732 3252 Email: lumir.navrat @vsb.cz ICQ: 64100582 Materi ály vycházejí z podkladů doc. Ing. Miroslava Beneše , Ph.D. ( 28.5.2005). D oporu čená literatura. Učebnice
E N D
JAVATutoriál Ing. Lumír Návrat, A1018 Tel: +420 59 732 3252 Email: lumir.navrat@vsb.cz ICQ: 64100582 Materiály vycházejí z podkladů doc. Ing. Miroslava Beneše , Ph.D. (28.5.2005)
Doporučená literatura • Učebnice • Eckel, B.: Myslíme v jazyce Java. Grada, 2000.http://www.eckelobjects.com/ • Herout, P.: Učebnicejazyka Java. KOPP, 2000. • Pecinovský R.: Myslíme objektově v jazyku Java 5.0 • Internet • Studijní materiály k tutoriáluhttp://www.cs.vsb.cz/navrat/vyuka/esf/ • Slidy z předchozích kurzů výuky jazyka JAVA na katedře http://www.cs.vsb.cz/java/
Programové vybavení • http://java.sun.comJava SE Development Kit + dokumentace • http://ant.apache.orgNástroj pro správu projektů • Vývojová prostředí: Netbeans IDE, Eclipse, Borland JBuilder,Intelli JIdea... • Editory: JEdit, PSPad, TextPad, gvim, ..., Notepad
Vznik jazyka • Motivace: Jazyk pro tvorbu programového vybavení pro spotřební elektroniku – pračky, diáře, mikrovlnné trouby, ... • Požadavky: nezávislost na procesoru, spolehlivost, jednoduchost, robustnost. • 1990 - JamesGosling, Sun – jazyk Oak • 1993 – Internet + WWW = nové aplikace • Sun HotJava – prohlížeč s applety • 23. 1. 1996 – JDK 1.0 – první implementace • 2004 – JDK 1.5 -> JDK 5 Tiger – nové prvky jazyka • prosinec 2006 – JDK 6 – aktuální verze
Překlad a spuštění programu Test.java zdrojový program zpětnýpřeklad javac Test.java Test.class javap Test *.html java Test javadoc Test.java výsledky JIT dokumentace JIT – Just-In-Time překlad
Program Ant • Implementován v prostředí Java • Možnost rozšiřování • implementace akcí v jazyce Java • definované rozhraní • Činnost se řídí souborem v XML • build.xml • Integrován do vývojových prostředí • Eclipse, Netbeans, …
Struktura řídicího souboru project 1 1 n name default basedir description n property target name value location name depends if unless description 1 n task
Struktura řídicího souboru <?xml version="1.0"?> <project name="Test" default="all" basedir="."> <property name="src" location="src"/> <property name="build" location="classes"/> <target name="all" depends="init,compile,run"/> <target name="init"> <mkdir dir=“${build}”/> </target> <!-- … --> </project>
Spuštění programu • ant • řídicí soubor build.xml • provedení implicitního cíle • ant compile • provedení zadaného cíle • ant –buildfile test.xml • použití zadaného řídicího souboru • ant –Dbuild.compiler=jikes • nastavení hodnoty vlastnosti • ant –logfile build.log • uložení logu do souboru
Základní úlohy • Práce se soubory • <mkdir dir="${dist}/lib"/> • <delete dir="lib"/> • <delete> <fileset dir="." includes="**/*.bak"/> </delete> • <copy file="myfile.txt" tofile="mycopy.txt"/> • <move file="file.orig" todir="${dist}/lib"/>
Základní úlohy • Překlad • <javac srcdir="${src}" destdir="${build}" classpath="xyz.jar" debug="on" /> • <javac srcdir="${src}" destdir="${build}"> <classpath> <pathelement path="${classpath}"/><pathelement location="lib/helper.jar"/> </classpath> </javac>
Základní úlohy • Spuštění programu • <java classname="test.Main" > <arg value="-h"/> <classpath> <pathelement location="dist/test.jar"/> <pathelement path="${java.class.path}"/> </classpath> </java>
Zdrojový program package Priklady; // soubor Priklady/Test.java publicclass Test { publicstaticvoid main(String args[]) { System.out.println(“Ahoj!”); } }
Cílový program publicclassPriklady.Test extendsjava.lang.Object { publicPriklady.Test(); Code: 0: aload_0 1: invokespecial #1; //Methodjava/lang/Object."<init>":()V 4: return publicstaticvoidmain(java.lang.String[]); Code: 0: getstatic #2; //Fieldjava/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Ahoj! 5: invokevirtual #4; //Methodjava/io/PrintStream.println:(Ljava/lang/String;)V 8: return }
Datové typy • Primitivní datové typy • booleanFalse, True • char ‘A’, ‘\n’ • int, long 123, 5L • float, double 3.14f, 6.67e-19 • Referenční datové typy • String“abc”, “ab\tcd” • pole String[ ], int[ ] [ ] • Objekty • Boolean, Integer, Float, … objektové obálky primitivních typů. Od verze 5.0 existuje automatická konverze
Operátory • Aritmetické • x+y, x-y, x*y, x/y, x%y, -x • Relační • x == y, x != y, x < y, x <= y, x > y, x >= y • Logické • x && y, x || y, !x • Přiřazení • x = y • x += y, …, x++, x--
Příkazy - • Podmíněnýpříkaz • if ( podmínka ) příkaz • if ( podmínka ) příkazelsepříkaz • Cyklus • while( podmínka ) příkaz • dopříkazwhile(podmínka) + - + + -
Příkazy • for( inicializace; podmínka; krok ) příkaz for( inti = 0; i < 10; i++ ) { System.println(“i=“ + i); } for( Item i: kolekce) { System.println(“i=“ + i.toString()); } //Odverze JAVA 5.0 • break, continue for( inti = 0; i < 10; i++ ) { if( a[i] == x ) break; } - +
Program public class VypisParametru { public static void main(String[] args) { for( int i = 0; i < args.length; i++ ) { System.out.println(i + ”: “ + args[i]); } } }
Praktické cvičení – cviceni1.zip • Úloha 1 - Překlad a spuštění ukázkové třídy • Rozbalte v pracovním adresáři soubor priklad1.zip. • Prostudujte soubor Pokus.java. • Spusťte program ant, jenž vytvoří soubor Pokus.class a spustí jej. • Úloha 2 - Vytvoření vlastního programu • Na základě ukázkového programu vytvořte program pro řešení kvadratické rovnice, který z hodnot proměnných a, b, c typu double vypočítá hodnoty kořenů rovnice ax^2+bx+c=0. • Hodnoty proměnných a, b, c nastavte přímo v programu. • Pro výpočet druhé odmocniny použijte volání funkce Math.sqrt(x).
Řešení: Kvadratická rovnice static void kr(double a,double b,double c){ double d = b * b – 4 * a * c; if( d < 0 ) System.out.println(“Nemá reálné kořeny”); else if( d == 0 ) { double x = - b / (2*a); System.out.println("x=" + x); } else { double x1 = (-b + Math.sqrt(d)) / (2*a); double x2 = (-b – Math.sqrt(d)) / (2*a); System.out.println("x1=" + x1); System.out.println("x2=" + x2); }}
Praktické cvičení – cviceni2.zip • Úloha 1 – Prostudování práce s parametry příkazového řádku • Rozbalte v pracovním adresáři soubor priklad2.zip. • Prostudujte a vyzkoušejte způsob práce s parametry příkazové řádky, včetně chybové vstupu (Priklad1.java) • Úloha 2 – Seřazení obsahu pole • Vytvořte program, který vytiskne seřazené pole celočíselných hodnot zadaných jako parametry. (Priklad2.java) • Úloha 3 – Práce se standardním vstupem • Prostudujte práci se standardním vstupem • Upravte program pro výpočet kvadratické rovnice, aby načítal data ze vstupu.
Třídy a objekty T C E O
Co mají společného? • Vlastnosti (stav) • souřadnice středu x, y • barva • obsah, obvod • Operace (chování) • přesunutí na jinou pozici • n-násobné zvětšení a zmenšení • vykreslení na obrazovku • Vztahy • sousedí, překrývají se, ...
V čem se liší? • Druh obrazce • čtverec, trojúhelník, elipsa • Specifické vlastnosti • délka strany čtverce • velikosti poloos elipsy • Hodnoty vlastností • konkrétní souřadnice, barva, ... • Způsob provedení operací • vykreslení na obrazovku
Grafická reprezentace třídy Jméno třídy Zlomek Vlastnosti čitateljmenovatel Zlomek přičti(Zlomek jinýZlomek) Zlomek násob(Zlomek jinýZlomek) void normalizuj() Operace
Objekt = instance třídy Zlomek čitateljmenovatel z1 : Zlomek čitatel = 2 jmenovatel = 3 Zlomek přičti(Zlomek jinýZlomek) Zlomek násob(Zlomek jinýZlomek) void normalizuj() z3 : Zlomek z2 : Zlomek čitatel = 1 jmenovatel = 2 čitatel = -6 jmenovatel = 4
Třídy v jazyce Java class Zlomek { // instanční proměnné int citatel; int jmenovatel; // metody Zlomek nasob(Zlomek jiny) { citatel *= jiny.citatel; jmenovatel *= jiny.jmenovatel;} }
Vytvoření instance třídy public static void main(String[] args) { Zlomek z = new Zlomek(); // nastavení instančních proměnných z.citatel = 2; z.jmenovatel = 3;// volání metody z.nasob(z); // z *= z } reference
Jak se instance zruší? • Pascal, C, C++ – je třeba volat speciální operaci, která uvolní paměť:Pascal:Dispose(ptr)C:free(ptr);C++: delete ptr; • Java, .NET– automatická správa paměti (garbage collector) • paměť se uvolní automaticky, pokud na ni neexistuje žádný odkaz
Inicializace objektu • Zajištění definovaného stavu objektu po jeho vytvoření • všechny proměnné objektu se nastaví na nulu • je-li uvedena inicializace, provede se nastavení class Test { int x; // poč. hodnota je 0 int y = 10; // poč. hodnota je 10 int m() { int z; // POZOR! zde to neplatí! return z + 1; // chyba – neinicializovaná } // proměnná ‘z’}
Konstruktor • Zajištění inicializace objektu po vytvoření public class Zlomek { Zlomek(int citatel, int jmenovatel) { this.citatel = citatel; this.jmenovatel = jmenovatel; } … } Zlomek z1 = new Zlomek(3, 4); // ¾ Zlomek z2 = z1.pricti(new Zlomek(1,2)); není typ výsledku! odkaz na aktuální objekt
Příklad public classCitac{ inthodnota = 0; Citac(intpocatek) { hodnota = pocatek; } void krok() { hodnota++; } public static void main(String args[]) { Citacc = new Citac(10); c.krok(); System.out.println(c.hodnota); // 11 } }
Jak si hlídat svá data? public classCitac{ // veřejné metody public void nastavHodnotu(int nova) { hodnota = nova; } public intvratHodnotu() { return hodnota; } public void krok() { hodnota++; } // soukromá proměnná private inthodnota = 0; ...
Jak si hlídat svá data? public classTest { public static void main(String args[]) { Citac c = new Citac(); // c.hodnota = 10; -- není přípustné c.nastavHodnotu(10); c.krok(); System.out.println(c.vratHodnotu()); } }
Statické členy třídy • Instanční proměnné a metody • jsou vázané vždy na nějaký objektobj.proměnná, obj.metoda() • Proměnné a metody třídy • společné pro všechny instanceTřída.proměnná, Třída.metoda() • označují se klíčovým slovem staticstatic int počet;static void main(String[] args) {…}
Příklad public class Test { private static int pocet = 0; // vrátí počet vytvořených instancí třídy public static int pocetInstanci() { return pocet;} public Test() { pocet++;} ...
Příklad - pokračování ... public static voidmain(String args[]) { System.out.println(“Počet instanci = “ + Test.pocetInstanci()); Test t2 = new Test(); System.out.println(“Počet instanci = “ + Test.pocetInstanci()); } }
Dědičnost Obrazec int xint y presun(x1, y1) Elipsa Čtverec int a int b int a
Dědičnost class Obrazec { int x, y; void presun(int x, int y) { this.x = x; this.y = y; }}class Ctverec extends Obrazec { int a;}
Dědičnost • Je-li něco čtverec, pak je to i obrazec • Je-li něco obrazec, nemusí to být čtverec Ctverec c = new Ctverec();c.presun(10, 20); // dědí metodu presun()Obrazec o = c; // lze přiřadit • Obrazec o = new Ctverec();// o.a = 5; // nepřípustné • // Ctverec c = o; // nepřípustné
Dědičnost • Není-li uvedena bázová třída, použije se java.lang.Object • StringtoString() převod objektu na textovou reprezentaci • booleanequals(Object obj) porovnání s jiným objektem • inthashcode() číselný kód objektu • Objectclone() vytvoření kopie objektu
Zapouzdření prvků třídy • Soukromé proměnné/metody – private • přístupné pouze z vlastních metod • Chráněné proměnné/metody – protected • přístupné i z metod zděděných tříd • Veřejné proměnné/metody – public • přístupné i z metod jiných objektů
Konstruktory a dědičnost • Konstruktor musí nejprve zavolat zděděný konstruktor – zajištění správné inicializace class Obrazec { public Obrazec(int x, int y) { this.x = x; this.y = y; } protected int x, y;}class Ctverec extends Obrazec { public Ctverec(int x, int y, int a) { super(x, y); this.a = a; } protected int a;}
Konstruktory a dědičnost • Není-li zděděný konstruktor zavolán, zajistí se volání implicitního konstruktoru class Citac { public Citac() { hodnota = 10; } protected int hodnota;}public class CitacSKrokem extends Citac { public CitacSKrokem(int krok) { // super() -- zavolá se automaticky this.krok = krok; } protected int krok; public void volitelnyKrok() { nastavHodnotu(vratHodnotu()+krok); }}
Příklad class Test {public static void main(String[] args) { CitacSKrokem lepsiCitac = new CitacSKrokem(5); lepsiCitac.volitelnyKrok(); System.out.println(lepsiCitac.vratHodnotu()); lepsiCitac.krok(); System.out.println(lepsiCitac.vratHodnotu()); } }
Konstruktory a dědičnost • Neexistuje-li žádný konstruktor, vytvoří se prázdný implicitní konstruktor class Citac { // public Citac() {} -- vytvoří seprotected int pocet;} • Jak zajistit, aby nebylo možné vytvořit instanci třídy voláním operátoru new? class Citac { private Citac() {} ...}
Evidence osob public class Osoba { public String login; public String jmeno; public String prijmeni; } Problémy? Osoba os = new Osoba(); System.out.println(os); os.login = “bon007”;
1. problém - inicializace class Osoba { public Osoba(String l,String jm,String p) { login = l; jmeno = j; prijmeni = p; } … } Osoba os = new Osoba(“aaa000”, “Johnny”, “Walker”);