Prečo znovu objavovať koleso? Toto klišé platí pre vývoj softvéru, kde niektorí vývojári často prepisujú rovnaký kód pre rôzne programy. Dve nevýhody tohto prístupu sú:
- Je to strata času
- Predstavuje potenciál pre chyby v odladenom kóde
Ako alternatívu k prepisovaniu rovnakého kódu poskytuje mnoho vývojových prostredí softvéru knižničný nástroj, ktorý organizuje často používaný kód. Akonáhle vývojári dokončia ladenie znovu použiteľného kódu, použijú tento nástroj na uloženie tohto kódu do a knižnica—Jeden alebo viac súborov, ktoré obsahujú často používaný kód na použitie v rôznych programoch. Počas vytvárania programu pristupuje kompilátor alebo knižničný nástroj do knižnice, aby k programu pripojil kód odkazovaný na knižnicu programu.
Knižnice majú pre Javu zásadný význam. Umožňujú čiastočne nakladaču tried JVM vyhľadať súbory tried. (Classloadery preskúmam v budúcom článku.) Z tohto dôvodu sú knižnice Java bežne známe ako triedne knižnice. Java však označuje knižnice tried ako balíkov.
Tento článok skúma balíčky; Ukážem vám, ako vytvárať balíčky tried a rozhraní, ako importovať (tj uviesť do programu) zabalené triedy a rozhrania, ako presúvať balíčky na pevný disk a ako používať súbory jar na zapuzdrenie balíkov.
Poznámka |
---|
Experiment s jedným balíkom tohto článku je špecifický pre Microsoft Windows. Mali by ste byť schopní ľahko extrapolovať tento experiment na platformy iné ako Windows. |
Čo sú to balíčky?
A balíček je zbierka tried a rozhraní. Každý balík má svoj vlastný názov a svoje triedy a rozhrania najvyššej úrovne (tj. Vnorené) organizuje do samostatných menný priestor, alebo zbierka mien. Aj keď sa triedy a rozhrania s rovnakým názvom nemôžu objaviť v tom istom balíku, môžu sa zobraziť v rôznych balíkoch, pretože každému balíku je priradený samostatný priestor mien.
Z hľadiska implementácie sa osvedčenie rovnocennosti balíka s adresárom osvedčí, rovnako ako vyrovnanie tried a rozhraní balíka s triednymi súbormi adresára. Nezabudnite na ďalšie prístupy k implementácii balíkov, napríklad na použitie databáz, aby ste si nezvykli vždy porovnávať balíky s adresármi. Ale pretože veľa JVM používa na implementáciu balíkov adresáre, tento článok zrovnáva balíky s adresármi. Sada Java 2 SDK organizuje svoju rozsiahlu zbierku tried a rozhraní do stromovej hierarchie balíkov v balíkoch, ktorá je ekvivalentná adresárom v adresároch. Táto hierarchia umožňuje spoločnosti Sun Microsystems ľahko distribuovať (a vy s nimi môžete ľahko pracovať) tieto triedy a rozhrania. Medzi príklady balíkov Java patria:
java.lang:
Zbierka jazykových kurzov, ako naprObjekt
aString
organizovaná vjava
balíčeklang
podbaleniejava.lang.ref:
Zbierka jazykových kurzov súvisiacich s referenciami, ako naprSoftReference
aReferenceQueue
organizovaná vref
čiastkový balíkjava
balíčeklang
podbaleniejavax.swing:
Zbierka tried komponentov súvisiacich s Swingom, ako naprJButton
a rozhrania, ako naprButtonModel
organizovaná vjavax
balíčekhojdačka
podbalenie
Znaky bodky oddeľujú názvy balíkov. Napríklad v javax.swing
, bodka oddeľuje názov balíka javax
z názvu podbalenia hojdačka
. Znak obdobia je ekvivalent na platforme nezávislý od lomítkových znakov (/
), znaky spätného lomítka (\
) alebo iné znaky na oddelenie názvov adresárov v implementácii balíka založeného na adresároch, vetvy databázy v implementácii hierarchického databázového balíka atď.
Tip |
---|
Rovnako ako nemôžete uložiť súbor a adresár s rovnakými názvami do toho istého adresára, nemôžete uložiť triedu alebo rozhranie a balík s rovnakými názvami do toho istého balíka. Napríklad daný balík s názvom účtov , nemôžete uložiť balík aj triedu s názvom splatné v účtov . Aby ste sa vyhli konfliktom názvov, veľké prvé písmeno názvov tried a rozhraní a malé prvé písmeno názvov balíkov. Pomocou predchádzajúceho príkladu uložte triedu Splatné v balíku účtov ako účty. Splatné a balíček splatné v balíku účtov ako účty.splatné . Získajte viac informácií o tomto a ďalších konvenciách pomenovania od spoločnosti Sun Konvencie kódov pre programovací jazyk Java. |
Vytvorte balík tried a rozhraní
Triedy a rozhrania každého zdrojového súboru sú usporiadané do balíka. V balíček
absencia smernice, tieto triedy a rozhrania patria do nepomenovaného balíka (adresár, ktorý JVM považuje za aktuálny adresár - adresár, v ktorom program Java začína svoje vykonávanie prostredníctvom systému Windows. java.exe
alebo program ekvivalentný k OS - a neobsahuje žiadne podbalíky). Ale ak balíček
direktíva sa objaví v zdrojovom súbore, táto smernica pomenuje balík pre tieto triedy a rozhrania. Pomocou nasledujúcej syntaxe zadajte a balíček
smernica v zdrojovom kóde:
„balíček“ názov balíka [ '.' subpackageName ... ] ';'
A balíček
smernica sa začína balíček
kľúčové slovo. Identifikátor, ktorý pomenuje balík, názov balíka
, okamžite nasleduje. Ak sa majú triedy a rozhrania objaviť v podbalení (na určitej úrovni) v rámci názov balíka
, jeden alebo viac oddelených bodkami subpackageName
identifikátory sa objavia za názov balíka
. Nasledujúci fragment kódu predstavuje dvojicu balíček
smernice:
balíková hra; balíček game.devices;
Prvý balíček
smernica identifikuje balík s názvom hra
. Všetky triedy a rozhrania, ktoré sa nachádzajú v zdrojovom súbore tejto smernice, sa organizujú v priečinku hra
balíček. Druhy balíček
direktíva identifikuje podbalík s názvom zariadenia
, ktorý sa nachádza v balíku s názvom hra
. Všetky triedy a rozhrania, ktoré sa nachádzajú v zdrojovom súbore tejto smernice, sa organizujú v priečinku hra
balíček zariadenia
podbalenie. Ak implementácia JVM mapuje názvy balíkov na názvy adresárov, hra.devices
mapy do a hra \ zariadenia
hierarchia adresárov pod Windows a hra / zariadenia
hierarchia adresárov pod Linuxom alebo Solarisom.
Pozor |
---|
Len jeden balíček smernica sa môže objaviť v zdrojovom súbore. Ďalej balíček smernica musí byť prvým kódom (okrem komentárov) v danom súbore. Porušenie ktoréhokoľvek z týchto pravidiel spôsobí, že kompilátor Javy nahlási chybu. |
Aby som vám uľahčil prácu s balíčkami, pripravil som príklad, ktorý zahŕňa všetky témy v tomto článku. V tejto časti sa dozviete, ako vytvoriť balíček príkladu. V ďalších častiach sa dozviete, ako importovať triedu a rozhranie z tohto balíka, ako presunúť tento balík na iné miesto na pevnom disku a stále k nemu pristupovať z programu a ako uložiť balík do súboru jar. . Zoznam 1 predstavuje zdrojový kód balíka:
Výpis 1. A.java
// balík A.java testpkg; verejná trieda A {int x = 1; public int y = 2; chránená int z = 3; int returnx () {return x; } public int returny () {return y; } protected int returnz () {return z; } verejné rozhranie StartStop {void start (); void stop (); }} trieda B {public static void ahoj () {System.out.println ("ahoj"); }}
Výpis 1 predstavuje zdrojový kód vášho prvého pomenovaného balíka. The balíček testpkg;
smernica pomenuje tento balík testpkg
. V rámci testpkg
sú triedy A
a B
. V rámci A
sú tri deklarácie polí, tri deklarácie metód a deklarácia vnútorného rozhrania. V rámci B
je vyhlásenie jednej metódy. Celý zdrojový kód je uložený v priečinku A.java
pretože A
je verejná trieda. Naša úloha: Zmeňte tento zdrojový kód na balík, ktorý sa skladá z dvoch tried a vnútorného rozhrania (alebo adresára, ktorý obsahuje tri súbory súborov). Túto úlohu splnia nasledujúce kroky špecifické pre Windows:
- Otvorte príkazové okno systému Windows a uistite sa, že sa nachádzate v priečinku
c:
koreňový adresár jednotky (hlavný adresár - predstavuje počiatočné spätné lomítko (\
) znak). Ak to chcete urobiť, zadajte znakc:
príkaz nasledovaný príkazomCD \
príkaz. (Ak používate inú jednotku, vymeňte juc:
s vami vybranou jednotkou. Po zadaní príkazu tiež nezabudnite stlačiť kláves Enter.) - Vytvor
testpkg
adresár zadanímmd testpkg
. Poznámka: Pri vykonávaní krokov v tomto článku nezadávajte za príkazmi bodky. - Urobiť
testpkg
aktuálny adresár zadanímcd testpkg
. - Pomocou editora zadajte zdrojový kód záznamu 1 a uložte ho do súboru
A.java
uložiť vtestpkg
. - Zostaviť
A.java
zadanímjavac A.java
. Mali by ste vidieť súbory triedyA $ StartStop.class
,Trieda
aB.trieda
sa objavujú vtestpkg
adresár.
Obrázok 1 zobrazuje kroky 3 až 5.
Blahoželáme! Práve ste vytvorili svoj prvý balík. Predstavte si tento balík, ktorý obsahuje dve triedy (A
a B
) a A
jediné vnútorné rozhranie (Štart stop
). Tento balík si môžete tiež predstaviť ako adresár obsahujúci tri triedy: A $ StartStop.class
, Trieda
a B.trieda
.
Poznámka |
---|
Aby sa minimalizovali konflikty názvov balíkov (najmä medzi komerčnými balíčkami), spoločnosť Sun zaviedla konvenciu, podľa ktorej internetový doménový názov spoločnosti obráti a predponuje názov balíka. Napríklad spoločnosť s x.com ako jeho názov internetovej domény a a.b ako názov balíka (a ), za ktorým nasleduje názov podbalenia (b ) predpony com.x do a.b , vyúsťujúce do com.x.a.b . Môj článok nedodržiava tento dohovor, pretože: testpkg balíček je vyhodením určeným iba na vyučovacie účely. |
Importujte triedy a rozhrania balíka
Keď už máte balíček, budete chcieť importovať triedy a / alebo rozhrania - vlastne názvy tried a / alebo rozhraní - z tohto balíka do vášho programu, aby mohol tieto triedy a / alebo rozhrania používať. Jedným zo spôsobov, ako túto úlohu splniť, je zadať úplný názov balíka (názov balíka a názvy všetkých podbalíkov) na každé miesto, kde sa objaví názov referenčného typu (názov triedy alebo rozhrania), ako to ukazuje výpis 2:
Zoznam 2. Usetestpkg1.java
// Trieda Usetestpkg1.java Usetestpkg1 implementuje testpkg.A.StartStop {public static void main (String [] args) {testpkg.A a = new testpkg.A (); System.out.println (rok); System.out.println (a.returny ()); Usetestpkg1 utp = nový Usetestpkg1 (); utp.start (); utp.stop (); } public void start () {System.out.println ("Start"); } public void stop () {System.out.println ("Stop"); }}
Predponou testpkg.
do A
, Usetestpkg1
prístupy testpkg
trieda A
na dvoch miestach a A
vnútorné rozhranie Štart stop
na jednom mieste. Pri kompilácii a spustení postupujte podľa nasledujúcich krokov Usetestpkg1
:
- Otvorte príkazové okno systému Windows a uistite sa, že sa nachádzate v priečinku
c:
koreňový adresár jednotky. - Zaistite
triedna cesta
premenná prostredia neexistuje vykonanímnastaviť triednu cestu =
. (Diskutujemtriedna cesta
ďalej v tomto článku.) - Pomocou editora zadajte zdrojový kód záznamu 2 a uložte ho do a
Usetestpkg1.java
súbor v koreňovom adresári. - Zostaviť
Usetestpkg1.java
zadanímjavac Usetestpkg1.java
. Mali by ste vidieť súbor triedyUsetestpkg1.class
sa zobrazia v koreňovom adresári. - Typ
java Usetestpkg1
spustiť tento program.
Obrázok 2 zobrazuje kroky 3 až 5 a zobrazuje výstup programu.
Podľa Usetestpkg1
výstup, hlavný()
vlákno metódy úspešne pristupuje testpkg.A
je r
pole a zavolá na returny ()
metóda. Výstup ďalej ukazuje úspešnú implementáciu testpkg.A.StartStop
vnútorné rozhranie.
Pre Usetestpkg1
, predpona testpkg.
do A
na troch miestach sa nezdá veľký problém. Kto však chce na sto miestach určiť úplnú predponu názvu balíka? Našťastie Java dodáva dovoz
smernica na import názvov verejných referenčných typov balíka, takže nemusíte zadávať úplné predpony názvu balíka. Express dovoz
smernica v zdrojovom kóde pomocou nasledujúcej syntaxe:
'import' názov balíka [ '.' subpackageName ... ] '.' ( referencetypeName | '*' ) ';'
An dovoz
smernica sa skladá z dovoz
kľúčové slovo bezprostredne nasledované identifikátorom, ktorý pomenuje balík, názov balíka
. Nepovinný zoznam subpackageName
Nasledujú identifikátory na identifikáciu príslušného podbalenia (ak je to potrebné). Smernica sa končí buď a referencetypeName
identifikátor, ktorý identifikuje konkrétnu triedu alebo rozhranie z balíka, alebo hviezdička (*
) znak. Ak referencetypeName
sa zdá, že smernica je a jednodruhové dovoz
smernice. Ak sa objaví znak hviezdičky, smernica je a typ na požiadanie dovoz
smernice.
Pozor |
---|
Rovnako ako v prípade balíček smernica, dovoz smernice musia byť uvedené pred akýmkoľvek iným kódom, s tromi výnimkami: a balíček smernica, iné dovoz smernice alebo komentáre. |
Jeden typ dovoz
smernica importuje názov jedného verejného referenčného typu z balíka, ako ukazuje nasledujúci fragment kódu:
import java.util.Date;
Predchádzajúci jeden typ dovoz
smernica importuje názov triedy Dátum
do zdrojového kódu. Vo výsledku zadáte Dátum
namiesto java.util.Date
na každom mieste sa tento názov triedy objaví v zdrojovom kóde. Napríklad pri vytváraní a Dátum
objekt, upresniť Dátum d = nový Dátum ();
namiesto java.util.Date d = nový java.util.Date ();
.
Cvičte opatrne s jedným typom dovoz
smernice. Ak kompilátor zistí jediný typ dovoz
direktíva, ktorá určuje názov referenčného typu tiež deklarovaný v zdrojovom súbore, kompilátor nahlási chybu, ako ukazuje nasledujúci fragment kódu:
import java.util.Date; dátum triedy {}
Kompilátor považuje fragment kódu za pokus o zavedenie dvoch referenčných typov s rovnakým Dátum
názov: