A Java nyelv Bevezetés, alapok Elek Tibor
A Java nyelv jellemzıi Interpreteres Forrás file fordítás Bytekódú file-ok (class fileok, nem gépikód, nem futtatható, egy új forrásnyelv) Interpreter: betölti, soronként (?!) fordítja és végrehajtja Java Virtuális Gép (JVM) Következmények: - A Bytekódú file hordozható - Webes környezetben is használható - Az interpreter program beágyazható más programokba vagy eszközökbe (böngészı, telefon) - Lassúság a compileres nyelvekhez képest!!!
A Java nyelv jellemzıi Objektum orientált nyelv - Megvalósítja az OOP alapelveit - A bonyodalmakat okozó részeket kihagyja, pl: többszörös öröklıdés (nehezebb megvalósítás, kódújrafelhasználás) operátor overloading (félreérthetı használat, kevésbé olvasható kód) - Szigorúan OOP (nincsen osztályon kívüli deklaráció, utasítás) Hasonlóság a C++-hoz - A szintaktika teljesen C++-szerő - Nincsenek mutatók (húúú, megkönnyebbülés) Gazdag osztály könyvtár (csomagok) - Kb. 4000 osztály illetve interfész a JSE 6-ban
Java nyelv verziói Megalkotója a Sun (a Microsoft Java.Net nem ez a nyelv, a JavaSricpt nem ez a nyelv) JRE (Runtime Environment): futtató környezet JDK (Development Kit): fejlesztı könyezet (JRE-t is) Fontosabb verziók: - JDK 1.0 (kb 1996) - JDK 1.2 (innentıl Java 2) (kb. 1998) új nyelvi elemek, fontos új csomagok - JDK 1.5 (kb. 2004) fontos új nyelvi elemek, ez elıttit nem érdemes használni! - Jelenleg 1.6-os verzió (innentıl nem Java 2, csak Java)
Java nyelv verziói JDK változatai (Java 2 óta): - Standard Edition: általános fejlesztési környezet (bıven elegendı) - Enterprise Edition: tartalmaz még nagymérető, elosztott alkalmazás fejlesztéséhez szükséges eszközöket - Micro Edition: kis kapacitású (kijelzı, mem., stb.) eszközökön (telefon) futó programok készítéséhez nyújt eszközöket
Java program felépítése Logikailag: Kizárólag osztályokból és interfészekbıl áll. Az osztályok (és interfészek) csomagokba (névtérhez hasonló fogalom) szervezhetık.
Java program felépítése Fizikailag: - JVM szemszöge: class file-okból áll. A class file-ok lehetnek jar vagy zip fileba tömörítve, vagy adatbázisban tárolva is. - fordító szemszöge: fordítási egységekbıl áll (forrás file) Egy fordítási egységben: egy publikus (lásd késıbb) osztály (interfész) + bármennyi nem publikus. A fordítási egység neve: publikus osztály neve és.java a kiterjesztése. Egy fordítási egységbıl több class file lehet.
Java program felépítése Forrás file szerkezete: csomag deklaráció import deklarációk osztály, interfész definíciók (egy publikus!) Sorrend fontos!
Java program felépítése Helló világ package sajat; public class Hello { } public static void main(string[] args) { System.out.println( Helló világ ); }
Csomagok 1. rész A logikailag összetartozó osztályok (interfészek) Elnevezés hierarchikus (a csomagok nem) - pl. java.util, java.awt, java.awt.event, org.omg.corba - A java.awt.event nem része a java.awt-nek. Két különbözı csomagban lehetnek azonos nevő osztályok (interfészek) Teljes név (minısített név): csomagnév.osztálynév (pl. java.util.date) Csomag deklaráció: package csomagnév;
Import Névtér használat Szintaktika: 1. import osztályteljesnév; 2. import csomagnév.*; Mőködés: 1. Az importált osztályra (interfészre) a fordítási egységen belül a teljes név helyett pusztán az osztálynévvel hivatkozhatunk. 2. A megadott csomag összes osztályára (interfészére) vonatkozik. Ütközés esetén továbbra is a teljes név kell. Létezik még statikus import is. Használatával nem értek egyet. Minden fordítási egység automatikusan importálja a java.lang.*-t
Java program felépítése Tehát egy másik osztály egy metódusában egy osztályra hivatkozhatok a teljes nevével: public class Masik { public static void main(string[] args) { java.util.date most = new java.util.date(); System.out.println(most.toString());}} vagy importálhatom és akkor rövidebben csak a nevével import java.util.date; public class Masik { public static void main(string[] args) { Date most = new Date(); System.out.println(most.toString()); }}
Java file-ok elhelyezkedése A class file-ok elhelyezése szabályrendszer alapján - osztálynév: sajat.masik.valami - forrás file név: Valami.java - class file név: Valami.class relatív útvonal: sajat/masik/valami.class abszolút útv.: CP/sajat/masik/Valami.class, hol a CP az úgynevezett classpath-ban megadott directory-k (jar file-ok) egyike. Classpath megadható: parancssori paraméterként, környezeti változóban. - forrás file útvonal: futtatáskor lényegtelen, fordításkor sourcepath paraméter
Fordítás, futtatás Fordítás: javac forrásfile pl. javac Valami.java fontos paraméterek: -classpath dirlista: már volt róla szó -d dir: a megadott directory lesz a relatív útvonal kiinduló pontja, e nélkül oda rakja, ahol a forrás van Hivatkozott osztályok keresése Futtatás: Csak olyan osztály futtatható, amelynek van public static void main(string[] args) { } Futtatás: java osztályteljesnév pl. java sajat.masik.valami fontos paraméterek: -classpath dirlista: már volt róla szó
Fordítás, futtatás javac -classpath.;\classes Akarmi.java Tegyük fel, hogy hivatkozás történik a sajat.masik.valami osztályra. A szabványos könyvtárakban nem találja. Ott java. és javax. kezdető típusok vannak... Keresi a.\sajat\masik\valami.class fájlt Ha nincs, keresi a \classes\sajat\masik\valami.class fájlt Ha az sincs, keresi a forrását, a sajat\masik\valami.java fájlt, hogy lefordítsa a -sourcepath kapcsoló alapján ha nincs megadva, akkor az aktuális könyvtárban
Példa program Megfigyelendı: programszerkezet csomag megadása hivatkozás más osztályokra futtatható program file-ok neve, elhelyezkedése fordítás, futtatás
A Java nyelv http://java.sun.com/docs/books/jls/third_edition/html/j3toc.html Lexikális értelmezés - UniCode karakterkészlet - Case-Sensitive - tokenes feldolgozás Elemek: - megjegyzések, - deklarációk, - kulcsszavak, - operátorok, - azonosítók, - típuskonverziók, - típusok, - utasítások - literálok,
A Java nyelv - megjegyzések Egysoros megjegyzés //sor végéig megjegyzés Több soros megjegyzés /* a következı csillag és perjelig megjegyzés */ Dokumentációs megjegyzés /** az elején két csillag van, a vége ugyanaz */ - javadoc program html doksit csinál a forráskódban levı dokumentációs megjegyzésekbıl - használhatunk a belsejében a javadoc-nak szóló kulcsszavakat
A Java nyelv - Kulcsszavak abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while További foglalt szavak: true, false, null
A Java nyelv - Azonosítók Szabályok - Alkothatják: olyan karakterek, amelyre Character.isJavaIdentifierPart(char) true-t ad. (pl. bető (Unicode), számjegy, _, $ ) - Elsı karaktere: olyan karakter, amelyre a Character.isJavaIdentifierFirst(char) true-t ad (pl. bető, _, $ ) - Nem lehet kulcsszó, foglalt szó - Nincs hossz korlát - pl. éva, a1_b, (akár görög, cirill vagy kínai betők is lehetnek benne) - egyes betők külalakra hasonlítanak, de eltérıek
A Java nyelv - Azonosítók Szokások - változók: alma, almasulya - konstansok: MAX_ERTEK - metódusok: szoroz(), öttelszoroz() - csomagok: sajat.masik, java.util - elemi típusok: int, boolean - osztály, interfész: Valami, ArrayList
A Java nyelv Típusok Elemi típusok, primitív típusok, érték típusok -boolean (logikai) -char (unicode karakter) -byte (1 byte egész) -short (2 byte egész) -int (4 byte egész) -long (8 byte egész) -float (4 byte lebegıpontos) -double (8 byte lebegıpontos) Nincs elıjeles és elıjeltelen, mind elıjeles.
A Java nyelv - Típusok Referencia típusok - osztály - interfész Speciális szintaktikával rendelkezı osztály típusok - tömb - felsorolás (enum) Fontos ismerni a különbséget az elemi és a referencia típusok között!!
A Java nyelv - Literálok boolean literálok: true, false char literálok: B, \n, \u00ff Egész literálok: int literál: 5, -48, 012 (okt), 0x5F (hexa) long literál: 12345678901, 4L, 4l, 0x2DL byte, short literál: csak konverzióval (short)5 Lebegıpontos literál: double literál: 5.4, 0.12e3, 0.1E-2D float literál: 4.21e2F, 0.2E5f Szöveg (String) literál: szöveg Referencia literál: null
A Java nyelv - Deklarációk Változót deklarálni: - adattag - metódus (konstruktor) paraméter - catch paramétere - lokális Szintaktika közös rész: típus azonosító Pl. int a, sajat.masik.valami b Az eltéréseket a megfelelı témánál tárgyaljuk
A Java nyelv - Operátorok Precedencia, asszociativitás Táblázat: Op. A. Jelentés Operandusok [] index tömb, egész. minısítés referencia, tag () fgvhívás fgv, param ++ post inc. numerikus -- post dec. numerikus ++ pre inc. numerikus -- pre dec. numerikus + - elıjelek numerikus ~ bit. tagadás egész! log. tagadás boolean () típus konverzió típus, kifejezés new példányosítás típus
A Java nyelv - Operátorok Táblázat folytatás Op A. Jelentés Operandus * / % szorz, oszt, mod numerikus + - összead, kivon numerikus + string összefüzés String << bitléptetés egész >> bitléptetés egész >>> bitléptetés egész < <= reláció numerikus > >= reláció numerikus instanceof típus vizsg. referencia, típus == egyenlıség tetszıleges!= nem egy. tetszıleges
A Java nyelv - Operátorok Táblázat folytatás Op A. Jelentés Operandusok & bit and, v. log and egész v. boolean ^ bit xor, v. log xor egész v. boolean bit or, v. log or egész v. boolean && log and (röv) boolean log or (röv) boolean?: feltételes op boolean, tetsz. =, +=, értékadás változó, kifejezés Érdekességek: - referencián végezhetı:., (típus), +(csak String), instanceof, ==,!=, = MÁS NEM!
A Java nyelv Típuskonverziók 1. Két fajta: - implicit (automatikus) - explicit (kikényszerített) Alkalmazás fajta - elemi típusok konverziói - referencia típusok konverziói - boxing, unboxing konverziók - generikus típusokkal kapcsolatos konverziók - String konverziók - Value Set konverziók
A Java nyelv Típuskonverziók 1. Elemi típusok konverziói - Automatikus konverzió: a bıvebb típus irányába: byte, short, int, long, float, double érdekes a long float: jegyvesztés lehetséges boolean numerikus, numerikus boolean nincs char numerikus, numerikus char nincs - Automatikus konverzió mőveletvégzéskor: A mőveletekben a byte és shortint-ként szerepel, a float double-ként. A két operandusú mőveletekben a szőkebb típus a bıvebb típusként vesz részt, eredmény a bıvebb típus: 5/2, 5/2.0
A Java nyelv Típuskonverziók 1. Elemi típusok kikényszerített konverziói típus konverziós operátorral: 5/(double)2, int a = (int)5.8, short b = (short) A, int c = (int)true Value Set konverziók float és double típusok esetén, a mőveletek részeredményei bıvebb értékkészleten ábrázolódhatnak, a végeredmény mindig a float vagy double Bıvebben nem foglalkozunk vele Többi konverzióval késıbb foglalkozunk
A Java nyelv - Utasítások Utasítások - blokk {} - lokális osztály deklaráció - lokális változó deklaráció - üres utasítás - kifejezés utasítás - elágazások (if, switch) - assert utasítás - ciklusok (while, do, for) - ugró, vezérlésátadó (break, continue, return) - kivétellel kapcsolatos (throw, try-catch) - synchrozined utasítás
A Java nyelv - Utasítások Blokk { utasítás1 utasítás2 stb. } - a utasításait sorban hajtja végre - a blokkban levı utasítások bármilyenek lehetnek, akár blokk utasítások is - lehet olyan blokk amiben nincs utasítás Lokális osztály deklaráció - Késıbb
A Java nyelv - Utasítások Lokális változó deklaráció - Szintaktika (nem tömb esetén): típus elem; vagy típus elem, elem, stb.; ahol elem: azonosító vagy azonosító=inicializálókif Pl. int a; String b= alma,c; int d, e=1; - Értéke, ha nem inicializáljuk definiálatlan. A fordító hibát jelez, ha hivatkozunk rá értékadás elıtt. - Hatásköre a blokk, amelyben deklarálták, azt elhagyva el is pusztul (referencia változók esetén?) - Elfedi a külsı blokk egyezı nevő azonosítóit
A Java nyelv - Utasítások Üres utasítás ; Kifejezés utasítás kifejezés; - Hatástalan kifejezések NEM! Lehet: értékadás, increment, decrement, fgvhívás, objektum létrehozás pl. a+=2; jó a+2; nem jó
A Java nyelv - Utasítások Feltételes utasítások: IF if (logikai kif) utasítás1 else utasítás2 - A kifejezés csak logikai lehet - Csak egy utasítás állhat mindkét ágban, de ez lehet blokk is. - Szokás: if (logikai kif) { utasítások } else { utasítások }
A Java nyelv - Utasítások Feltételes utasítás: SWITCH switch (kifejezés) { case konstkif1: utasítások case konstkif2: utasítások default: utasítások } - A kifejezés típusa csak: byte, short, int, char, ezek burkoló osztályai, enum - A megfelelı címke a belépési pont. - Kiugrás a break utasítással. - A default nem kötelezı, akkor ez a belépési pont, ha egyik konstkif értékével sem egyezik a kifejezés.
A Java nyelv - Utasítások assert utasítás - szerepe: hibajelzés a programozó felé - kikapcsolható, ilyenkor az assert utasításoknak nincs hatása - szintaktika: assert logikaikif; vagy assert logikaikif : kif; - mőködése: kiértékeli a logikai kifejezést és, ha hamis AssertionError keletkezik, ha van megadva kif, akkor az a AssertionError üzenete (detail message) - bekapcsolás: -ea kapcsolóval
A Java nyelv - Utasítások While ciklus while (logikaikif) utasitas -logikaikif csak boolean lehet -utasitas csak egy utasítás lehet (lehet blokk) - elöltesztelı, igaz esetén ismétel Do ciklus do utasitas while (logikaikif); -logikaikif csak boolean lehet -utasitas csak egy utasítás lehet (lehet blokk) - hátultesztelı, igaz esetén ismétel
A Java nyelv - Utasítások For ciklus 1. alak for (kif1; kif2; kif3) utasitas - Szokás szerint ez egyenértékő: { kif1; while (kif2) { utasitas kif3; } } -kif1 és kif2 kifejezés utasítások, elmaradhatnak -kif3 logikai kifejezés, ha elmarad, akkor true -utasitas egy utasítás (lehet blokk)
A Java nyelv - Utasítások For ciklus 2. alak for (tipus azonosító : kifejezés) utasitas -kifejezés tömb vagy iterálható objektum kell legyen -utasitas egy utasítás (lehet blokk) - mőködés: az azonosító rendre felveszi a kifejezés elemeit és minden érték mellett végrehajtódik az utasítás - pl. feltételezve, hogy van egy elemekkel feltöltött egész tömb, neve a int sum = 0; for (int i : a) sum += i; A sum értéke a tömb elemeinek összege.
A Java nyelv - Utasítások Ugró utasítás, feltétel nélküli vezérlésátadás -break; utasítás: Kilép a blokkból amiben szerepel és a blokkot követı utasításra adódik a vezérlés. Csak switch, while, do, for utasításában levı blokkban használható. Switch esetén szerepe, hogy ne csorogjon át a végrehajtás a következı case-re. Ciklusok esetén, hogy a ciklusból kilépjünk. -break címke; utasítás Egymásba ágyazott blokkok esetén a belsı blokkban levı break a címkével megjelölt külsı blokkból lép ki, tehát az azt követı utasításon folytatódik a végrehajtás. (ez csak egy egyszerősítése a valóságnak)
A Java nyelv - Utasítások Ugró utasítás, feltétel nélküli vezérlésátadás -continue; utasítás Csak ciklusok blokkjában használható. A blokk végére ugrik, azaz a ciklusmag hátralevı részét átugorja. -continue címke; utasítás A break-hez hasonlóan egymásba ágyazott ciklusoknál van szerepe. -return; utasítás Kilép a függvénybıl és a függvény hívás utáni utasításon folytatódik a végrehajtás. Csak void függvényekben használható. -return kif; utasítás Kilép a függvénybıl és a függvény hívás helyére behelyettesítıdik a kif értéke. Csak nem void függvényekben használható.
A Java nyelv - Utasítások Kivétellel kapcsolatos utasítások (throw, try) Lásd késıbb a kivételkezelésnél. Szinkronizációs utasítás synchronized (kif) blokk - A kif referencia típus kell legyen. - Kölcsönös kizárásra használható. A blokkba belépéskor, ha a zár (lásd. operációs rendszerek) szabadot jelez, akkor belép és tilosra állítja a zárat, elhagyásakor szabadra, ha tilos a zár, akkor nem lép be (vár). Több szálból is használható kódrészleteknél használható. - A kif azonosítja a létrehozott zárat.