Programiranje

Java 101: Paketi organizirajo razrede in vmesnike

Zakaj na novo izumiti kolo? Ta kliše velja za razvoj programske opreme, kjer nekateri razvijalci pogosto prepišejo isto kodo za različne programe. Dve slabosti tega pristopa sta:

  1. Zapravlja čas
  2. Predstavlja potencialne napake v odpravljeni kodi

Številna okolja za razvoj programske opreme namesto ponovnega pisanja iste kode ponujajo knjižnična orodja, ki organizirajo pogosto uporabljeno kodo. Ko razvijalci zaključijo z odpravljanjem napak nekaterih kod za večkratno uporabo, to orodje shranijo v knjižnica— Ena ali več datotek, ki vsebujejo pogosto uporabljeno kodo za uporabo v različnih programih. Med ustvarjanjem programov prevajalnik ali orodje knjižnice dostopa do knjižnice, da na program poveže programsko kodo, na katero se sklicuje knjižnica programa.

Knjižnice so bistvenega pomena za Javo. Delno omogočajo nalagalniku razredov JVM, da poišče datoteke učil. (Naložnike razredov bom raziskal v prihodnjem članku.) Iz tega razloga so Javine knjižnice splošno znane kot razredne knjižnice. Vendar pa Java knjižnice razredov označuje kot paketov.

Ta članek raziskuje pakete; Pokazal vam bom, kako ustvariti pakete razredov in vmesnikov, kako uvoziti (torej vnesti v program) zapakirane razrede in vmesnike, kako premikati pakete na trdem disku in kako uporabljati datoteke jar za zapiranje paketov.

Opomba
Poskus z enim paketom v tem članku je specifičen za Microsoft Windows. Ta poskus bi lahko enostavno ekstrapolirali na platforme, ki niso Windows.

Kaj so paketi?

A paket je zbirka razredov in vmesnikov. Vsak paket ima svoje ime in razvrsti svoje razrede in vmesnike na najvišji ravni (torej nesnestirane) v ločeno imenski prostor, ali zbirka imen. Čeprav se istoimenski razredi in vmesniki ne morejo pojaviti v istem paketu, se lahko pojavijo v različnih paketih, ker vsakemu paketu dodeli ločen imenski prostor.

Z vidika izvedbe se izenačenje paketa z imenikom izkaže za koristno, enako kot enačenje razredov in vmesnikov paketa z učnimi datotekami imenika. Upoštevajte druge pristope - na primer uporabo baz podatkov - pri izvajanju paketov, zato ne bodite v navadi, da pakete vedno enačite z imeniki. Ker pa številni JVM uporabljajo imenike za izvajanje paketov, ta članek enači pakete z imeniki. Java 2 SDK svojo obsežno zbirko razredov in vmesnikov organizira v drevesno hierarhijo paketov znotraj paketov, kar je enakovredno imenikom v imenikih. Ta hierarhija podjetju Sun Microsystems omogoča enostavno distribucijo (in z vami lahko enostavno delo) teh razredov in vmesnikov. Primeri paketov Java vključujejo:

  • java.lang: Zbirka pouka, povezanega z jezikom, kot npr Predmet in Vrvica, organizirano v java paketov lang podpaketa
  • java.lang.ref: Zbirka jezikovnih tečajev, povezanih z referencami, kot so SoftReference in Referenčna vrsta, organizirano v ref podpaket java paketov lang podpaketa
  • javax.swing: Zbirka razredov komponent, povezanih z Swingom, kot je JButtonin vmesniki, kot so ButtonModel, organizirano v javax paketov gugalnica podpaketa

Znaki obdobja ločujejo imena paketov. Na primer, v javax.swing, znak točke ločuje ime paketa javax iz imena podpaketa gugalnica. Znak pike je od platforme neodvisen ekvivalent poševnice naprej (/), znaki poševnice nazaj (\) ali druge znake za ločevanje imen imenikov v izvedbi paketa, ki temelji na imeniku, vej baze podatkov v izvedbi paketa, ki temeljijo na hierarhični zbirki podatkov itd.

Nasvet
Tako kot datoteke in imenika z enakimi imeni ne morete shraniti v isti imenik, v isti paket ne morete shraniti razreda ali vmesnika in paketa z enakimi imeni. Na primer, podan paket z imenom računov, ne morete shraniti tako paketa kot razreda z imenom plačljivo v računov. Da bi se izognili nasprotujočim si imen, najprej črko imena razredov in vmesnikov vpišite z malimi črkami, prvo črko imen paketov pa z malimi črkami. V prejšnjem primeru shranite razred Plačljivo v paketu računov kot računi.Plačilno in paket plačljivo v paketu računov kot računi.plačljivo. Preberite več o tej in drugih konvencijah o poimenovanju pri Sun's Konvencije kode za programski jezik Java.

Ustvarite paket razredov in vmesnikov

Razredi in vmesniki vsake izvorne datoteke se organizirajo v paket. V paket odsotnosti direktive, ti razredi in vmesniki pripadajo neimenovanemu paketu (imenik, ki ga JVM obravnava kot trenutni imenik - imenik, kjer program Java začne izvajati prek sistema Windows java.exeali program, enakovreden OS - in ne vsebuje podpaketa). Če pa paket direktiva se pojavi v izvorni datoteki, ki imenuje paket za te razrede in vmesnike. Za določitev a uporabite naslednjo sintakso paket direktiva v izvorni kodi:

'paket' packageName [ '.' subpackageName ... ] ';' 

A paket direktiva se začne z paket ključna beseda. Identifikator, ki poimenuje paket, packageName, takoj sledi. Če naj se razredi in vmesniki pojavijo v podpaketu (na neki ravni) znotraj packageName, eno ali več ločenih z obdobjem subpackageName identifikatorji se pojavijo po packageName. Naslednji fragment kode predstavlja par paket direktive:

paketna igra; paketna igra.naprave; 

Prvi paket direktiva identificira paket z imenom igra. Vsi razredi in vmesniki, ki se pojavljajo v izvorni datoteki te direktive, se organizirajo v igra paket. Drugi paket direktiva identificira podpaket z imenom naprav, ki je v paketu z imenom igra. Vsi razredi in vmesniki, ki se pojavljajo v izvorni datoteki te direktive, se organizirajo v igra paketov naprav podpaketa. Če izvedba JVM preslika imena imen v imena imenikov, game.devices zemljevidi v a igre \ naprave hierarhija imenikov v sistemih Windows in a igra / naprave hierarhija imenikov pod Linuxom ali Solarisom.

Previdno
Samo en paket direktiva se lahko pojavi v izvorni datoteki. Poleg tega paket mora biti prva koda (razen komentarjev) v tej datoteki. Če kršite katero koli pravilo, prevajalnik Java prijavi napako.

Za lažje razumevanje paketov sem pripravil primer, ki zajema vse teme v tem članku. V tem razdelku se naučite, kako ustvariti paket primera. V kasnejših razdelkih boste izvedeli, kako uvoziti razred in vmesnik iz tega paketa, kako ga premakniti na drugo mesto na trdem disku in še vedno dostopati do paketa iz programa ter kako shraniti paket v datoteko jar . Seznam 1 predstavlja izvorno kodo paketa:

Seznam 1. A.java

// paket A.java testpkg; javni razred A {int x = 1; javni int y = 2; zaščiten int z = 3; int returnx () {vrnitev x; } public int returny () {return y; } zaščiten int returnz () {return z; } javni vmesnik StartStop {void start (); void stop (); }} razred B {javna statična void hello () {System.out.println ("hello"); }} 

Seznam 1 uvaja izvorno kodo v vaš prvi imenovani paket. The paket testpkg; direktiva poimenuje ta paket testpkg. Znotraj testpkg so razredi A in B. Znotraj A so tri deklaracije polj, tri deklaracije metode in deklaracija notranjega vmesnika. Znotraj B je deklaracija z eno samo metodo. Celotna izvorna koda se shrani v A.java Ker A je javni razred. Naša naloga: To izvorno kodo spremenite v paket, ki je sestavljen iz dveh razredov in notranjega vmesnika (ali imenika, ki vsebuje tri datoteke razredov). Naslednji koraki, specifični za Windows, so izpolnjeni:

  1. Odprite ukazno okno sistema Windows in se prepričajte, da ste v c: korenski imenik pogona (glavni imenik - predstavljen z začetno poševnico nazaj (\) znak). Če želite to narediti, vnesite c: ukaz, ki mu sledi cd \ ukaz. (Če uporabljate drug pogon, ga zamenjajte c: z izbranim pogonom. Po vnosu ukaza ne pozabite pritisniti tipke Enter.)
  2. Ustvariti testpkg imenik s tipkanjem md testpkg. Opomba: Ko sledite korakom tega članka, ne pišite pik za ukazi.
  3. Znamka testpkg trenutni imenik s tipkanjem cd testpkg.
  4. Z urejevalnikom vnesite izvorno kodo na seznamu 1 in jo shranite v A.java vloži v testpkg.
  5. Sestavi A.java s tipkanjem javac A.java. Morali bi videti datoteke učil $ StartStop.class, Razred, in B.razred se pojavijo v testpkg imenik.

Slika 1 prikazuje korake od 3 do 5.

Čestitamo! Pravkar ste ustvarili svoj prvi paket. Mislite, da ta paket vsebuje dva razreda (A in B) in Aen sam notranji vmesnik (StartStop). Ta paket si lahko predstavljate tudi kot imenik, ki vsebuje tri datoteke datotek: $ StartStop.class, Razred, in B.razred.

Opomba
Da bi zmanjšali navzkrižja z imeni paketov (zlasti med komercialnimi paketi), je Sun vzpostavil konvencijo, v kateri internetno ime domene podjetja spremeni in predponi ime paketa. Na primer podjetje z x.com kot njegovo internetno domensko ime in a.b kot ime paketa (a), ki mu sledi ime podpaketa (b) predpone com.x do a.b, kaže v com.x.a.b. Moj članek ne sledi tej konvenciji, ker testpkg paket je metalec, namenjen samo poučevanju.

Uvozite razrede in vmesnike paketa

Ko dobite paket, boste želeli iz tega paketa v svoj program uvoziti razrede in / ali vmesnike - pravzaprav imena razredov in / ali vmesnikov, da bo lahko uporabil te razrede in / ali vmesnike. Eden od načinov za izpolnitev te naloge je, da vnesete popolnoma kvalificirano ime paketa (ime paketa in vsa imena podpaketa) na vsakem mestu, kjer se pojavi ime referenčnega tipa (ime razreda ali vmesnika), kot prikazuje seznam 2:

Seznam 2. Usetestpkg1.java

// Razred Usetestpkg1.java Usetestpkg1 izvaja testpkg.A.StartStop {public static void main (String [] args) {testpkg.A a = new testpkg.A (); System.out.println (a.y); System.out.println (a.returny ()); Usetestpkg1 utp = novo Usetestpkg1 (); utp.start (); utp.stop (); } javni void start () {System.out.println ("Start"); } javni void stop () {System.out.println ("Stop"); }} 

S predpono testpkg. do A, Usetestpkg1 dostopov testpkgje razred A na dveh mestih in Anotranji vmesnik StartStop na enem mestu. Dokončajte naslednje korake za prevajanje in zagon Usetestpkg1:

  1. Odprite ukazno okno sistema Windows in se prepričajte, da ste v c: korenski imenik pogona.
  2. Zagotovite učilnica spremenljivka okolja z izvajanjem ne obstaja nastavite classpath =. (Razpravljam učilnica kasneje v tem članku.)
  3. Z urejevalnikom vnesite izvorno kodo na seznamu 2 in jo shranite v Usetestpkg1.java datoteko v korenskem imeniku.
  4. Sestavi Usetestpkg1.java s tipkanjem javac Usetestpkg1.java. Videli bi datoteko predavanj Usetestpkg1.class se prikažejo v korenskem imeniku.
  5. Tip java Usetestpkg1 za zagon tega programa.

Slika 2 prikazuje korake od 3 do 5 in prikazuje rezultate programa.

Po navedbah Usetestpkg1je rezultat, glavni () nit metode uspešno dostopa testpkg.Aje y polje in pokliče povratno () metoda. Poleg tega rezultati kažejo na uspešno izvajanje programa testpkg.A.StartStop notranji vmesnik.

Za Usetestpkg1, predpona testpkg. do A na treh mestih se ne zdi veliko. Kdo pa želi na sto mestih določiti predpono popolnega imena paketa? Na srečo Java dobavlja uvoz direktivo za uvoz imen javnega referenčnega tipa paketa, zato vam ni treba vnašati popolnoma kvalificiranih predpon imen paketa. Izrazite uvoz v izvorni kodi z naslednjo sintakso:

'uvoz' packageName [ '.' subpackageName ... ] '.' ( referencetypeName | '*' ) ';' 

An uvoz direktiva je sestavljena iz uvoz ključni besedi, ki ji takoj sledi identifikator, ki poimenuje paket, packageName. Neobvezen seznam subpackageName identifikatorji sledijo za identifikacijo ustreznega podpaketa (če je potrebno). Direktiva se zaključi z a referencetypeName identifikator, ki identificira določen razred ali vmesnik iz paketa ali zvezdico (*) znak. Če referencetypeName se zdi, da je direktiva a enojni tip uvoz direktive. Če se pojavi znak z zvezdico, je direktiva a vrsta na zahtevo uvoz direktive.

Previdno
Tako kot pri paket direktiva, uvoz direktive se morajo pojaviti pred katero koli drugo kodo, s tremi izjemami: a paket direktiva, drugo uvoz direktiv ali komentarjev.

Enotni tip uvoz direktiva uvozi ime enega samega javnega referenčnega tipa iz paketa, kot kaže naslednji fragment kode:

uvoz java.util.Date; 

Prejšnji enojni tip uvoz direktiva uvozi ime razreda Datum v izvorno kodo. Kot rezultat določite Datum namesto java.util.Date na vsakem mestu se ime razreda prikaže v izvorni kodi. Na primer pri ustvarjanju datoteke Datum predmet, navedite Datum d = nov datum (); namesto java.util.Date d = novo java.util.Date ();.

Vadite z enojnim tipom uvoz direktiv. Če prevajalnik zazna enojni tip uvoz Direktiva, ki določa ime referenčnega tipa, ki je prav tako navedeno v izvorni datoteki, prevajalnik sporoči napako, kot kaže naslednji fragment kode:

uvoz java.util.Date; datum predavanja {} 

Prevajalnik obravnava fragment kode kot poskus uvedbe dveh referenčnih vrst z istim Datum ime:

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