Programování

Java 101: Balíčky organizují třídy a rozhraní

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:

  1. Ztrácí to čas
  2. 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 a Tětiva, organizované v Jáva balíček jazyk dílčí balíček
  • java.lang.ref: Kolekce jazykových tříd souvisejících s referencemi, jako je SoftReference a Referenční fronta, organizované v ref dílčí balíček balíčku Jáva balíček jazyk dílčí balíček
  • javax.swing: Kolekce tříd komponent souvisejících s Swingem, jako je JButtona rozhraní, například ButtonModel, organizované v javax balíček houpač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.exenebo 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:

  1. 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, zadejte C: příkaz následovaný CD \ příkaz. (Pokud používáte jinou jednotku, vyměňte ji C: s vámi vybraným pohonem. Po zadání příkazu také nezapomeňte stisknout klávesu Enter.)
  2. Vytvořit testpkg adresář zadáním md testpkg. Poznámka: Při provádění kroků v tomto článku nezadávejte za příkazy tečky.
  3. Udělat testpkg aktuální adresář zadáním cd testpkg.
  4. Pomocí editoru zadejte zdrojový kód záznamu 1 a uložte jej do A.java soubor v testpkg.
  5. Kompilovat A.java zadáním javac A.java. Měli byste vidět soubory tříd $ StartStop.class, Třída, a B. třída se objeví v testpkg 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 Ajediné 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 testpkgtřída A na dvou místech a Avnitřní rozhraní Začátek Konec na jednom místě. Při kompilaci a spuštění proveďte následující kroky Usetestpkg1:

  1. Otevřete příkazové okno Windows a ujistěte se, že jste v C: kořenový adresář jednotky.
  2. Zajistěte classpath proměnná prostředí neexistuje provedením nastavit classpath =. (Diskutuji classpath dále v tomto článku.)
  3. Pomocí editoru zadejte zdrojový kód záznamu 2 a uložte jej do a Usetestpkg1.java soubor v kořenovém adresáři.
  4. Kompilovat Usetestpkg1.java zadáním javac Usetestpkg1.java. Měli byste vidět classfile Usetestpkg1.class se zobrazí v kořenovém adresáři.
  5. Typ java Usetestpkg1 spustit tento program.

Obrázek 2 ilustruje kroky 3 až 5 a ukazuje výstup programu.

Podle Usetestpkg1výstup, hlavní() vlákno metody úspěšně přistupuje testpkg.Aje 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:

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