Jelenlegi hely

17.3. Csomag tagok használata

Csak a publikus csomag tagok érhetőek el a csomagon kívül. Ahhoz hogy használjunk egy publikus csomag tagot a csomagján kívülről, a következők valamelyikét kell tennünk (vagy akár többet):

  • A teljes (vagy más néven minősített) nevén keresztül kell hivatkoznunk rá
  • Importáljuk a csomag tagot
  • Importáljuk a tag teljes csomagját

Mindegyiket különböző szituációkban alkalmazhatjuk, amelyeket a következő részekben tisztázunk.

Név szerinti hivatkozás egy csomag tagra

Eddig a példákban a típusokra az egyszerű nevükön keresztül hivatkoztunk, mint például Rectangle. Akkor használhatjuk egy csomag tagjának az egyszerű nevét, ha az osztály ugyanabban a csomagban van, mint a tag, vagy ha a tag importálva van.

Ha megpróbálunk használni egy tagot egy másik csomagból, és a csomagot nem importáltuk, akkor a tag teljes nevét használnunk kell. A Rectangle osztály teljes neve:
graphics.Rectangle

A következőképpen használhatjuk a minősített nevet, hogy létrehozzuk a graphics.Rectangle osztály egy példányát:
graphics.Rectangle myRect = new graphics.Rectangle();

Ha minősített neveket használunk, valószínűleg bosszantó lesz, hogy újra és újra be kell gépelni a graphics.Rectangle-t. Ezen kívül rendezetlen és nehezen olvasható programot kapunk. Ilyen esetekben inkább importáljuk a tagot.

Egy csomag tag importálása

Ahhoz hogy importálhassuk a megadott tagot az aktuális fájlban, a fájl elején ki kell adni az import utasítást az osztály vagy interfész definiálása előtt, de a package utasítás után, ha van olyan. Úgy tudjuk importálni a Circle osztályt a graphics csomagból, hogy:
import graphics.Circle;

Most már tudunk hivatkozni a Circle osztályra az egyszerű nevével:
Circle myCircle = new Circle();

Ez a szemlélet akkor működik jól, ha csak néhány tagot használunk a graphics csomagból. De ha sok típusát használjuk egy csomagnak, akkor inkább importáljuk az egész csomagot.

Egy teljes csomag importálása

Ahhoz hogy egy csomagnak az összes típusát importáljuk, az import utasítást a csillag (*) helyettesítő karakterrel kell használnunk:
import graphics.*;

Most már hivatkozhatunk bármelyik osztályra vagy interfészre a graphics csomagból az egyszerű rövid nevével:

Circle myCircle = new Circle();
Rectangle myRectangle = new Rectangle();

Az import utasításban a csillag karakterrel az összes osztályát megadjuk a csomagnak. Nem használhatunk olyan megfeleltetést, amely egy csomagban egy osztály részhalmazára utal. Például helytelen megfeleltetés az, hogy a graphics csomagból az ’A’ betűvel kezdődő összes osztály importáljuk:
import graphics.A*;

Ez az utasítás fordítási hibát generál. Az import utasítással, egy csomagnak egyetlen tagját vagy egész csomagot importálhatunk.

Ugyanígy nem megengedett, hogy egyszerre több csomagot importáljunk, pl.:
import graphics.*.*;

Megjegyzés: Ha kevesebb tagot akarunk importálni, akkor megengedett, hogy csak egy osztályt, és annak a belső osztályait importáljuk. Például, ha a graphics.Rectangle osztálynak a belső osztályait akarjuk használni, mint Rectangle.DoubleWide és Rectangle.Square, a következőképpen importálhatjuk:
import graphics.Rectangle.*;

Könnyítésül a Java fordító automatikusan importál három teljes csomagot:

  • A névtelen csomagot (ha nem hozunk létre csomagot, vagyis nem használjuk a package utasítást)
  • Az alapértelmezés szerinti aktuális csomagot (ha létrehozunk csomagot)
  • A java.lang csomagot

Megjegyzés: A csomagok nem hierarchikusak. Ha például importáljuk a java.util.*-ot, nem hivatkozhatunk a Pattern osztályra. Minden esetben úgy kell hivatkoznunk, hogy java.util.regex.Pattern, vagy ha importáljuk a java.util.regex.*-ot, akkor csak egyszerűen Pattern.

Névütközés megszüntetése

Ha egy tag ugyanazon a néven megtalálható egy másik csomagban, és mindkét csomag importálva van, akkor a tagra teljes nevével kell hivatkoznunk. Például a Rectangle osztály definiálva van a graphics csomagban, és a java.awt csomagban is. Ha a graphics és java.awt is importálva van, akkor a következő nem egyértelmű:
Rectangle rect;

Az ilyen esetekben a minősített nevet kell használnunk, hogy pontosan meg tudjuk adni, melyik Rectangle osztályt akarjuk használni:
graphics.Rectangle rect;