Csomagok
A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok Beágyazott osztályok
Alrendszerek kialakítása
Alrendszerek kialakítása
Csomag A típusainkat csomagokba soroljuk Összetartozás kifejezése A csomagok hierarchiába szervezhetők Minősített hivatkozás pontokkal java.util Egy típus teljes neve tartalmazza az őt befoglaló csomag nevét is: java.util.Vector
Összetartozás A láthatósági módosítószavak: public, protected, private Ha nem írunk semmit, akkor „félnyilvános”, azaz csomagszintű Az azonos csomagban levő osztályok hozzáférnek egymás félnyilvános tagjaihoz A protected ennek a kiterjesztése
Csomagok hierarchiája? Igazándiból nem is a csomagok vannak hierarchiában... hanem a csomagnevek! A java csomagnak semmi köze a java.util csomaghoz - csak a nevük „hasonló” Nem tökéletes a támogatás Java-ban a programrendszerek hierarchikus tagolására
Alrendszerek kialakítása
Csomagok megadása A típusdefiníció elé egyszerűen beírjuk, hogy melyik csomagba tartozik A package kulcsszó package raktár.adatok; public class Csavar extends Anyag { ... }
A csomagok összeállítása A csomagok nyitottak Bármikor hozzávehetek újabb osztályokat, interfészeket Egyszerűen elé írok egy package utasítást Egy típus pontosan egy csomagba tartozik Csomagok metszete üres Névtelen csomag: ha nincs package utasítás
Feladat A Pont osztály legyen a geo.alapok csomagban Fordítsuk le külön a Pont osztályt
Hivatkozás más csomagokra Ha egy forrásfájlban használni akarunk egy típust egy másik csomagból: Írjuk ki a teljes nevét Importáljuk import utasítással
Hivatkozás teljes névvel Például névtelen csomagban, az A osztályt definiáló fájlon belül… class A { void foo(){ java.util.Vector bar = new java.util.Vector(); }
Importálás + rövid név Például névtelen csomagban, az A osztályt definiáló fájlon belül… import java.util.Vector; class A { void foo(){ Vector bar = new Vector(); }
Importálás + rövid név Minden típust importálhatunk egyszerre a java.util csomagból: import java.util.*; class A { void foo(){ Vector bar = new Vector(); }
Az import utasítás Arra használható, hogy ne kelljen kiírni bizonyos típusok teljes nevét (pl. java.util.Vector), csak a rövid nevét (Vector). Nem elég, hogy import java.*; Nem használható „félig teljes” név, pl. util.Vector
Beágyazott típusok is import java.util.Vector; import java.io.*; import java.util.Map.Entry; import java.text.Format.*;
Statikus tagok importálása A Java 5-től kezdve nem csak típusok, hanem statikus tagok is importálhatók Statikus metódusok Statikus attribútumok import static utasítás Importálható egy utasítással egy név, vagy egy típus összes statikus tagja
Példa import static java.util.Arrays.sort; class Sorting { public static void main( String[] args ){ sort(args); for( String s: args ){ System.out.println(s); }
Feladat A Kör osztály kerüljön a geo csomagba Használnia kell a geo.alapok.Pont osztályt Nem megy a fordítás, ugye?
Fordítási egység Az, amit oda lehet adni a fordítónak, hogy lefordítsa Java-ban egy fordítási egység tartalma: package utasítás (opcionális) import utasítások (opcionális) típusdefiníciók (egy vagy több) A sorrend kötött A csomagdeklaráció és az importáló utasítások minden típusdefinícióra vonatkoznak.
A fordítási egységek … több típusdefiníciót is tartalmazhatnak Mindegyikhez keletkezik egy .class fájl Csavar.java package raktár.adatok; public class Csavar extends Anyag {...} class CsavarMenet {...} A fordítás során két fájl keletkezik: Csavar.class CsavarMenet.class
A fordítási egységek elhelyezése Általában fájlokban, a fájlrendszerben Néhány fejlesztőeszköz ettől eltérően, valamilyen adatbázisban tárolja a forrásokat
Forrásfájlok Egy fájl pontosan egy fordítási egységet tartalmaz A fájl kiterjesztése .java Ha a fájlban van publikus típus, akkor a fájl neve meg kell, hogy egyezzen a típus nevével Egy fájlban / fordítási egységben csak egy publikus típus lehet...
A forrásfájlok elhelyezése Hozzunk létre a csomagszerkezettel egyező könyvtárszerkezetet Abba tegyük a forrásfájlokat A főprogram egyelőre kerüljön a gyökérbe, a névtelen csomagba Fordítsunk a gyökérből Később beszélünk még a további trükkökről...
Feladat A Kör és Pont osztályok mellé írj egy főprogramot, és fordítsd össze őket Figyeld meg, hogy a Pont objektumok félnyilvános adattagjait nem tudod a Kör osztálydefinícióból vagy a főprogramból használni!
A lefordított fájlok elhelyezése Követni kell a csomag-hierarchiát különben a virtuális gép (java) tanácstalan lesz Alkönyvtárak létrehozása Például a raktar.adatok.Csavar osztály .class fájlját a raktár/adatok alkönyvtárba kell tenni raktár/adatok/Csavar.class
A -d kapcsoló Nem kell kézzel másolgatni: bízzuk rá a javac fordítóra Megmondjuk, mi legyen a célkönyvtár Azon belül felépíti a szükséges könyvtárstruktúrát javac -d . Csavar.java javac -d ../classes Csavar.java
A források elhelyezése Javaslat: ugyanolyan struktúrában, mint a .class fájloknál, azaz követve a csomaghierarchiát. Pl.: src raktar adatok gui web classes
Forrásfájlok elhelyezése (2) Lehetnek egy könyvtárszerkezetben a .class fájlokkal Lehetnek két különböző, de azonos szerkezetű könyvtárstruktúrában a forrás és a .class fájlok Lehetnek egész máshogy is, pl. sok könyvtárban szétszórva
A -sourcepath kapcsoló Ha sok könyvtárba vannak szétszórva a forrásfájlok, akkor használhatjuk a -sourcepath kapcsolót Megadható, hogy mely könyvtárakban kell keresni forrásfájlok után javac -sourcepath ~/src/java:~/projects/raktar DB.java
Hivatkozások a fordítási egységen kívülre Ha egy fordítási egység hivatkozik egy másik fordítási egységben levő típusra, akkor a javac fordító: megpróbálja megtalálni a hozzá tartozó .class fájlt - ha egyáltalán le van már az a típus fordítva ha nincs lefordítva, akkor megkeresi a megfelelő .java fájlt, és rekurzívan azt is lefordítja
Rekurzív fordítás A neve alapján keresi meg a hivatkozott típust tartalmazó forrásfájlt a javac A fájlnévnek meg kell egyeznie a típusnévvel A -sourcepath kapcsoló szerepe...
Hol keresse a .class fájlokat? Alapértelmezésben a szabványos könyvtárakban és az aktuális munkakönyvtárban A -classpath kapcsoló segítségével más is megadható javac -classpath ~/classes:. DB.java A szabványos könyvtárakban, a ~/classes könyvtárban és az aktuális munkakönyvtárban.
A -classpath kapcsoló Megadható több könyvtárnév, amelyekben a .class fájlokat keresheti a fordító a könyvtárnevek elválasztásához UNIX alatt a : Windows alatt a ; használandó Nem csak könyvtárnevek, hanem .zip és .jar fájlok is megadhatók, azokban is keres A kapcsoló rövidebb alakja: -cp
Hogyan történik a keresés? javac -classpath ~/classes:. DB.java Tegyük fel, hogy hivatkozás történik a raktar.adatok.Csavar osztályra. A szabványos könyvtárakban nem találja. Ott java. és javax. kezdetű típusok vannak... Keresi a ~/classes/raktar/adatok/Csavar.class fájlt Ha az sincs, keresi a raktar/adatok/Csavar.class fájlt Ha az sincs, keresi a forrását, a raktar/adatok/Csavar.java fájlt, hogy lefordítsa a -sourcepath kapcsoló alapján ha nincs megadva, akkor az aktuális könyvtárban
Osztálykeresési útvonal hagyományos megadása A CLASSPATH környezeti változó Manapság nem illendő használni könnyen összekavarodnak a dolgok, ha több projekten is dolgozunk Helyette a -classpath kapcsoló
A javac fordító egyéb kapcsolói Szabványos kapcsolók, pl. -g nyomkövetési infók -O optimalizálás -target kód verziószám (1.1, 1.2, …) -nowarn ne legyenek figyelmeztetések -deprecation … erről még lesz szó… Nem szabványos kapcsolók Későbbi/korábbi fordítók nem biztos, hogy ismerik Pl. heap méretének beállítása