Fejlett Webes Technolgik II Bilicki Vilmos 2002 09
Fejlett Webes Technológiák II. Bilicki Vilmos 2002. 09. 16
A mai előadás tartalma: l l A speckoll. célja Java nyelv alapjai
A speckoll. célja l l l Java programozás JME (Java Micro Edition) használata Fejlesztő környezet: • • Java ONE 4 Mobile Edition Nokia API-k Alkalmazások: • • hálózatos önálló Cél: • • Nokia mobil telefonok programozása Használható ötletes alkalmazások fejlesztése
Miért hasznos a speckoll. l l Java JME (5 millió mobil készülék Magyarországon)
Mobil alkalmazások l l http: //www. midletcentral. com http: //midlet. org/jsp/index. jsp
A speckoll. felépítése l l l l Java áttekintés (1. óra) Java. ONE fejlesztő környezet (2. óra) Java Micro Edition (2. óra) Nokia API (3. óra) Nokia API (4. óra) Feladatok megbeszélése, kiosztása (5. óra) Konzultációk (minden héten a speckoll időpontjában, a csoport vezetővel)
Csoportok l l 3 -4 fős csoportok (egy vezető) Egy alkalmazást 2, 3 csoport fejleszt Feladatok: • • • Program fejlesztés Tesztelés Dokumentálás (Felhasználói, fejlesztői: UML, …) Év végén használható program produkálása !
Hasznos hivatkozások l l https: //160. 114. 55. 228 h_op, alfa 1 http: //java. sun. com/j 2 me/ http: //64. 78. 49. 204/ http: //www. forum. nokia. com/main. html
Java nyelv I. l l Egyszerű • a kezdők is könnyen boldogulnak vele (C, C++) • komplex feladatok egyszerűen megoldhatóak vele (hálózat kezelés, grafika) • • az alapoktól kezdve (a primitív adattípusok kivételével minden objektum) elosztott rendszerek (komponens alapú fejlesztés, újrafelhasználhatóság) • • fordításkor ellenőrzés nincs pointer (NULL pointerre hivatkozás, levegőbe lógó mutatók) nincs automatikus konverzió dinamikus szemétgyűjtés (memory leak) Magasszintű Objetum orientált Biztonságos, robosztus
Java nyelv II. l l Platform független • nem tartalmaz architektúra függő elemeket (az int, mérete … nyelvi szinten definiált) Interpretált, dinamikus • • • gyors fejlesztési ciklus (nincs szükség make-re) class loader (package) virtuális gép byte kód (a hivatkozások csak futás időben oldódnak fel) 10 -20 -szor lassabb mint gépi kódú megfelelője Többszálú Elosztott (a class loader képes hálózatról betölteni az osztályt, RMI, …)
Hogyan működik ? I. l l l JVM Java API . java fájl javac osztaly. java osztaly. class java osztaly
Hello World ! /** * A Hello. World. App osztály mely a szabványos kimenetre kiírja a Hello World üdvözletet. */ class Hello. World. App { public static void main(String[] args) { System. out. println("Hello World!"); //Kiírja a szöveget. } } l l Hello. World. App. java fájl javac Hello. World. App. java Hello. World. App. class java Hello. World. App
Változók l l l A minden változóhoz típust és nevet kell rendelnünk. A változók nevét kicsi betűvel kezdjük, a több szóból álló változókat a szóhatárnál nagybetűvel választjuk el. bool is. Visible; az aláhúzást mindenhol használhatjuk de csak a konstansokban szokás az utasítások végén ;
Példa public class Max. Variables. Demo { public static void main(String args[]) { byte largest. Byte = Byte. MAX_VALUE; short largest. Short = Short. MAX_VALUE; int largest. Integer = Integer. MAX_VALUE; long largest. Long = Long. MAX_VALUE; float largest. Float = Float. MAX_VALUE; double largest. Double = Double. MAX_VALUE; char a. Char = 'S'; boolean a. Boolean = true; System. out. println("The largest byte value is " + largest. Byte); … } }
Operátorok I. • () []. - zárójelek, indexelés, osztály komponensére hivatkozás • ++ - - ! ~ instanceof - (pre- vagy poszt-) inkremens és dekremens, logikai és bitenkénti negálás, típus ellenôrzés • new (type)expression - új egyed létrehozása • * / % - szorzás, osztás, moduló • + - összeadás, kivonás
Operátorok II. • • • << >> >>> - bitenkénti léptetések < > >= <= összehasonlítások == != egyenlô, nem egyenlô & bitenkénti AND ^ bitenkénti XOR | bitenkénti OR && logikai AND || logikai OR ? : feltételes kifejezés = += -= *= /= %= ^= &= |= <<= >>>= különbözô értékadások
Vezérlő szerkezetek I. l l ciklusok: • while • do-while • for while (kifejezés) { } utasítások } while (kifejezés); for (inicializálás; befejezés; növekmény) { döntési pontok: } • if-else • switch-case do { utasítások if (feltétel) { utasítás ha teljesül} else { utasítás ha nem teljesül } switch (változó(csak int)) { case érték 1: utasítás 1; break; case érték 2: utasítás 2; break; default: utasítás; }
Vezérlő szerkezetek II. l kivétel kezelés: l elágazás • try-catch-finally • break (kilép) • continue (ellenőrzi a • feltételt) return (kilép a metódusból) try { utasítások } catch (kivétel neve) { utasítások} finally { utasítások}
Objektumok I. l l A primitív típusok kivételével minden objektum Egy objektum létrehozásának fázisai: Deklarálás Példányosítás Inicializálás Point origin_one = new Point(23, 94); Rectangle rect_one = new Rectangle(origin_one, 100, 200); Rectangle rect_two = new Rectangle(50, 100);
Objektumok II. l l l Felhasználói felület objektumok • A felhasználó ezeken keresztül kommunikál (widget (window gadgets) ablak-szerkenyű) Környezeti objektumok • az operációs rendszer objektumai Feladat specifikus objektumok • • • dokumentumok multimédia probléma tartomány
Objektumok III. l l l l Az objektumok metódusait, változóit az objektumon keresztül érhetjük el. Nem célszerű a változókhoz közvetlen hozzáférést engedélyezni. Az objektumok felszabadításával a program futása után nem kell foglalkoznunk. (NULL értéket kell adnunk a referenciájának) A szemét gyűjtő megteszi ezt helyettünk (mi is meghívhatjuk System. gc()). finalize metódus (a szemétgyűjtő meghívja ezt mielőtt megszüntetné) Minden egyes objektumnak meghatározott típusa kell, hogy legyen. Minden változó hivatkozás. Érték adáskor erre figyelnünk kell ! Rectangle rect_one = new Rectangle(origin_one, 100, 200); int terulet = rect_one. area(); int w = rect_one. width;
Objektumok IV. public class Point { public int x = 0; public int y = 0; public Point(int x, int y) { this. x = x; this. y = y; } } class teszt { public static void main(String[] args) { Point masolat; Point eredeti = new Point(23, 94); masolat = eredeti; masolat. x=1000; System. out. println(eredeti. x); } } if (x instanceof Person) System. out. println("x egy személy!");
Osztályok létrehozása: • • Osztály deklaráció • • • public – alapértelmezés, egyébként csak az azonos csomagban lévő osztályok használhatják abstract – az osztály nem pédányosítható final – az osztályból nem származtatható másik class osztálynév – az osztály neve extends – az osztály őse (mindenképpen kell egy ős) implements interface – a megvalósított egy, vagy több interfész Osztály törzs • • a változókat és a metódusokat tagoknak nevezzük konstrutor • • • private – más osztály nem példányosíthatja az osztályunkat protected – csak alosztályok és az egy csomagban lévő osztályok példányosíthatják public – bármely osztály példányosíthatja
Konstruktorok public class Rectangle { public int width = 0; public int height = 0; public Point origin; Rectangle() { origin = new Point(0, 0); } public Rectangle(Point p) { origin = p; } public Rectangle(int w, int h) { this(new Point(0, 0), w, h); } public Rectangle(Point p, int w, int h) { origin = p; width = w; height = h; } }
Tag változók l tag változók: • hozzáférési szint: • • static – ez osztály változó (pl. példány számlálás) final – nem változtatható transient – nincs teljesen specifikálva de az objektum mentésnél az ilyen nem mentődik el voaliate – ritkán használt tulajdonság (megakadályozza a fordítót bizonyos optimalizálások elvégzésében) • private - osztály • protected – osztály, csomag, alosztály • public - mindneki • package – osztály, csomag
Metódusok Hozzáférési szint Visszatérési érték Kivétel kezelés Paraméterek deklaráció törzs public Object push(Object item) throws … { items. add. Element(item); return(item); }
Metódusok I. l l Hozzáférési szint: • • private - osztály protected – osztály, csomag, alosztály public - mindenki package – osztály, csomag Static – akkor is el lehet érni amikor nincs példányosítva public class teszt { public static int x; public static void pelda() { System. out. println(x); } } class teszt { public static void main(String[] args) { System. out. println(teszt. x); } }
Metódusok II. l l abstract – nincs implementálva, csak absztrakt osztály tagja lehet (csak a koncepciót vázoljuk, a megvalósítás az alosztályok feladata lesz) final – nem írható felül (biztonsági okok (string - final), tervezés) native – más nyelven írt függvény(a JNI segítségével oldható meg) synchronised – párhuzamosan futó szálak metódusokat használhatnak, hogy hozzáférjenek a változókhoz. Ezzel oldhatjuk meg a zárolást
Metódusok III. l l throws exceptions – segítségével tudunk kivételeket kezelni az argumentumokat érték szerint adja át, a visszatérési értéket is. több metódusnak lehet egy neve, ekkor az argumentumok alapján dől el melyik hívódik meg (polimorfizmus) Az alosztályokban lévő ilyen nevű metódusok felülírják az ős metódusait
Öröklődés I. l l l az alap objektum az Object belőle származik minden objektum közvetlenül vagy közvetve az alosztály örökli az ős metódusait, változóit (az össze elődét) melyek public vagy protected láthatóságúak örököl mindent aminél nincs specifikálva a láthatóság és egy csomagban vannak mivel a konstruktor-ok nem tagok azok nem öröklődnek
Öröklődés II. l l l superclass – ősosztály az egyforma nevű változóknál, metódusoknál az alosztályé érvényes final metódust nem lehet felülírni abstract metódust kötelező felülírni (vagy az alosztálynak absztraktnak kell lennie) super. valtozonev – az ős változója super. metodusnev() – az ős metódusa
Object l l l minden osztály belőle származik közvetve vagy közvetlenül felülírható metódusai: • • clone (klónozás) equals/hash. Code (összehasonlítás, int) finalize (memória felszabadítás, super. finalize()) to. String végleges metódusai: • • get. Class notify. All wait
get. Class() l l végleges segítségével lekérhetjük az objektum osztályát, ősosztályát void Print. Class. Name(Object obj) { System. out. println("The Object's class is " + obj. get. Class(). get. Name()); } Object create. New. Instance. Of(Object obj) { return obj. get. Class(). new. Instance(); }
Egymásba ágyazott osztályok I. class Tartalmazo. Osztaly{. . . class Beagyazott. Osztaly {. . . } } l l l a beágyazott osztály hozzáfér a tartalmazó osztály minden tagjához a protected-hez is gyakran használják eseménykezelésre a beágyazott osztály lehet: • teljes • anonymous – egy metódusban definiáljuk
Egymásba ágyazott osztályok II. l anonymous public class kezelo implements Action. Listener { helyette: public hour. Field. add. Action. Listener() { new Action. Listener() { public void action. Performed(Action. Event e) { Integer. parse. Int(e. get. Action. Command); } } }
Interfészek l l az interfész egy protokollt definiál mely bárhol megvalósítható. segítségével tulajdonképpen megvalósítható a többszörös öröklődés az interfész metódusokat definiál, de nem implementálja őket definiálhat változókat is különbség az absztrakt osztály és az interfész között: • • • egy interfész nem implementálhat metódusokat egy osztály több interfészt megvalósíthat az interfész nem tagja az osztályhierarchiának
Interfész definiálása l l az interfész örökölhet extends (őse a szuper interfész) a metódusok törzs nélküliek csak static, final módosítók használhatóak minden public interface Stock. Watcher extends PStock. Watcher{ final String sun. Ticker = "SUNW"; final String oracle. Ticker = "ORCL"; final String cisco. Ticker = "CSCO"; void value. Changed(String ticker. Symbol, double new. Value); }
Interfész megvalósítása l l l minden az interfészben deklarált metódust meg kell valóstani az interfészt nem szabad módosítani! az extends az implements előtt szerepel public class Stock. Applet extends Applet implements Stock. Watcher {. . . public void value. Changed(String ticker. Symbol, double new. Value) { if (ticker. Symbol. equals(sun. Ticker)) {. . . } else if (ticker. Symbol. equals(oracle. Ticker)) {. . . } else if (ticker. Symbol. equals(cisco. Ticker)) {. . . } } }
Csomagkezelés l l l az osztálykezelés egyszerűbbé tétele feloldja az elnevezési problémákat az összefüggő osztályokat csomagokba lehet foglalni minden forrás fájl elejére oda kell tenni a package szót a csomagon kívül csak a public tagok, osztályok hozzáférhetőek elnevezésre a cégek a cég URL címének inverze használható: company. package graphics; public class Circle extends Graphic implements Draggable {. . . }
Csomagok használata l l l Hivatkozhatunk a tagra a teljes névvel A csomag tagot importáljuk Az egész csomagot importáljuk graphics. Rectangle my. Rect = new graphics. Rectangle(); import graphics. Circle; import graphics. *;
Egyszerű objektumok l l l Character – Olyan osztály mely karaktert tartalmazhat. Sok metódust biztosít a karaterk kezelésre. String – Az osztály alkalmas nem változtatható karakterláncok tárolására. String. Buffer – Változtatható karakterláncok tárolására alkalmas osztály. Number – Különböző számok tárolására alkalmas osztály mely hasznos metódusokkal is rendelkezik. Arrays – Tömbök tárolására szolgáló osztály.
Character l l l Character(char) - konstruktor compare. To(Character) – összehasonlítás (k, n, e) equals(Object) - összehasonlítás to. String() – átalakítja char. Value() – visszaadja az értékét is. Upper. Case(char) – nagybetű-e
String, String. Buffer l length() n append() capacity() n insert() char. At(int) n to. String() substring(int) n value. Of() substring(int, int) index. Of(int character) String pi. Str = "3. 14159"; last. Index. Of(int character) Float pi = Float. value. Of(pi. Str); index. Of(int character, int from) last. Index. Of(int character, int from) index. Of(String string) last. Index. Of(String string) index. Of(String string, int from) l last. Index. Of(String string, int from) l l l
Tömbök int a[] = new int[10]; l int[] a = new int[10]; l A név csak referencia l int a[][] = new int[10][3]; l system. out. println(a. length); // 10 -et ír ki l system. out. println(a[0]. length); // 3 -at ír ki háromszög alakú tömb : float f [][] = new float [10][]; for (int i = 0; i < 10; i++) f[i] = new float [i + 1]; l
Tömbök II. public class Array. Of. Arrays. Demo { public static void main(String[] args) { String[][] cartoons = { { "Flintstones", "Fred", "Wilma", "Pebbles", "Dino" }, { "Rubbles", "Barney", "Betty", "Bam Bam" }, { "Jetsons", "George", "Jane", "Elroy", "Judy", "Rosie", "Astro" }, { "Scooby Doo Gang", "Scooby Doo", "Shaggy", "Velma", "Fred", "Daphne" } }; for (int i = 0; i < cartoons. length; i++) { System. out. print(cartoons[i][0] + ": "); for (int j = 1; j < cartoons[i]. length; j++) { System. out. print(cartoons[i][j] + " "); } System. out. println(); } } }
Tömbök III. l arraycopy(Object source, int src. Index, public class Array. Copy. Demo { Object dest, public static void main(String[] args) int dest. Index, { char[] copy. From = { 'd', 'e', 'c', 'a', 'f', 'e', 'i', 'n', 'a', int length) 't', 'e', 'd' }; char[] copy. To = new char[7]; System. arraycopy(copy. From, 2, copy. To, 0, 7); System. out. println(new String(copy. To)); } }
JAR fájlok l l Segítségükkel több fájlt egy archívumba pakolhatunk Tipikusan egy alkalmazás class fájlait tartalmazza Az így csomagolt alkalmazás futtatható közvetlenül, appletként, az osztályai hozzáférhetőek Előnyei: • • biztonságos rövid letöltés tömörítés hordozhatóság
JAR fájlok kezelése l l l l jar cf jar-file input-file(s) - becsomagolás jar tf jar-file – tartalom megtekintése jar xf jar-file [archived-file(s)] - kicsomagolás java -jar jar-file – futtatás jar uf jar-file input-file(s) – frissítés jarsigner jar-file alias – aláírás jarsigner -verify jar-file - ellesnőrzés
Hibakezelés I. l l l Minden programban előfordulhat hiba. Ki kezeli le? A Java nyelv biztosít hibakezelést A szabványos Java hibakezelők használatával érthetőbb a kód (nem áll nek mindenki saját elképzelése szerint megvalósítani a hibakezelést) A hibakezelés megkönnyíti a különböző alkalmazások együttműködését A programkód és a hibakezelés elkülöníthető egymástól
Hibakezelés II. l l Megfelelő hibához megfelelő hibakezelő jár A runtime rendszer a Call stack-et nézi végig hibakezelő után kutatva. Ha több hibakezelőt is talál akkor a sorrend is számít Ha nem talál megfelelő kezelőt akkor a parancssoros rendszer leáll, a GUI tovább folytatja eseménykezelését
Hibakezelés metódusai l l try – körülfogja a kezelendő részt catch (Excetption e) – adott hibatípust kezel finally – végrehajtódik throw – továbbadja
public void write. List() { Print. Writer out = null; try { System. out. println("Entering try statement"); out = new Print. Writer( new File. Writer("Out. File. txt")); for (int i = 0; i < size; i++) out. println("Value at: " + i + " = " + victor. element. At(i)); } catch (Array. Index. Out. Of. Bounds. Exception e) { System. err. println("Caught Array. Index. Out. Of. Bounds. Exception: " + e. get. Message()); } catch (IOException e) { System. err. println("Caught IOException: " + e. get. Message()); } finally { if (out != null) { System. out. println("Closing Print. Writer"); out. close(); } else { System. out. println("Print. Writer not open"); } } } Példa
Hiba generálás l l l hibák – jelentekeznek, de nem rendszeresek pl. Illegal. Access. Exception , Negative. Array. Size. Exception futásidejű hibák – a virtuális gépen következnek be pl. Null. Pointer. Exception saját metódusaink jelezhetik a hibákat
Példa public Object pop() throws Empty. Stack. Exception { Object obj; if (size == 0) throw new Empty. Stack. Exception(); obj = object. At(size - 1); set. Object. At(size - 1, null); size--; return obj; }
Java. Doc l l l Java. API dokumentációhoz hasonló dokumentáció automatikus előállítása //** Ez egy érdekes osztály lesz mert dokumentálva van <tt>java. Util. Date</tt> */ public class Valami { Használhatunk HTML tag-eket Használhatunk speciális paramétereket: • • @author @version … A javadoc programmal tudjuk a dokumentációt előállítani
- Slides: 55