Title: JAVA Tutori
1JAVA Tutoriál
- Ing. Lumír Návrat, A1018
- Tel 420 59 732 3252
- Email lumir.navrat_at_vsb.cz
- ICQ 64100582
- Materiály vycházejí z podkladu doc. Ing.
Miroslava Beneše , Ph.D. - (?28.5.2005)
2Doporucená literatura
- Ucebnice
- Eckel, B. Myslíme v jazyce Java. Grada,
2000.http//www.eckelobjects.com/ - Herout, P. Ucebnice jazyka Java. KOPP, 2000.
- Pecinovský R. Myslíme objektove v jazyku Java
5.0 - Internet
- Studijní materiály k tutoriáluhttp//www.cs.vsb.c
z/navrat/vyuka/esf/ - Slidy z predchozích kurzu výuky jazyka JAVA na
katedre - http//www.cs.vsb.cz/java/
3Programové vybavení
- http//java.sun.comJava SE Development Kit
dokumentace - http//ant.apache.orgNástroj pro správu projektu
- Vývojová prostredí Netbeans IDE, Eclipse,
Borland JBuilder,Intelli JIdea... - Editory JEdit, PSPad, TextPad, gvim, ...,
Notepad ?
4Vznik jazyka
- Motivace Jazyk pro tvorbu programového vybavení
pro spotrební elektroniku pracky, diáre,
mikrovlnné trouby, ... - Požadavky nezávislost na procesoru,
spolehlivost, jednoduchost, robustnost. - 1990 - James Gosling, Sun jazyk Oak
- 1993 Internet WWW nové aplikace
- Sun HotJava prohlížec s applety
- 23. 1. 1996 JDK 1.0 první implementace
- 2004 JDK 1.5 -gt JDK 5 Tiger nové prvky jazyka
- prosinec 2006 JDK 6 aktuální verze
5Preklad a spuštení programu
Test.java
zdrojový program
zpetnýpreklad
javac Test.java
Test.class
javap Test
.html
java Test
javadoc Test.java
výsledky
JIT
dokumentace
JIT Just-In-Time preklad
6Program Ant
- Implementován v prostredí Java
- Možnost rozširování
- implementace akcí v jazyce Java
- definované rozhraní
- Cinnost se rídí souborem v XML
- build.xml
- Integrován do vývojových prostredí
- Eclipse, Netbeans,
7Struktura rí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
8Struktura rídicího souboru
- lt?xml version"1.0"?gt
- ltproject name"Test" default"all" basedir"."gt
- ltproperty name"src" location"src"/gt
- ltproperty name"build" location"classes"/gt
- lttarget name"all" depends"init,compile,run"/gt
- lttarget name"init"gt
- ltmkdir dirbuild/gt
- lt/targetgt
- lt!-- --gt
- lt/projectgt
9Spuštení programu
- ant
- rídicí soubor build.xml
- provedení implicitního cíle
- ant compile
- provedení zadaného cíle
- ant buildfile test.xml
- použití zadaného rídicího souboru
- ant Dbuild.compilerjikes
- nastavení hodnoty vlastnosti
- ant logfile build.log
- uložení logu do souboru
10Základní úlohy
- Práce se soubory
- ltmkdir dir"dist/lib"/gt
- ltdelete dir"lib"/gt
- ltdeletegt ltfileset dir"." includes"/.bak"
/gt lt/deletegt - ltcopy file"myfile.txt" tofile"mycopy.txt"/gt
- ltmove file"file.orig" todir"dist/lib"/gt
11Základní úlohy
- Preklad
- ltjavac srcdir"src"
destdir"build" classpath"xyz.jar"
debug"on" /gt - ltjavac srcdir"src" destdir"build"gt
ltclasspathgt ltpathelement path"classpath"
/gt ltpathelement location"lib/helper.jar"/gt
lt/classpathgt lt/javacgt
12Základní úlohy
- Spuštení programu
- ltjava classname"test.Main" gt ltarg
value"-h"/gt ltclasspathgt ltpathelement
location"dist/test.jar"/gt ltpathelement
path"java.class.path"/gt lt/classpathgt
lt/javagt
13Zdrojový program
- package Priklady // soubor
Priklady/Test.java - public class Test
-
- public static void main(String args)
-
- System.out.println(Ahoj!)
-
14Cílový program
- public class Priklady.Test extends
java.lang.Object - public Priklady.Test()
- Code
- 0 aload_0
- 1 invokespecial 1 //Method
java/lang/Object."ltinitgt"()V - 4 return
- public static void main(java.lang.String)
- Code
- 0 getstatic 2 //Field
java/lang/System.outLjava/io/PrintStream - 3 ldc 3 //String Ahoj!
- 5 invokevirtual 4 //Method
java/io/PrintStream.println(Ljava/lang/String)V - 8 return
15Datové typy
- Primitivní datové typy
- boolean False, True
- char A, \n
- int, long 123, 5L
- float, double 3.14f, 6.67e-19
- Referencní datové typy
- String abc, ab\tcd
- pole String , int
- Objekty
- Boolean, Integer, Float,
- objektové obálky primitivních typu. Od verze 5.0
existuje automatická konverze
16Operátory
- Aritmetické
- xy, x-y, xy, x/y, xy, -x
- Relacní
- x y, x ! y, x lt y, x lt y, x gt y, x gt y
- Logické
- x y, x y, !x
- Prirazení
- x y
- x y, , x, x--
17Príkazy
-
- Podmínený príkaz
- if ( podmínka ) príkaz
- if ( podmínka ) príkaz else príkaz
- Cyklus
- while( podmínka ) príkaz
- do príkaz while ( podmínka )
-
-
18Príkazy
- for( inicializace podmínka krok ) príkaz
- for( int i 0 i lt 10 i )
- System.println(i i)
-
- for( Item i kolekce)
- System.println(i i.toString())
- //Od verze JAVA 5.0
- break, continue
- for( int i 0 i lt 10 i )
- if( ai x ) break
-
19Program
- public class VypisParametru
- public static void main(String args)
- for( int i 0 i lt args.length i )
- System.out.println(i
argsi) -
20Praktické cvicení cviceni1.zip
- Úloha 1 - Preklad a spuštení ukázkové trídy
- Rozbalte v pracovním adresári soubor
priklad1.zip. - Prostudujte soubor Pokus.java.
- Spustte program ant, jenž vytvorí soubor
Pokus.class a spustí jej. - Úloha 2 - Vytvorení vlastního programu
- Na základe ukázkového programu vytvorte program
pro rešení kvadratické rovnice, který z hodnot
promenných a, b, c typu double vypocítá hodnoty
korenu rovnice ax2bxc0. - Hodnoty promenných a, b, c nastavte prímo v
programu. - Pro výpocet druhé odmocniny použijte volání
funkce Math.sqrt(x).
21Rešení Kvadratická rovnice
- static void kr(double a,double b,double c)
double d b b 4 a c if( d lt 0 )
System.out.println(Nemá reálné koreny)
else if( d 0 ) double x - b /
(2a) System.out.println("x" x)
else double x1 (-b Math.sqrt(d)) /
(2a) double x2 (-b Math.sqrt(d)) /
(2a) System.out.println("x1" x1)
System.out.println("x2" x2)
22Praktické cvicení cviceni2.zip
- Úloha 1 Prostudování práce s parametry
príkazového rádku - Rozbalte v pracovním adresári soubor
priklad2.zip. - Prostudujte a vyzkoušejte zpusob práce s
parametry príkazové rádky, vcetne chybové vstupu
(Priklad1.java) - Úloha 2 Serazení obsahu pole
- Vytvorte program, který vytiskne serazené pole
celocí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ýpocet kvadratické rovnice,
aby nacítal data ze vstupu.
23Dotazy
24Trídy a objekty
T
C
E
O
25Co mají spolecného?
- Vlastnosti (stav)
- souradnice stredu x, y
- barva
- obsah, obvod
- Operace (chování)
- presunutí na jinou pozici
- n-násobné zvetšení a zmenšení
- vykreslení na obrazovku
- Vztahy
- sousedí, prekrývají se, ...
26V cem se liší?
- Druh obrazce
- ctverec, trojúhelník, elipsa
- Specifické vlastnosti
- délka strany ctverce
- velikosti poloos elipsy
- Hodnoty vlastností
- konkrétní souradnice, barva, ...
- Zpusob provedení operací
- vykreslení na obrazovku
27Grafická reprezentace trídy
Jméno trídy
Zlomek
Vlastnosti
citateljmenovatel
Zlomek pricti(Zlomek jinýZlomek) Zlomek
násob(Zlomek jinýZlomek) void normalizuj()
Operace
28Objekt instance trídy
Zlomek
citateljmenovatel
z1 Zlomek
citatel 2 jmenovatel 3
Zlomek pricti(Zlomek jinýZlomek) Zlomek
násob(Zlomek jinýZlomek) void normalizuj()
z3 Zlomek
z2 Zlomek
citatel 1 jmenovatel 2
citatel -6 jmenovatel 4
29Trídy v jazyce Java
- class Zlomek
- // instancní promenné
- int citatel
- int jmenovatel
- // metody
- Zlomek nasob(Zlomek jiny) citatel
jiny.citatel jmenovatel jiny.jmenovatel -
30Vytvorení instance trídy
- public static void main(String args)
-
- Zlomek z new Zlomek()
- // nastavení instancních promenných
- z.citatel 2
- z.jmenovatel 3// volání metody
- z.nasob(z) // z z
reference
31Jak se instance zruší?
- Pascal, C, C je treba volat speciální
operaci, která uvolní pametPascal Dispose(ptr)
C free(ptr)C delete ptr - Java, .NET automatická správa pameti (garbage
collector) - pamet se uvolní automaticky, pokud na ni
neexistuje žádný odkaz
32Inicializace objektu
- Zajištení definovaného stavu objektu po jeho
vytvorení - všechny promenné objektu se nastaví na nulu
- je-li uvedena inicializace, provede se nastavení
-
class Test int x // poc. hodnota je 0
int y 10 // poc. hodnota je 10 int m()
int z // POZOR! zde to neplatí!
return z 1 // chyba neinicializovaná
// promenná z
33Konstruktor
- Zajištení inicializace objektu po vytvorení
public class Zlomek Zlomek(int citatel, int
jmenovatel) this.citatel citatel this.jme
novatel jmenovatel Zlomek z1 new
Zlomek(3, 4) // ¾ Zlomek z2 z1.pricti(new
Zlomek(1,2))
není typ výsledku!
odkaz na aktuální objekt
34Príklad
- public class Citac
- int hodnota 0
- Citac(int pocatek) hodnota pocatek
- void krok() hodnota
- public static void main(String args)
- Citac c new Citac(10)
- c.krok()
- System.out.println(c.hodnota) // 11
-
35Jak si hlídat svá data?
- public class Citac
- // verejné metody
- public void nastavHodnotu(int nova)
- hodnota nova
-
- public int vratHodnotu()
- return hodnota
-
- public void krok() hodnota
- // soukromá promenná
- private int hodnota 0
- ...
36Jak si hlídat svá data?
- public class Test
- public static void main(String args)
-
- Citac c new Citac()
- // c.hodnota 10 -- není prípustné
- c.nastavHodnotu(10)
- c.krok()
- System.out.println(c.vratHodnotu())
-
37Statické cleny trídy
- Instancní promenné a metody
- jsou vázané vždy na nejaký objektobj.promenná,
obj.metoda() - Promenné a metody trídy
- spolecné pro všechny instanceTrída.promenná,
Trída.metoda() - oznacují se klícovým slovem staticstatic int
pocetstatic void main(String args)
38Príklad
- public class Test
- private static int pocet 0
- // vrátí pocet vytvorených instancí trídy
- public static int pocetInstanci() return
pocet - public Test() pocet
- ...
39Príklad - pokracování
- ...
- public static void main(String args)
- System.out.println(Pocet instanci
- Test.pocetInstanci())
- Test t2 new Test()
- System.out.println(Pocet instanci
- Test.pocetInstanci())
-
40Dedicnost
Obrazec
int xint y
presun(x1, y1)
Elipsa
Ctverec
int a int b
int a
41Dedicnost
- class Obrazec int x, y void presun(int x,
int y) this.x x this.y y class
Ctverec extends Obrazec int a
42Dedicnost
- Je-li neco ctverec, pak je to i obrazec
- Je-li neco obrazec, nemusí to být ctverec
Ctverec c new Ctverec()c.presun(10, 20) //
dedí metodu presun()Obrazec o c // lze
priradit
Obrazec o new Ctverec()// o.a 5 //
neprípustné // Ctverec c o // neprípustné
43Dedicnost
- Není-li uvedena bázová trída, použije se
java.lang.Object - String toString()
- prevod objektu na textovou reprezentaci
- boolean equals(Object obj)
- porovnání s jiným objektem
- int hashcode()
- císelný kód objektu
- Object clone()
- vytvorení kopie objektu
44Zapouzdrení prvku trídy
- Soukromé promenné/metody private
- prístupné pouze z vlastních metod
- Chránené promenné/metody protected
- prístupné i z metod zdedených tríd
- Verejné promenné/metody public
- prístupné i z metod jiných objektu
45Konstruktory a dedicnost
- Konstruktor musí nejprve zavolat zdedený
konstruktor zajištení správné inicializace
class Obrazec public Obrazec(int x, int y)
this.x x this.y y protected
int x, yclass Ctverec extends Obrazec
public Ctverec(int x, int y, int a)
super(x, y) this.a a protected int
a
46Konstruktory a dedicnost
- Není-li zdedený konstruktor zavolán, zajistí se
volání implicitního konstruktoru
class Citac public Citac() hodnota 10
protected int hodnotapublic class
CitacSKrokem extends Citac public
CitacSKrokem(int krok) // super() -- zavolá
se automaticky this.krok krok
protected int krok public void
volitelnyKrok() nastavHodnotu(vratHodnotu()kro
k)
47Prí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())
-
48Konstruktory a dedicnost
- Neexistuje-li žádný konstruktor, vytvorí se
prázdný implicitní konstruktor
class Citac // public Citac() --
vytvorí se protected int pocet
- Jak zajistit, aby nebylo možné vytvorit instanci
trídy voláním operátoru new?
class Citac private Citac() ...
49Evidence osob
- public class Osoba public String login
public String jmeno public String prijmeni -
Problémy?
Osoba os new Osoba() System.out.println(os) o
s.login bon007
501. 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)
512. problém - zobrazení
- System.out.println(os)
- Osoba_at_2ae3645f
- class Osoba public String toString()
return jmeno " " prijmeni
System.out.println("os " os) - os Johnny Walker
Kdo je to?
523. problém - zapouzdrení
- public class Osoba private String
login - public String getLogin() return
login - public void setLogin(String login) //
tady by mela být kontrola - this.login login
-
534. problém - identita
- Osoba o1 new Osoba(007,James,Bond)
- Osoba o2 new Osoba(007,James,Bond)
- Platí o1 o2 ?
- public boolean equals(Object obj)
- if( obj instanceof Osoba )
- return login.equals(((Osoba)obj).login)
- return false
Ne! Ruzné objekty
54Príklad - Dedicnost
- class Student extends Osoba public
Student(String login, String jmeno,
String prijmeni, String obor)
super(login, jmeno, prijmeni) this.obor
obor public String getObor() return
obor public void setObor(String ob)
obor ob private String obor
55Praktické cvicení cviceni3.zip
- Úloha 1 Práce s trídami a objekty
- Rozbalte v pracovním adresári soubor
cviceni3.zip. - Prostudujte a vyzkoušejte zpusob práce s trídou
Zlomek (Priklad1.java) - Vytvorte trídu Complex, která bude reprezentovat
komplexní císlo s operacemi scítání, odcítání a
násobení - Upravte rešení kvadratické rovnice tak, aby
pracovalo s typem Complex
56Príklad - Obrazce
Obrazec
obvod()obsah()
Kruh
Obdélník
r
a, b
Ctverec
57Definice trídy Obrazec
- class Obrazec
- double obvod()
- return 0.0
-
- double obsah()
- return 0.0
-
Jak vypadá Obrazec? Je to ABSTRAKCE!
58Abstraktní trídy
- abstract class Obrazec public abstract
double obvod() public abstract double
obsah() - class Kruh extends Obrazec Kruh(double r)
this.r r double obvod() return 6.28
r double obsah() return 3.14 r r
double r
new Obrazec()
59Abstraktní trídy
- class Obdelnik extends Obrazec
Obdelnik(double a, double b) this.a a
this.b b double obvod() return
2(ab) double obsah() return ab -
- class Ctverec extends Obdelnik
- Ctverec(double a) super(a, a)
60Rozhraní
- interface Obrazec
- double obvod()
- double obsah()
-
- class Kruh implements Obrazec
- Kruh(double r) this.r r double
obvod() return 6.28 r double obsah()
return 3.14 r r double r
61Rozdíly
- Abstraktní trída
- muže obsahovat instancní promenné
- muže obsahovat konkrétní metody
- lze rozširovat pouze jednu trídu
- Rozhraní
- nesmí obsahovat promenné
- všechny metody jsou public abstract
- lze implementovat více rozhraní
62Pozdní vazba
- static boolean vetsi(Obrazec o1, Obrazec o2)
return o1.plocha() gt o2.plocha() - Která metoda plocha() se volá?
- Vcasná vazba
- výber volané metody v dobe prekladu
- podle typu reference, pres kterou metodu voláme
- Pozdní vazba
- výber volané metody v dobe behu
- podle typu objektu, na který reference ukazuje
63Príklad použití pozdní vazby
- void print(Object obj) print
obj.toString() - class Object public String toString()
Osoba_at_24f32eclass Osoba extends Object
public String toString() Johnny Walker
64Pretežování operací
- Public class Citac int hodnota 0 void
krok() n void krok(int d) hodnota
d -
pretížená operace
1 1 2.5 3.14 abcd efgh
pretížený operátor
65Praktické cvicení cviceni3.zip
- Úloha 3 Rozšírení schopností trídy Complex
- Upravte trídu Complex tak aby implementovala zde
uvedené pretížené metody
class Complex public Complex()
public Complex(double r) public
Complex(double r, double i) public
add(Complex c) public add(double r)
public add(double r, double i)
66Prostory jmen motivace
- spolupráce více programátoru na jednom projektu
- class MojeTrida ???
- možnost distribuce knihoven tríd
- použití implementací z ruzných zdroju v jedné
aplikaci - new Seznam() ???
67Prostory jmen
- Jak zajistit jednoznacnost názvu?
- konvence pro pojmenování
- class MB_Trida
- centrální pridelování
- nerealizovatelné
- využití existujících jednoznacných názvu
- jméno domény organizace
- cs.vsb.cz, sun.com, ...
68Jména balíku tríd (packages)
java.lang . String . substring()
jméno metody
jméno balíku
jméno trídy
cz.vsb.cs.katis . Student . getLogin()
jméno balíku
jméno trídy
jméno metody
69Vyhledávání balíku
- umístení preložených tríd
- soubory .class
- archivy .jar (odpovídá formátu .zip)
- nastavení cest pro vyhledávání
- set CLASSPATH.c/java/libc/java/lib/mylib.jar
- java classpath ./classes vyuka.java.Priklad1
- struktura adresáre odpovídá jménu balíku
- ./classes/vyuka/java/Priklad1.class
70Definice príslušnosti k balíku
- package cz.vsb.cs.katis
- public class Student
- String login public String getLogin()
return login - ...
71Príklad
- package mujbalicek
- public class Citac
- ...
72Prístup k prvkum balíku
- Plne kvalifikované jméno
- Príkaz import dovoz jedné trídy
- Príkaz import dovoz celého balíku
- Príkaz import statický import (nove JAVA 5.0)
java.util.Date new java.util.Date()
import java.util.Date Date new Date()
import java.util. Date new Date()
import static java.math.PI double r
cos(Math.PI theta) double r cos(PI theta)
73Zapouzdrení prvku v balíku
- Trídy a rozhraní oznacené public
- prístupné ze všech balíku
- v souboru .java muže být pouze jeden prvek
oznacený public jméno se musí shodovat se jménem
zdrojového souboru - Trídy a rozhraní bez oznacení public
- prístupné pouze ze stejného balíku
- v souboru .java jich muže být libovolný pocet
74Zapouzdrení prvku ve tríde
- private
- dostupné pouze v rámci tela trídy
- protected
- dostupné v rámci stejného balíku trídám, které
z aktuální trídy dedí - public
- dostupné z libovolné trídy libovolného balíku
- bez oznacení
- dostupné z libovolné trídy téhož balíku
75Kolize ve jménech
- Odkaz musí být jednoznacný
- Pozn. Co když chybí príkaz package?
- implicitní balík vše funguje i bez public!
import cz.vsb.cs.util.import
java.util. Date today new
Date() java.util.Date today new
java.util.Date()
76Standardní balíky JDK
- java.lang
- nepotrebuje príkaz import, doveze se automaticky
- základní trídy (Object, Class, String, System,
Math, Integer, Thread, ...), rozhraní
(Comparable, ...) a výjimky (Exception, ...)
System.exit(1)System.out.println(
str.toLowerCase() )int val Integer.parseInt(st
r)double rnd Math.random()if(
Character.isDigit(c) )
77Standardní balíky JDK
- java.util
- pomocné trídy (Currency, Calendar, Date, Random),
- rozhraní a implementace abstraktních datových
typu (List, Set, Map, LinkedList, TreeSet,
TreeMap)
import java.util. System.out.println(new
Date())Arrays.sort(arr)
78Standardní balíky JDK
- java.io
- práce s datovými proudy (soubory, bloky pameti,
retezce, roury, ...) - java.net
- podpora sítových aplikací (trídy URL, Socket,
...) - java.rmi
- vzdálené volání metod (rozhraní Remote)
79Standardní balíky JDK
- java.applet
- podpora appletu aplikací bežících v prohlížeci
na strane klienta (IE, Netscape, ...) - java.awt
- jednoduchá knihovna komponent grafického
uživatelského rozhraní - javax.swing
- pokrocilá knihovna komponent grafického
uživatelského rozhraní
80Standardní balíky JDK
- java.sql, javax.sql
- jednotný prístup k SQL databázím
- javax.xml.parsers, javax.xml.transform
- analýza XML souboru a jejich transformace
- java.security, javax.security
- kryptografie a bezpecnost aplikací
81Rešení príkladu ze cvicení
- package cviceni3public class Complex
-
- private double re private double im
- public double getRe() return re
- public double getIm() return im
- public double abs()
- return Math.sqrt(re re im im)
-
82Rešení príkladu ze cvicení
- public Complex()
- public Complex(double re)
- this.re re
- this.im 0.0
-
- public Complex(double re, double im)
this.re re - this.im im
-
83Rešení príkladu ze cvicení
- public void add(Complex c)
- re c.re
- im c.im
-
- public static Complex add(Complex c1,
Complex c2) -
- double re c1.re c2.re
- double im c1.im c2.im
- return new Complex(re, im)
-
84Rešení príkladu ze cvicení
- public String toString()
- return im 0.0 ? Double.toString(re)
re 0.0 ? im i re (im lt 0.0 ? ""
") im "i" - public boolean equals(Object obj) if(
obj instanceof Complex ) Complex c
(Complex)obj return re c.re im
c.im return false -
85Praktické cvicení cviceni4.zip
- Úloha 1 Práce s rozhraními
- Rozbalte v pracovním adresári soubor
cviceni4.zip. - Prostudujte jakým zpusobem je zajišteno trídení
bulbinkovou metodou objektu typu
Zlomek(Priklad.java) - Rozširte trídu Complex o implementaci rozhraní
Porovnatelny - Úloha 2 Práce s rozhraními Comparable,
Comparator - Prostudujte v JAVA API tyto dve rozhraní
- Upravte trídy v balicku cviceni4 tak, aby
používaly dané rozhraní.