Programovanie

Java 101: Balíky organizujú triedy a rozhrania

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ú:

  1. Je to strata času
  2. 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 napr Objekt a Stringorganizovaná v java balíček lang podbalenie
  • java.lang.ref: Zbierka jazykových kurzov súvisiacich s referenciami, ako napr SoftReference a ReferenceQueueorganizovaná v ref čiastkový balík java balíček lang podbalenie
  • javax.swing: Zbierka tried komponentov súvisiacich s Swingom, ako napr JButtona rozhrania, ako napr ButtonModelorganizovaná v javax balíček hojdač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.exealebo 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:

  1. 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 znak c: príkaz nasledovaný príkazom CD \ príkaz. (Ak používate inú jednotku, vymeňte ju c: s vami vybranou jednotkou. Po zadaní príkazu tiež nezabudnite stlačiť kláves Enter.)
  2. Vytvor testpkg adresár zadaním md testpkg. Poznámka: Pri vykonávaní krokov v tomto článku nezadávajte za príkazmi bodky.
  3. Urobiť testpkg aktuálny adresár zadaním cd testpkg.
  4. Pomocou editora zadajte zdrojový kód záznamu 1 a uložte ho do súboru A.java uložiť v testpkg.
  5. Zostaviť A.java zadaním javac A.java. Mali by ste vidieť súbory triedy A $ StartStop.class, Triedaa B.trieda sa objavujú v testpkg 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 Ajediné vnútorné rozhranie (Štart stop). Tento balík si môžete tiež predstaviť ako adresár obsahujúci tri triedy: A $ StartStop.class, Triedaa 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 testpkgtrieda A na dvoch miestach a Avnútorné rozhranie Štart stop na jednom mieste. Pri kompilácii a spustení postupujte podľa nasledujúcich krokov Usetestpkg1:

  1. Otvorte príkazové okno systému Windows a uistite sa, že sa nachádzate v priečinku c: koreňový adresár jednotky.
  2. Zaistite triedna cesta premenná prostredia neexistuje vykonaním nastaviť triednu cestu =. (Diskutujem triedna cesta ďalej v tomto článku.)
  3. Pomocou editora zadajte zdrojový kód záznamu 2 a uložte ho do a Usetestpkg1.java súbor v koreňovom adresári.
  4. Zostaviť Usetestpkg1.java zadaním javac Usetestpkg1.java. Mali by ste vidieť súbor triedy Usetestpkg1.class sa zobrazia v koreňovom adresári.
  5. Typ java Usetestpkg1 spustiť tento program.

Obrázok 2 zobrazuje kroky 3 až 5 a zobrazuje výstup programu.

Podľa Usetestpkg1výstup, hlavný() vlákno metódy úspešne pristupuje testpkg.Aje 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:

$config[zx-auto] not found$config[zx-overlay] not found