Kodėl reikia iš naujo išrasti ratą? Ta klišė taikoma programinės įrangos kūrimui, kai kai kurie kūrėjai dažnai perrašo tą patį kodą skirtingoms programoms. Du šio požiūrio trūkumai yra šie:
- Tai eikvoja laiką
- Tai pristato derinimo kodo klaidų potencialą
Kaip alternatyva to paties kodo perrašymui, daugelyje programinės įrangos kūrimo aplinkų yra bibliotekos įrankis, kuris organizuoja dažnai naudojamą kodą. Kūrėjai, baigę derinti kai kuriuos daugkartinio naudojimo kodus, naudoja įrankį, kad šį kodą išsaugotų a biblioteka- vienas ar daugiau failų, kuriuose yra dažnai naudojamas kodas, skirtas naudoti įvairiose programose. Kuriant programą, kompiliatorius arba bibliotekos įrankis pasiekia biblioteką, kad sujungtų programos bibliotekos kodą su programa.
Bibliotekos yra pagrindinės „Java“. Jie iš dalies leidžia JVM „classloader“ surasti klasės failus. (Aptarsiu klasių pakrovėjus būsimame straipsnyje.) Dėl šios priežasties „Java“ bibliotekos paprastai žinomos kaip klasės bibliotekos. Tačiau „Java“ klasių bibliotekas nurodo kaip pakuotės.
Šiame straipsnyje nagrinėjami paketai; Aš jums parodysiu, kaip sukurti klasių ir sąsajų paketus, kaip importuoti (tai yra, įtraukti į programą) supakuotas klases ir sąsajas, kaip perkelti paketus kietajame diske ir kaip naudoti jar failus paketams paketuoti.
Pastaba |
---|
Šio straipsnio vieno paketo eksperimentas yra skirtas „Microsoft Windows“. Turėtumėte sugebėti lengvai ekstrapoliuoti šį eksperimentą ne „Windows“ platformose. |
Kas yra paketai?
A pakuotė yra klasių ir sąsajų rinkinys. Kiekvienas paketas turi savo pavadinimą ir organizuoja savo aukščiausio lygio (tai yra nesusijusias) klases ir sąsajas į atskiras vardų sritis, ar vardų kolekcija. Nors to paties pavadinimo klasės ir sąsajos negali būti rodomos tame pačiame pakete, jos gali būti rodomos skirtinguose paketuose, nes kiekvienam paketui priskiriama atskira vardų sritis.
Žiūrint iš įgyvendinimo perspektyvos, paketo prilyginimas katalogui yra naudingas, taip pat paketo klasių ir sąsajų prilyginimas katalogo klasių failams. Turėkite omenyje kitus metodus, pvz., Duomenų bazių naudojimą, įgyvendinant paketus, todėl neįpraskite visada sutapatinti paketus su katalogais. Kadangi daugelis JVM naudoja katalogus paketams įgyvendinti, šiame straipsnyje paketai prilyginami katalogams. „Java 2 SDK“ organizuoja savo didžiulę klasių ir sąsajų kolekciją į medžių pavidalo paketų paketų hierarchiją, kuri prilygsta katalogams kataloguose. Ta hierarchija leidžia „Sun Microsystems“ lengvai paskirstyti (ir jums lengvai dirbti) tas klases ir sąsajas. „Java“ paketų pavyzdžiai:
java.lang:
Su kalba susijusių klasių rinkinys, pvzObjektas
irStygos
, organizuotasjava
pakuotėslang
paketasjava.lang.ref:
Su nuorodomis susijusių kalbos pamokų rinkinys, pvz„SoftReference“
irReferenceQueue
, organizuotasnuoroda
sub-paketasjava
pakuotėslang
paketasjavax.sūpynės:
Su „Swing“ susijusių komponentų klasių rinkinys, pvzJMygtukas
ir sąsajos, tokios kaipMygtukasModelis
, organizuotasjavax
pakuotėssūpynės
paketas
Laikotarpio simboliai atskiria paketų pavadinimus. Pavyzdžiui, javax.sūpynės
, taško simbolis atskiria paketo pavadinimą javax
nuo pakuotės pavadinimo sūpynės
. Punkto simbolis yra nuo platformos nepriklausomas pasvirojo brūkšnio simbolių atitikmuo (/
), atgalinio brūkšnio ženklai (\
), arba kiti simboliai, skirti atskirti katalogų pavadinimus katalogų paketuose, duomenų bazių šakos hierarchiniame duomenų bazių paketų diegime ir pan.
Patarimas |
---|
Kaip negalite tame pačiame kataloge laikyti failo ir katalogo su identiškais pavadinimais, negalėsite tame pačiame pakete laikyti klasės ar sąsajos ir paketo su identiškais pavadinimais. Pavyzdžiui, atsižvelgiant į paketą pavadinimu sąskaitos , negalite laikyti ir pakuotės, ir klasės, pavadintos mokėtinas į sąskaitos . Kad išvengtumėte prieštaringų pavadinimų, pirmąją klasės ir sąsajos pavadinimų raidę įveskite didžiosiomis raidėmis, o paketų pavadinimų pirmąją raidę - mažosiomis raidėmis. Naudodamas ankstesnį pavyzdį, parduotuvės klasė Mokama pakuotėje sąskaitos kaip sąskaitos. Mokėtina ir pakuotėje mokėtinas pakuotėje sąskaitos kaip sąskaitos.mokėtinos . Sužinokite daugiau apie šį ir kitus „Sun“ vardų suteikimo būdus „Java“ programavimo kalbos kodų konvencijos. |
Sukurkite klasių ir sąsajų paketą
Kiekvieno šaltinio failo klasės ir sąsajos sutvarkomos į paketą. Viduje konors pakuotė
direktyvos nėra, šios klasės ir sąsajos priklauso neįvardytam paketui (katalogas, kurį JVM laiko dabartiniu katalogu - katalogas, kuriame „Java“ programa pradeda vykdyti per „Windows“ java.exe
arba lygiavertė OS programa ir joje nėra pakuočių). Bet jei pakuotė
direktyva rodoma šaltinio faile, ta direktyva pavadina tų klasių ir sąsajų paketą. Norėdami nurodyti a, naudokite šią sintaksę pakuotė
direktyva šaltinio kode:
„paketas“ packageName [ '.' subpackageName ... ] ';'
A pakuotė
direktyva prasideda pakuotė
raktinis žodis. Identifikatorius, pavadinantis paketą, packageName
, tuoj pat seka. Jei klasės ir sąsajos turi atsirasti pakuotėje (tam tikru lygiu) packageName
, vienas ar daugiau atskirų laikotarpių subpackageName
identifikatoriai atsiranda po packageName
. Šiame kodo fragmente pateikiama pora pakuotė
direktyvos:
paketinis žaidimas; paketinis žaidimas.įrenginiai;
Pirmas pakuotė
direktyva identifikuoja paketą pavadinimu žaidimas
. Visos šios direktyvos šaltinio faile rodomos klasės ir sąsajos sutvarkomos žaidimas
pakuotė. Antras pakuotė
direktyva identifikuoja paketą pavadinimu prietaisai
, kuris yra pakete pavadinimu žaidimas
. Visos šios direktyvos šaltinio faile rodomos klasės ir sąsajos sutvarkomos žaidimas
pakuotės prietaisai
paketas. Jei JVM diegimas paketų pavadinimus priskiria katalogų pavadinimams, žaidimas.įrenginiai
žemėlapiai į a žaidimas \ prietaisai
katalogų hierarchija sistemoje „Windows“ ir a žaidimas / prietaisai
katalogų hierarchija pagal „Linux“ arba „Solaris“.
Atsargiai |
---|
Tik vienas pakuotė direktyva gali būti rodoma šaltinio faile. Be to, pakuotė direktyva turi būti pirmasis kodas (išskyrus komentarus) toje byloje. Pažeidus bet kurią taisyklę „Java“ kompiliatorius praneša apie klaidą. |
Kad galėčiau lengviau naudotis paketais, paruošiau pavyzdį, apimančią visas šio straipsnio temas. Šiame skyriuje sužinosite, kaip sukurti pavyzdžio paketą. Vėlesniuose skyriuose sužinosite, kaip importuoti klasę ir sąsają iš šio paketo, kaip perkelti šį paketą į kitą vietą standžiajame diske ir vis tiek pasiekti paketą iš programos ir kaip išsaugoti paketą „jar“ faile . 1 sąraše pateikiamas paketo šaltinio kodas:
Sąrašas 1. A.java
// A.java paketas testpkg; visuomenės klasė A {int x = 1; public int y = 2; apsaugotas int z = 3; int returnx () {return x; } public int returny () {grąžinti y; } apsaugotas int returnz () {return z; } viešoji sąsaja „StartStop“ {void start (); negaliojantis sustojimas (); }} B klasė {public static void labas () {System.out.println ("labas"); }}
1 sąrašas supažindina jūsų pirmąjį pavadintą paketą su šaltinio kodu. paketas testpkg;
direktyva įvardija tą paketą testpkg
. Viduje testpkg
yra klasės A
ir B
. Viduje A
yra trys lauko deklaracijos, trys metodo deklaracijos ir vidinės sąsajos deklaracijos. Viduje B
yra vieno metodo deklaracija. Visas šaltinio kodas saugomas A.java
nes A
yra vieša klasė. Mūsų užduotis: paverskite šį šaltinio kodą paketu, kurį sudaro dvi klasės ir vidinė sąsaja (arba katalogas, kuriame yra trys klasės failai). Šie uždaviniai atliekami vykdant šiuos „Windows“ veiksmus:
- Atidarykite „Windows“ komandų langą ir įsitikinkite, kad esate
c:
disko šakninis katalogas (pagrindinis katalogas - žymimas pradiniu atgaliniu pasviruoju brūkšniu (\
) charakteris). Norėdami tai padaryti, įveskitec:
komandą, po kurios einaCD \
komandą. (Jei naudojate kitą diską, pakeiskitec:
pasirinktu disku. Įvedę komandą, nepamirškite paspausti klavišo Enter.) - Sukurti
testpkg
katalogą įvesdamimd testpkg
. Pastaba: Vykdydami šio straipsnio veiksmus, po komandų nerašykite taškų. - Padarykite
testpkg
dabartinį katalogą įvesdamiCD testpkg
. - Redaktoriumi įveskite 1 sąrašo šaltinio kodą ir išsaugokite kodą
A.java
failątestpkg
. - Sudaryti
A.java
rašydamijavacas A.java
. Turėtumėte pamatyti klasės failus$ StartStop.class
,Klasė
irB.klasė
pasirodystestpkg
kataloge.
1 paveiksle pavaizduoti 3–5 žingsniai.
Sveikiname! Jūs ką tik sukūrėte savo pirmąjį paketą. Pagalvokite apie šį paketą kaip apie dvi klases (A
ir B
) ir A
vidinė sąsaja („StartStop“
). Taip pat galite galvoti apie šį paketą kaip katalogą, kuriame yra trys klasės failai: $ StartStop.class
, Klasė
ir B.klasė
.
Pastaba |
---|
Siekdama sumažinti paketų pavadinimų konfliktus (ypač tarp komercinių paketų), „Sun“ sukūrė susitarimą, pagal kurį įmonės interneto domeno vardas pakeičia paketų pavadinimą. Pavyzdžiui, įmonė su x.com kaip savo interneto domeno vardą ir a.b kaip paketo pavadinimą (a ), po kurio nurodomas pakuotės pavadinimas (b ) priešdėliai com.x į a.b , kurio rezultatas com.x.a.b . Mano straipsnis neatitinka šios konvencijos, nes testpkg paketas yra išmesti skirtas tik mokymo tikslams. |
Importuokite paketo klases ir sąsajas
Turėdami paketą, norėsite importuoti klases ir (arba) sąsajas, iš tikrųjų, klasių ir (arba) sąsajų pavadinimus, iš to paketo į savo programą, kad ji galėtų naudoti tas klases ir (arba) sąsajas. Vienas iš būdų atlikti šią užduotį yra pateikti pilną paketo pavadinimą (paketo pavadinimą ir visus paketų pavadinimus) kiekvienoje vietoje, kur rodomas nuorodos tipo pavadinimas (klasės arba sąsajos pavadinimas), kaip rodo 2 sąrašas:
Sąrašas 2. Usetestpkg1.java
// „Usetestpkg1.java“ klasė „Usetestpkg1“ įgyvendina 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“ = naujas „Usetestpkg1“ (); utp.start (); utp.stop (); } public void start () {System.out.println ("Pradėti"); } public void stop () {System.out.println ("Stop"); }}
Priešdėliais testpkg.
į A
, Naudojimaspkg1
prieigos testpkg
klasės A
dviejose vietose ir A
vidinė sąsaja „StartStop“
vienoje vietoje. Norėdami sukompiliuoti ir paleisti, atlikite šiuos veiksmus Naudojimaspkg1
:
- Atidarykite „Windows“ komandų langą ir įsitikinkite, kad esate
c:
disko šakninis katalogas. - Užtikrinkite
klasės kelias
aplinkos kintamasis neegzistuoja vykdantnustatyti klasės kelią =
. (Aptariuklasės kelias
vėliau šiame straipsnyje.) - Redaktoriumi įveskite 2 sąrašo šaltinio kodą ir išsaugokite tą kodą
Naudokitepkg1.java
failą šakniniame kataloge. - Sudaryti
Naudokitepkg1.java
rašydamijavac Usetestpkg1.java
. Turėtumėte pamatyti klasės failąNaudokitepkg1.class
pasirodys šakniniame kataloge. - Tipas
java Usetestpkg1
paleisti šią programą.
2 paveiksle pavaizduoti 3–5 žingsniai ir parodyti programos rezultatai.
Pagal Naudojimaspkg1
produkcija, pagrindinis ()
metodo gija sėkmingai pasiekiama testpkg.A
's y
lauką ir skambina pakartoti ()
metodas. Be to, iš rezultatų matyti, kad sėkmingai įgyvendinta testpkg.A.StartStop
vidinė sąsaja.
Dėl Naudojimaspkg1
, priešdėlis testpkg.
į A
trijose vietose neatrodo didelė problema. Bet kas nori šimte vietų nurodyti visiškai kvalifikuotą paketo pavadinimo priešdėlį? Laimei, „Java“ tiekia importas
direktyvą importuoti paketo viešojo nuorodos tipo pavadinimą (-us), todėl jums nereikia įvesti visiškai kvalifikuotų paketo pavadinimo priešdėlių. Išreikškite an importas
direktyvą šaltinio kode naudojant šią sintaksę:
„importas“ packageName [ '.' subpackageName ... ] '.' ( referencetypeName | '*' ) ';'
An importas
direktyvą sudaro importas
raktinis žodis, po kurio iškart nurodomas identifikatorius, pavadinantis paketą, packageName
. Neprivalomas sąrašas subpackageName
Toliau pateikiami identifikatoriai, norint nustatyti tinkamą paketą (jei reikia). Direktyvos pabaigoje pateikiama arba a referencetypeName
identifikatorius, identifikuojantis konkrečią klasę ar sąsają iš paketo, arba žvaigždutė (*
) charakteris. Jei referencetypeName
pasirodo, direktyva yra a vieno tipo importas
direktyvą. Jei pasirodys žvaigždutė, direktyva yra a tipo pagal pareikalavimą importas
direktyvą.
Atsargiai |
---|
Kaip ir su pakuotė direktyva, importas direktyvos turi būti prieš bet kurį kitą kodą, išskyrus tris išimtis: a pakuotė direktyva, kita importas direktyvas ar komentarus. |
Vieno tipo importas
direktyva iš paketo importuoja vieno viešo nuorodos tipo pavadinimą, kaip rodo šis kodo fragmentas:
importuoti java.util.Date;
Ankstesnis vieno tipo importas
direktyva importuoja klasės pavadinimą Data
į šaltinio kodą. Dėl to jūs nurodote Data
vietoj java.util.Data
kiekvienoje vietoje tas klasės pavadinimas yra šaltinio kode. Pavyzdžiui, kuriant Data
objektas, nurodykite Data d = nauja data ();
vietoj java.util.Date d = nauja java.util.Date ();
.
Būkite atsargūs su vieno tipo importas
direktyvas. Jei kompiliatorius aptinka vieno tipo importas
direktyvą, kurioje nurodomas šaltinio faile nurodytas nuorodos tipo pavadinimas, kompiliatorius praneša apie klaidą, kaip parodo šis kodo fragmentas:
importuoti java.util.Date; klasės data {}
Kompiliatorius laiko kodo fragmentą bandymu įvesti du vienodus nuorodų tipus Data
vardas: