Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 1/36
1/3 Ke každému primitivnímu typu náleží třída (object wrapper). Třídy obsahují metody, které můžeme použít pro práci s hodnotami primitivních datových typů. Někdy je nutné pracovat s touto třídou namísto s primitivním datovým typem. Hodnoty v instancích těchto tříd jsou neměnné. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 2/36
2/3 Primitive type Size [bits] Wrapper class boolean - Boolean char 16 Character byte 8 Byte short 16 Short int 32 Integer long 64 Long float 32 Float double 64 Double void - Void c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 3/36
3/3 Společným předkem tříd Byte, Short, Integer, Long, Float a Double je třída Number. Některé statické metody: Převod hodnoty na řetězec. Např.: String s = Integer.toString(v); Převod řetězce na hodnotu. Např.: int v = Integer.parseInt(str); Některé statické konstanty: MIN_VALUE, MAX_VALUE reprezentují minimální a maximální hodnotu daného typu. Např.: int v = Integer.MIN_VALUE; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 4/36
Příklad, IntArray.java 1/6 package myapp ; public class I n t A r r a y i n t marray [ ] ; i n t msize ; public I n t A r r a y ( i n t c a p a c i t y ) marray = new i n t [ c a p a c i t y ] ; msize = 0 ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 5/36
Příklad, IntArray.java 2/6 public void add ( i n t value ) i f ( msize >= marray. l e n g t h ) r e s i z e ( msize + 1 ) ; marray [ msize ] = value ; msize ++; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 6/36
Příklad, IntArray.java 3/6 public i n t getvalue ( i n t index ) i n t r e t = 1; i f ( index < msize ) r e t = marray [ index ] ; return r e t ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 7/36
Příklad, IntArray.java 4/6 public void p r i n t ( ) for ( i n t i = 0 ; i < msize ; i ++) System. out. p r i n t ( marray [ i ] + " " ) ; System. out. p r i n t ( " \ n " ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 8/36
Příklad, IntArray.java 5/6 public i n t FindMax ( ) i n t max = I n t e g e r. MIN_VALUE ; i n t index = 1; for ( i n t i = 0 ; i < msize ; i + + ) i f ( max < marray [ i ] ) max = marray [ i ] ; index = i ; return index ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 9/36
Příklad, IntArray.java 6/6 public s t a t i c void main ( S t r i n g [ ] args ) I n t A r r a y array = new I n t A r r a y ( 1 0 ) ; for ( i n t i = 0 ; i < args. l e n g th ; i + + ) i n t v = I n t e g e r. p a r s e I n t ( args [ i ] ) ; array. add ( v ) ; array. p r i n t ( ) ; i n t maxindex = array. FindMax ( ) ; System. out. p r i n t l n ( " Maximalni prvek j e : " + array. getvalue ( maxindex ) + ", na p o z i c i : " + m c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 10/36
Příklad, myapp, kompilace, spouštění Kompilace: javac myapp \ I n t A r r a y. java Spouštění: java myapp. I n t A r r a y Dopsat metody: resize(int) add(int[] array) c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 11/36
Hodnota vs ukazatel 1/4 Primitivní vs objektové datové typy a pole. Příklad: public void Compute ( ) i n t a = 6 0 ; Set ( a ) ; / / a = 60 0x1232 0x2437 60 a 60 80 public void Set ( i n t b ) b = 8 0 ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 12/36
Hodnota vs ukazatel 2/4 Primitivní datové typy (int, float,... ) jsou odkazovány hodnotou, pole a instance objektových datových typů jsou odkazovány ukazateli. Příklad: public void Compute ( ) i n t pole [ ] = new i n t [ 1 ] ; pole [ 0 ] = 6 0 ; Set ( pole ) ; / / pole [ 0 ] = 8 0 public void Set ( i n t [ ] pole ) pole [ 0 ] = 8 0 ; / / pole 0x1232 Zásobník: 60 0x1232 c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 13/36
Hodnota vs ukazatel 3/4 Příklad: public void Compute ( ) i n t a = 6 0 ; IntNumber value = new IntNumber ( a ) ; Set ( value ) ; a = value. i n t V a l u e ( ) ; / / a = 8 0 public void Set ( IntNumber v a l ) v a l. s e t I n t ( 8 0 ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 14/36
Hodnota vs ukazatel 4/4 public void Compute ( ) i n t a = 6 0 ; I n t e g e r value = new I n t e g e r ( a ) ; Set ( value ) ; a = value. i n t V a l u e ( ) ; / / a = 60 public void Set ( I n t e g e r v a l ) v a l = new I n t e g e r ( 8 0 ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 15/36
Řízení přístupu Přístup ke členům třídy může být specifikován: public, protected, private nebo není specifikován (implicitní přístup default). public - přístupný z libovolné třídy, protected - přístupný z podtřídy a z jiné třídy stejného balíčku, default - přístupný z libovolné třídy stejného balíčku, private - přístupný pouze ve třídě, kde je člen definován. Při předefinování metody v podtřídě, musí být metoda deklarována se stejným nebo více volnějším přístupem než metoda v nadtřídě. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 16/36
Dědičnost a konstruktory 1/2 Konstruktory nejsou děděny. Podtřída musí definovat vlastní konstruktory. Konstruktory podtřídy mohou volat konstruktor nadtřídy pomocí klíčového slova super. class Bod public Bod ( i n t x, i n t y ) this. x = x ; this. y = y ;... class ColorPoint extends Bod public ColorPoint ( i n t x, i n t y, i n t c ) super ( x, y ) ; / / v o l a n i k o n s t r u k t o r u n a d t r i d y c o l o r = c ;... c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 17/36
Dědičnost a konstruktory 2/2 Když není volán žádný konstruktor nadtřídy v konstruktoru podtřídy, je použit konstruktor bez parametrů. Tato konstrukce je vložena na začátek konstruktoru. super ( ) ;... Pokud konstruktor není ve třídě definován (at již implicitně nebo explicitně) konstruktor bez parametrů, pak dojde k chybě při překladu. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 18/36
Konstanty 1/2 Konstanty jsou deklarovány klíčovým slovem final. f i n a l i n t MOVE_UP = 1 ; Hodnota takto deklarované konstantě může být přiřazena pouze při deklaraci. V případě instační proměnné také v konstruktoru. Pokud se pokusíme přiřadit hodnotu na jiném místě, překladač nahlásí chybu. MOVE_UP = 1 0 ; / / Chyba p r i prekladu Konstanty často deklarujeme jako třídní (static), v tomto případě existuje pouze jedna kopie pro všechny instance. s t a t i c f i n a l i n t NUMBER = 1 0 ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 19/36
Konstanty 2/2 Konvence: Jména konstant zapisujeme velkýmy znaky a znaky _. V kódu používáme názvy deklarovaných konstant místo celočíselných hodnot. Vyvarujeme se možných chyb a kód získá na čitelnosti. Konvence: konstanty se stejné množiny mají společný prefix, např. DIRECTION_UP, DIRECTION_DOWN,... c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 20/36
1/4 můžeme porovnat pomocí operátorů == a!=: Výsledek operátoru == je true pokud obě reference ukazují na stejný objekt nebo jsou obě null. V jiném případě je výsledek false. Operátor!= je negací operátoru ==. Point a = new Point ( 1 0, 2 0 ) ; Point b = new Point ( 1 0, 2 0 ) ; System. out. p r i n t l n ( a = = b ) ; / / f a l s e Object c = a ; System. out. p r i n t l n ( a = = c ) ; / / t r u e c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 21/36
, equals() 2/4 Třída java.lang.object je nadtřídou všech tříd na platformě Java. public boolean equals(object obj) Tato metoda třídy java.lang.object může být použita pro porovnání dvou různých objektů. Pokud metoda není v potomcích předefinována, pak se jedná o test (this == obj). c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 22/36
, equals() 3/4 class Point private i n t x, y ; public boolean equals ( Object obj ) i f (! ( obj instanceof Point ) ) return false ; Point p = ( Point ) obj ; return ( x = = p. x && y = = p. y ) ; public Point ( i n t x, i n t y ) this. x = x ; this. y = y ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 23/36
, equals() 4/4 Point a = new Point ( 1 0, 2 0 ) ; Point b = new Point ( 1 0, 2 0 ) ; Point c = new Point ( 3 0, 2 0 ) ; System. out. p r i n t l n ( a = = b ) ; / / f a l s e System. out. p r i n t l n ( a. equals ( b ) ) ; / / t r u e System. out. p r i n t l n ( a. equals ( c ) ) ; / / f a l s e c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 24/36
1/6 Řetězec je posloupnost znaků (primitivních typů char). V API existují dvě třídy reprezentující řetězec (obě v balíku java.lang): String a StringBuffer. Všechny řetězcové literály, např. "abc", jsou reprezentovány jako instance třídy String. Tyto instance jsou konstantní, jejich hodnota nemůže být po vytvoření měněna. StringBuffer představuje proměnný řetězec. String není pole řetězců. Tzn. char[] není String a opačně. Avšak, obě třídy String a StringBuffer používají pole řetězců pro vnitřní implementaci řetězce. c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 25/36
, třída String 2/6 Nejjednodušší způsob jak vytvořit řetězec: String s = "abc"; Přestože operátor new není implicitně volán, je vytvořena instance String. Třída obsahuje celou řadu konstruktorů. char data [ ] = a, b, c ; S t r i n g s = new S t r i n g ( data ) ; char data2 [ ] = a, b, c, d, e, f ; S t r i n g t = new S t r i n g ( data2, 2, 3 ) ; / / t = " cde " ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 26/36
, třída String 3/6 Významné metody: int length() vrací délku řetězce. char charat(int index) vrací znak na specifikované pozici. boolean equals(object obj) porovnává dva řetězce. S t r i n g s = " abcdef " ; System. out. p r i n t l n ( s. l e n g t h ( ) ) ; / / 6 System. out. p r i n t l n ( s. charat ( 5 ) ) ; / / f System. out. p r i n t l n ( s. equals ( " abcdef " ) ) ; / / t r u e System. out. p r i n t l n ( s. equals ( " h e l l o " ) ) ; / / f a l s e c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 27/36
, třída StringBuffer 4/6 Třída StringBuffer implementuje proměnný řetězec. Důležité metody: int length() void setlength(int newlength) char charat(int index) void setcharat(int index, char ch) int capacity() void ensurecapacity(int minimumcapacity) c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 28/36
, třída StringBuffer 5/6 Při práci s instancí String je velmi často volán operátor new. Použití třídy StringBuffer je tedy často efektivnější než použití třídy String. Konstruktory: StringBuffer() StringBuffer(int length) StringBuffer(String str) c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 29/36
, třída StringBuffer 6/6 Důležité metody: append - přidání řetězce na konec, insert - přidání řetězce na specifikovaný index. S t r i n g B u f f e r b = new S t r i n g B u f f e r ( " abcd " ) ; b. append ( " ef " ) ; / / b obsahuje abcdef b. i n s e r t ( 3, " ghi " ) ; / / b obsahuje abcghidef Obsah instance může být převeden na instanci String: S t r i n g s = b. t o S t r i n g ( ) ; / / abcghidef c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 30/36
Vyhledání podřetězce 1/3 public class SearchApp public SearchApp ( ) public s t a t i c void main ( S t r i n g [ ] args ) SearchApp app = new SearchApp ( ) ; i n t index = app. Search ( " Hello world! ", " Hello " ) ; / / index = 0 index = app. Search ( " Hello world! ", " h e l l o " ) ; / / index = 1 c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 31/36
Vyhledání podřetězce 2/3 i n t Search ( S t r i n g zdroj, S t r i n g vzor ) i n t r e t = 1; i n t length = z d r o j. l e n g t h ( ) vzor. l e n g t h ( ) ; for ( i n t i = 0 ; i < l e n g t h ; i ++) boolean f l a g = true ; for ( i n t j = 0 ; j < vzor. l e n g t h ( ) ; j ++) c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 32/36
Vyhledání podřetězce 3/3 i f ( z d r o j. charat ( i + j )! = vzor. charat ( j ) ) f l a g = false ; break ; i f ( f l a g ) r e t = i ; break ; return r e t ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 33/36
Rekurze, příklad 1/3 package DirReader ; import java. i o. ; public class DirReader S t r i n g mrootdirectory ; public DirReader ( S t r i n g d i r e c t o r y ) mrootdirectory = d i r e c t o r y ; public void Read ( ) Read ( mrootdirectory ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 34/36
Rekurze, příklad 2/3 private void Read ( S t r i n g d i r e c t o r y ) F i l e f i l e = new F i l e ( d i r e c t o r y ) ; S t r i n g [ ] l i s t = f i l e. l i s t ( ) ; for ( i n t i = 0 ; i < l i s t. l e n gth ; i + + ) F i l e c u r r e n t F i l e = new F i l e ( d i r e c t o r y + " \ \ " + l i s t [ i ] ) ; i f ( c u r r e n t F i l e. i s F i l e ( ) ) System. out. p r i n t l n ( c u r r e n t F i l e. getpath ( ) ) ; else Read ( c u r r e n t F i l e. getpath ( ) ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 35/36
Rekurze, příklad 3/3 public s t a t i c void main ( S t r i n g args [ ] ) DirReader dirreader = new DirReader ( " f : \ \ d i r " ) ; dirreader. Read ( ) ; c 2006 2008 Michal Krátký Úvod do programovacích jazyků (Java) 36/36