Proč znovu objevit kolo? Toto klišé platí pro vývoj softwaru, kde někteří vývojáři často přepisují stejný kód pro různé programy. Dvě nevýhody tohoto přístupu jsou:
- Ztrácí to čas
- Představuje potenciál pro chyby v laděném kódu
Jako alternativu k přepsání stejného kódu poskytuje mnoho vývojových prostředí softwaru knihovní nástroj, který organizuje často používaný kód. Jakmile vývojáři dokončí ladění znovu použitelného kódu, použijí tento nástroj k uložení tohoto kódu do a knihovna—Jeden nebo více souborů, které obsahují často používaný kód pro použití v různých programech. Během vytváření programu přistupuje kompilátor nebo nástroj knihovny do knihovny, aby k programu připojil kód odkazovaný na knihovnu programu.
Knihovny jsou pro Javu zásadní. Umožňují částečně třídní zavaděč JVM lokalizovat soubory tříd. (Prozkoumám třídní nakladače v budoucím článku.) Z tohoto důvodu jsou knihovny Java běžně známé jako třídní knihovny. Java však označuje třídní knihovny jako balíčky.
Tento článek zkoumá balíčky; Ukážu vám, jak vytvářet balíčky tříd a rozhraní, jak importovat (tj. Přivést do programu) zabalené třídy a rozhraní, jak přesouvat balíčky na pevný disk a jak používat soubory jar k zapouzdření balíčků.
Poznámka |
---|
Experiment s jedním balíčkem tohoto článku je specifický pro Microsoft Windows. Měli byste být schopni snadno extrapolovat tento experiment na platformy jiné než Windows. |
Co jsou balíčky?
A balík je sbírka tříd a rozhraní. Každý balíček má svůj vlastní název a organizuje své nejvyšší úrovně (tj. Nevnořené) třídy a rozhraní do samostatných jmenný prostor, nebo sbírka jmen. Ačkoli se třídy a rozhraní se stejným názvem nemohou objevit ve stejném balíčku, mohou se objevit v různých balíčcích, protože každému balíčku je přiřazen samostatný obor názvů.
Z hlediska implementace se osvědčuje vyrovnání balíčku s adresářem, stejně jako vyrovnání tříd a rozhraní balíčku s třídními soubory adresáře. Nezapomeňte na další přístupy k implementaci balíčků - například použití databází -, takže si nezvykněte vždy srovnávat balíčky s adresáři. Ale protože mnoho JVM používá k implementaci balíčků adresáře, tento článek srovnává balíčky s adresáři. Sada Java 2 SDK organizuje svou rozsáhlou sbírku tříd a rozhraní do stromové hierarchie balíků v balíčcích, což je ekvivalent k adresářům v adresářích. Tato hierarchie umožňuje Sun Microsystems tyto třídy a rozhraní snadno distribuovat (a vy s nimi můžete snadno pracovat). Mezi příklady balíčků Java patří:
java.lang:
Sbírka jazykových kurzů, jako napřObjekt
aTětiva
, organizované vJáva
balíčekjazyk
dílčí balíčekjava.lang.ref:
Kolekce jazykových tříd souvisejících s referencemi, jako jeSoftReference
aReferenční fronta
, organizované vref
dílčí balíček balíčkuJáva
balíčekjazyk
dílčí balíčekjavax.swing:
Kolekce tříd komponent souvisejících s Swingem, jako jeJButton
a rozhraní, napříkladButtonModel
, organizované vjavax
balíčekhoupačka
dílčí balíček
Znaky období oddělují názvy balíků. Například v javax.swing
, tečka odděluje název balíčku javax
z názvu dílčího balíčku houpačka
. Znak období je ekvivalent nezávislý na platformě znaků lomítka (/
), znaky zpětného lomítka (\
), nebo jiné znaky k oddělení názvů adresářů v implementaci balíčku založeného na adresářích, větví databáze v implementaci hierarchického databázového balíčku atd.
Spropitné |
---|
Stejně jako nemůžete uložit soubor a adresář se stejnými názvy do stejného adresáře, nemůžete uložit třídu nebo rozhraní a balíček se stejnými názvy do stejného balíčku. Například daný balíček s názvem účty , nemůžete uložit balíček i třídu s názvem splatné v účty . Abyste se vyhnuli konfliktním názvům, velká první písmena názvů tříd a rozhraní a malá první písmena názvů balíků. Pomocí předchozího příkladu uložte třídu Splatné v balení účty tak jako účty. Splatné a balíček splatné v balení účty tak jako účty. splatné . Další informace o této a dalších konvencích pojmenování od společnosti Sun's Konvence kódu pro programovací jazyk Java. |
Vytvořte balíček tříd a rozhraní
Třídy a rozhraní každého zdrojového souboru se organizují do balíčku. V balík
absence direktivy, tyto třídy a rozhraní patří do nepojmenovaného balíčku (adresář, který JVM považuje za aktuální adresář - adresář, kde program Java začíná vykonávat prostřednictvím systému Windows java.exe
nebo ekvivalent ekvivalentní OS - a neobsahuje žádné dílčí balíčky). Ale pokud balík
směrnice se objeví ve zdrojovém souboru, tato směrnice pojmenuje balíček pro tyto třídy a rozhraní. Pomocí následující syntaxe zadejte a balík
směrnice ve zdrojovém kódu:
'balík' název_balíku [ '.' subpackageName ... ] ';'
A balík
směrnice začíná balík
klíčové slovo. Identifikátor, který pojmenuje balíček, název_balíku
, okamžitě následuje. Pokud se třídy a rozhraní mají objevit v dílčím balíčku (na určité úrovni) uvnitř název_balíku
, jeden nebo více oddělených tečkami subpackageName
identifikátory se objeví za název_balíku
. Následující fragment kódu představuje dvojici balík
směrnice:
balíček hry; balíček game.devices;
První balík
směrnice identifikuje balíček s názvem hra
. Všechny třídy a rozhraní, které se objevují ve zdrojovém souboru této směrnice, se organizují v hra
balík. Druhý balík
směrnice identifikuje dílčí balíček s názvem zařízení
, který je umístěn v balíčku s názvem hra
. Všechny třídy a rozhraní, které se objevují ve zdrojovém souboru této směrnice, se organizují v hra
balíček zařízení
dílčí balíček. Pokud implementace JVM mapuje názvy balíků na názvy adresářů, herní zařízení
mapy do a hra \ zařízení
hierarchie adresářů pod Windows a hra / zařízení
hierarchie adresářů pod Linuxem nebo Solarisem.
Pozor |
---|
Jen jeden balík směrnice se může objevit ve zdrojovém souboru. Kromě toho balík směrnice musí být prvním kódem (kromě komentářů) v tomto souboru. Porušení některého pravidla způsobí, že kompilátor Javy ohlásí chybu. |
Abychom vám usnadnili práci s balíčky, připravil jsem příklad, který zahrnuje všechna témata v tomto článku. V této části se naučíte, jak vytvořit balíček příkladu. V pozdějších částech se naučíte, jak importovat třídu a rozhraní z tohoto balíčku, jak přesunout tento balíček do jiného umístění na pevném disku a přesto získat přístup k balíčku z programu a jak uložit balíček do souboru jar . Výpis 1 představuje zdrojový kód balíčku:
Výpis 1. A.java
// A.java balíček testpkg; veřejná třída A {int x = 1; public int y = 2; chráněný int z = 3; int returnx () {return x; } public int returny () {return y; } protected int returnz () {return z; } veřejné rozhraní StartStop {void start (); void stop (); }} třída B {public static void hello () {System.out.println ("hello"); }}
Výpis 1 představuje zdrojový kód vašeho prvního pojmenovaného balíčku. The balíček testpkg;
směrnice tento balíček pojmenuje testpkg
. V rámci testpkg
jsou třídy A
a B
. V rámci A
jsou tři deklarace polí, tři deklarace metod a deklarace vnitřního rozhraní. V rámci B
je jediná deklarace metody. Celý zdrojový kód je uložen v A.java
protože A
je veřejná třída. Náš úkol: Proměnit tento zdrojový kód na balíček, který se skládá ze dvou tříd a vnitřního rozhraní (nebo adresáře, který obsahuje tři soubory tříd). Této úlohy lze dosáhnout pomocí následujících kroků specifických pro Windows:
- Otevřete příkazové okno Windows a ujistěte se, že jste v
C:
kořenový adresář disku (hlavní adresář - reprezentovaný počátečním zpětným lomítkem (\
) znak). Chcete-li to provést, zadejteC:
příkaz následovanýCD \
příkaz. (Pokud používáte jinou jednotku, vyměňte jiC:
s vámi vybraným pohonem. Po zadání příkazu také nezapomeňte stisknout klávesu Enter.) - Vytvořit
testpkg
adresář zadánímmd testpkg
. Poznámka: Při provádění kroků v tomto článku nezadávejte za příkazy tečky. - Udělat
testpkg
aktuální adresář zadánímcd testpkg
. - Pomocí editoru zadejte zdrojový kód záznamu 1 a uložte jej do
A.java
soubor vtestpkg
. - Kompilovat
A.java
zadánímjavac A.java
. Měli byste vidět soubory tříd$ StartStop.class
,Třída
, aB. třída
se objeví vtestpkg
adresář.
Obrázek 1 ilustruje kroky 3 až 5.

Gratulujeme! Právě jste vytvořili svůj první balíček. Představte si, že tento balíček obsahuje dvě třídy (A
a B
) a A
jediné vnitřní rozhraní (Začátek Konec
). Tento balíček si můžete také představit jako adresář obsahující tři soubory tříd: $ StartStop.class
, Třída
, a B. třída
.
Poznámka |
---|
Aby se minimalizovaly konflikty názvů balíků (zejména mezi komerčními balíčky), společnost Sun zavedla konvenci, při které název internetové domény společnosti obrátí a předponu názvu balíčku. Například společnost s x.com jako jeho název internetové domény a a. b jako název balíčku (A ) následovaný názvem dílčího balíčku (b ) předpony com.x na a. b , což má za následek com.x.a.b . Můj článek tuto konvenci nedodržuje, protože testpkg balíček je vyhození určené pouze pro výukové účely. |
Importujte třídy a rozhraní balíčku
Jakmile máte balíček, budete chtít importovat třídy a / nebo rozhraní - vlastně názvy tříd a / nebo rozhraní - z tohoto balíčku do vašeho programu, aby mohl tyto třídy a / nebo rozhraní používat. Jedním ze způsobů, jak tento úkol splnit, je zadat plně kvalifikovaný název balíčku (název balíčku a názvy všech dílčích balíků) na každém místě, kde se objeví název referenčního typu (název třídy nebo rozhraní), jak ukazuje výpis 2:
Výpis 2. Usetestpkg1.java
// Třída Usetestpkg1.java Usetestpkg1 implementuje testpkg.A.StartStop {public static void main (String [] args) {testpkg.A a = nový testpkg.A (); System.out.println (ay); 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"); }}
Předponou testpkg.
na A
, Usetestpkg1
přístupy testpkg
třída A
na dvou místech a A
vnitřní rozhraní Začátek Konec
na jednom místě. Při kompilaci a spuštění proveďte následující kroky Usetestpkg1
:
- Otevřete příkazové okno Windows a ujistěte se, že jste v
C:
kořenový adresář jednotky. - Zajistěte
classpath
proměnná prostředí neexistuje provedenímnastavit classpath =
. (Diskutujiclasspath
dále v tomto článku.) - Pomocí editoru zadejte zdrojový kód záznamu 2 a uložte jej do a
Usetestpkg1.java
soubor v kořenovém adresáři. - Kompilovat
Usetestpkg1.java
zadánímjavac Usetestpkg1.java
. Měli byste vidět classfileUsetestpkg1.class
se zobrazí v kořenovém adresáři. - Typ
java Usetestpkg1
spustit tento program.
Obrázek 2 ilustruje kroky 3 až 5 a ukazuje výstup programu.

Podle Usetestpkg1
výstup, hlavní()
vlákno metody úspěšně přistupuje testpkg.A
je y
pole a volá returny ()
metoda. Výstup dále ukazuje úspěšnou implementaci testpkg.A.StartStop
vnitřní rozhraní.
Pro Usetestpkg1
, předpona testpkg.
na A
na třech místech se to nezdá velký problém. Ale kdo chce na sto místech zadat plně kvalifikovanou předponu názvu balíčku? Naštěstí Java dodává import
směrnice k importu veřejného veřejného názvu typu (typů) balíčku, takže nemusíte zadávat plně kvalifikované předpony názvu balíčku. Expresní import
směrnice ve zdrojovém kódu pomocí následující syntaxe:
'import' název_balíku [ '.' subpackageName ... ] '.' ( referencetypeName | '*' ) ';'
An import
směrnice se skládá z import
klíčové slovo bezprostředně následované identifikátorem, který pojmenuje balíček, název_balíku
. Volitelný seznam subpackageName
identifikátory následují k identifikaci příslušného dílčího balíčku (pokud je to nutné). Směrnice končí buď a referencetypeName
identifikátor, který identifikuje konkrétní třídu nebo rozhraní z balíčku, nebo hvězdičku (*
) znak. Li referencetypeName
Zdá se, že směrnice je jeden typ import
směrnice. Pokud se objeví znak hvězdičky, je direktiva a typ na vyžádání import
směrnice.
Pozor |
---|
Stejně jako u balík směrnice, import směrnice musí být uvedeny před jakýmkoli jiným kódem, se třemi výjimkami: a balík směrnice, jiné import směrnice nebo komentáře. |
Jeden typ import
směrnice importuje název jednoho veřejného typu odkazu z balíčku, jak ukazuje následující fragment kódu:
import java.util.Date;
Předchozí jediný typ import
direktiva importuje název třídy datum
do zdrojového kódu. Ve výsledku určíte datum
namísto java.util.Date
na každém místě se název třídy objeví ve zdrojovém kódu. Například při vytváření a datum
objekt, upřesněte Datum d = nové Datum ();
namísto java.util.Date d = nový java.util.Date ();
.
Buďte opatrní u jednoho typu import
směrnice. Pokud kompilátor detekuje jeden typ import
směrnice, která určuje název referenčního typu, který je také deklarován ve zdrojovém souboru, kompilátor hlásí chybu, jak ukazuje následující fragment kódu:
import java.util.Date; datum třídy {}
Kompilátor považuje fragment kódu za pokus o zavedení dvou referenčních typů se stejným datum
název: