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:
Futtatá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 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 [] index . minısítés () fgvhívás ++ post inc. - post dec. ++ pre inc. - pre dec. + elıjelek ~ bit. tagadás ! log. tagadás () típus konverzió new példányosítás
Operandusok tömb, egész referencia, tag fgv, param numerikus numerikus numerikus numerikus numerikus egész boolean típus, kifejezés típus
A Java nyelv - Operátorok
Táblázat folytatás Op A. Jelentés */% szorz, oszt, mod + összead, kivon + string összefüzés << bitléptetés >> bitléptetés >>> bitléptetés < <= reláció > >= reláció instanceof típus vizsg. == egyenlıség != nem egy.
Operandus numerikus numerikus String egész egész egész numerikus numerikus referencia, típus tetszıleges 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 short int-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.