Miksi pyörä keksitään uudelleen? Tämä klisee koskee ohjelmistokehitystä, jossa jotkut kehittäjät kirjoittavat usein saman koodin eri ohjelmille. Kaksi haittapuolta tässä lähestymistavassa ovat:
- Se tuhlaa aikaa
- Se tuo virheenkorjauskoodiin mahdollisuuden
Vaihtoehtona saman koodin uudelleenkirjoittamiselle monet ohjelmistokehitysympäristöt tarjoavat kirjastotyökalun, joka järjestää usein käytetyn koodin. Kun kehittäjät ovat suorittaneet jonkin uudelleen käytettävän koodin virheenkorjauksen, he käyttävät työkalua koodin tallentamiseen a kirjasto— Yksi tai useampi tiedosto, joka sisältää usein käytettyä koodia käytettäväksi eri ohjelmissa. Ohjelman rakentamisen aikana kääntäjä tai kirjastotyökalu käyttää kirjastoa yhdistääkseen ohjelman kirjastoon viitatun koodin ohjelmaan.
Kirjastot ovat Java: n perustekijöitä. Ne antavat JVM: n classloaderille mahdollisuuden paikantaa luokkatiedostot. (Tutkin luokan lataajia tulevassa artikkelissa.) Tästä syystä Javan kirjastot tunnetaan yleisesti nimellä luokan kirjastot. Java viittaa kuitenkin luokkakirjastoihin nimellä paketteja.
Tässä artikkelissa tutkitaan paketteja; Näytän sinulle, kuinka luodaan paketteja luokista ja rajapinnoista, kuinka tuodaan (eli tuodaan ohjelmaan) pakattuja luokkia ja rajapintoja, kuinka paketteja siirretään kiintolevylle ja miten jar-tiedostoja käytetään pakettien kapseloinnissa.
Merkintä |
---|
Tämän artikkelin yksittäinen pakettikokeilu on Microsoft Windows -kohtainen. Sinun pitäisi pystyä ekstrapoloimaan tämä kokeilu helposti muille kuin Windows-alustoille. |
Mitä paketit ovat?
A paketti on kokoelma luokkia ja rajapintoja. Jokaisella paketilla on oma nimi ja se järjestää ylätason (eli sisäkkäiset) luokat ja käyttöliittymät erillisiksi nimitila, tai nimikokoelma. Vaikka samannimisiä luokkia ja käyttöliittymiä ei voi esiintyä samassa paketissa, ne voivat näkyä eri paketeissa, koska kullekin paketille annetaan erillinen nimitila.
Toteutuksen näkökulmasta paketin rinnastaminen hakemistoon osoittautuu hyödylliseksi, samoin paketin luokkien ja rajapintojen tasaaminen hakemiston luokkatiedostoihin. Pidä mielessä muut lähestymistavat - kuten tietokantojen käyttö - pakettien toteuttamiseen, joten älä tule tapana tasata paketteja aina hakemistoihin. Mutta koska monet JVM: t käyttävät hakemistoja pakettien toteuttamiseen, tämä artikkeli rinnastaa paketit hakemistoihin. Java 2 SDK järjestää laajan kokoelman luokkia ja rajapintoja pakettien puumaiseksi pakettien hierarkiaksi, mikä vastaa hakemistojen hakemistoja. Kyseisen hierarkian avulla Sun Microsystems voi jakaa (ja sinun on helppo työskennellä) nämä luokat ja rajapinnat. Esimerkkejä Java-paketeista ovat:
java.lang:
Kokoelma kielikursseja, kutenEsine
jaMerkkijono
, järjestettyjava
pakettilang
alipakettijava.lang.ref:
Kokoelma viitteisiin liittyviä kielikursseja, kutenSoftReference
jaReferenceQueue
, järjestettyviite
alipakettijava
pakettilang
alipakettijavax.swing:
Kokoelma Swingiin liittyviä komponenttiluokkia, kutenJPainike
ja rajapinnat, kutenPainikeMalli
, järjestettyjavax
pakettikeinu
alipaketti
Aikamerkit erottavat pakettien nimet. Esimerkiksi javax.swing
, pistemerkki erottaa paketin nimen javax
alipaketin nimestä keinu
. Pistemerkki on alustasta riippumaton vastaava viiva eteenpäin (/
), vinoviivat (\
), tai muita merkkejä hakemistojen nimien erottamiseksi hakemistopohjaisessa pakettitoteutuksessa, tietokannan haarat hierarkkisessa tietokantapohjaisessa pakettitoteutuksessa ja niin edelleen.
Kärki |
---|
Aivan kuten et voi tallentaa sekä tiedostoa että hakemistoa, jolla on identtiset nimet, samaan hakemistoon, et voi tallentaa luokkaa tai käyttöliittymää ja pakettia, jolla on identtiset nimet, samaan pakettiin. Esimerkiksi annetaan paketti nimeltä tilit , et voi tallentaa sekä pakettia että luokkaa nimeltä maksettava sisään tilit . Ristiriitojen välttämiseksi kirjoita luokan ja käyttöliittymän nimen iso kirjain ja paketin nimen ensimmäinen kirjain. Käyttämällä edellistä esimerkkiä, tallenna luokka Maksettava pakkauksessa tilit kuten Maksettava ja pakkaus maksettava pakkauksessa tilit kuten tilit. maksettava . Lisätietoja tästä ja muista Sunin nimeämiskäytännöistä Java-ohjelmointikielen kooditavat. |
Luo paketti luokista ja rajapinnoista
Jokaisen lähdetiedoston luokat ja rajapinnat järjestyvät pakettiin. vuonna paketti
Direktiivin puuttuessa nämä luokat ja käyttöliittymät kuuluvat nimeämättömään pakettiin (hakemisto, jota JVM pitää nykyisenä hakemistona - hakemisto, jossa Java-ohjelma aloittaa suorituksen Windowsin kautta java.exe
tai vastaava käyttöjärjestelmä (eikä sisällä alipaketteja). Mutta jos paketti
-direktiivi esiintyy lähdetiedostossa, siinä nimetään paketti kyseisille luokille ja rajapinnoille. Määritä a seuraavalla syntaksilla paketti
direktiivi lähdekoodissa:
'paketti' paketin nimi [ '.' subpackageName ... ] ';'
A paketti
direktiivi alkaa paketti
avainsana. Tunniste, joka nimeää paketin, paketin nimi
, seuraa välittömästi. Jos luokkia ja rajapintoja halutaan ilmoittaa alipaketissa (jossain tasossa) sisällä paketin nimi
, yksi tai useampi jaksoerotettu subpackageName
tunnisteet näkyvät jälkeen paketin nimi
. Seuraava koodinpätkä esittää parin paketti
direktiivit:
pakettipeli; pakettipeli.laitteet;
Ensimmäinen paketti
direktiivi tunnistaa paketin nimeltä peli
. Kaikki kyseisen direktiivin lähdetiedostossa esiintyvät luokat ja rajapinnat järjestyvät peli
paketti. Toinen paketti
direktiivi tunnistaa nimetyn alipaketin laitteet
, joka sijaitsee nimellisessä paketissa peli
. Kaikki kyseisen direktiivin lähdetiedostossa esiintyvät luokat ja rajapinnat järjestyvät peli
paketti laitteet
alipaketti. Jos JVM-toteutus yhdistää pakettien nimet hakemistojen nimiin, game.devices
kartat a peli \ laitteet
hakemistohierarkia Windowsissa ja a peli / laitteet
hakemistohierarkia Linuxissa tai Solarisissa.
Varoitus |
---|
Vain yksi paketti direktiivi voi näkyä lähdetiedostossa. Lisäksi paketti Direktiivin on oltava ensimmäinen koodi (kommentteja lukuun ottamatta) tiedostossa. Kummankin säännön rikkominen saa Java-kääntäjän ilmoittamaan virheestä. |
Pakkausten mukavuuden parantamiseksi olen laatinut esimerkin, joka kattaa kaikki tämän artikkelin aiheet. Tässä osassa opit luomaan esimerkin paketin. Myöhemmissä osioissa opit tuomaan luokan ja käyttöliittymän tästä paketista, kuinka paketti siirretään toiseen paikkaan kiintolevylläsi ja silti käyttää pakettia ohjelmasta ja kuinka paketti tallennetaan jar-tiedostoon . Listaus 1 esittää paketin lähdekoodin:
Listaus 1. A.java
// A.java-paketin testpkg; julkinen luokka A {int x = 1; julkinen int y = 2; suojattu int z = 3; int returnx () {return x; } public int returny () {palaa y; } suojattu int returnz () {return z; } julkinen käyttöliittymä StartStop {void start (); mitätön pysäytys (); }} luokka B {public static void hello () {System.out.println ("hei"); }}
Listaus 1 tuo lähdekoodin ensimmäiseen nimettyyn pakettiin. paketti testpkg;
direktiivi nimittää kyseisen paketin testpkg
. Sisällä testpkg
ovat luokkia A
ja B
. Sisällä A
ovat kolme kenttä-, kolme menetelmä- ja sisäisen rajapinnan ilmoitusta. Sisällä B
on yhden menetelmän ilmoitus. Koko lähdekoodi tallennetaan A.java
koska A
on julkinen luokka. Tehtävämme: Muuta tämä lähdekoodi paketiksi, joka koostuu kahdesta luokasta ja sisäisestä käyttöliittymästä (tai hakemistosta, joka sisältää kolme luokkatiedostoa). Seuraavat Windows-kohtaiset vaiheet suorittavat tämän tehtävän:
- Avaa Windowsin komentoikkuna ja varmista, että olet
c:
aseman juurihakemisto (päähakemisto - jota edustaa alkuviiva (\
) merkki). Voit tehdä tämän kirjoittamallac:
-komento, jota seuraacd \
komento. (Jos käytät eri asemaa, vaihdac:
valitsemallasi asemalla. Älä myöskään unohda painaa Enter-näppäintä komennon kirjoittamisen jälkeen.) - Luo
testpkg
hakemistoon kirjoittamallamd testpkg
. merkintä: Kun kirjoitat tämän artikkelin ohjeita, älä kirjoita pisteitä komentojen jälkeen. - Tehdä
testpkg
nykyinen hakemisto kirjoittamallacd testpkg
. - Syötä muokkausohjelmalla Listaus 1: n lähdekoodi ja tallenna koodi
A.java
tiedostotestpkg
. - Koota
A.java
kirjoittamallajavac A.java
. Sinun pitäisi nähdä luokan tiedostot$ StartStop.class
,Luokka
jaB. luokka
näkyvättestpkg
hakemistoon.
Kuva 1 kuvaa vaiheet 3 - 5.
Onnittelut! Olet juuri luonut ensimmäisen pakettisi. Ajattele tätä pakettia sisältävän kaksi luokkaa (A
ja B
) ja A
yhden sisäisen käyttöliittymän (StartStop
). Voit myös ajatella tätä pakettia hakemistona, joka sisältää kolme luokkatiedostoa: $ StartStop.class
, Luokka
ja B. luokka
.
Merkintä |
---|
Minimoidakseen pakettien nimiristiriidat (erityisesti kaupallisten pakettien välillä), Sun on perustanut käytännön, jossa yrityksen Internet-verkkotunnus kääntää ja etuliittää paketin nimen. Esimerkiksi yritys, jolla x.com Internet - verkkotunnuksena ja a. b paketin nimellä (a ), jota seuraa alipakkauksen nimi (b ) etuliitteet com. x että a. b , johtaen com.x.a.b . Artikkelini ei noudata tätä käytäntöä, koska testpkg paketti on heittää pois vain opetustarkoituksiin. |
Tuo paketin luokat ja käyttöliittymät
Kun sinulla on paketti, haluat tuoda luokat ja / tai rajapinnat - tosiasiallisesti luokkien ja / tai käyttöliittymien nimet - kyseisestä paketista ohjelmallesi, jotta se voi käyttää näitä luokkia ja / tai rajapintoja. Yksi tapa suorittaa tämä tehtävä on toimittaa täysin hyväksytty paketin nimi (paketin nimi ja kaikki alipakettien nimet) kussakin paikassa, jossa viitetyypin nimi (luokan tai käyttöliittymän nimi) esiintyy, kuten Listing 2 osoittaa:
Listaus 2. Usetestpkg1.java
// Usetestpkg1.java-luokka Usetestpkg1 toteuttaa testpkg.A.StartStop {public static void main (String [] args) {testpkg.A a = new testpkg.A (); System.out.println (ay); System.out.println (a.returny ()); Usetestpkg1 utp = uusi Usetestpkg1 (); utp.start (); utp.stop (); } public void start () {System.out.println ("Käynnistä"); } public void stop () {System.out.println ("Stop"); }}
Etuliitteellä testpkg.
että A
, Käytä testkg1
pääsy testpkg
luokan A
kahdessa paikassa ja A
sisäisen käyttöliittymän StartStop
yhdessä paikassa. Suorita seuraavat vaiheet koota ja suorittaa Käytä testkg1
:
- Avaa Windowsin komentoikkuna ja varmista, että olet
c:
aseman juurihakemisto. - Varmista, että
luokkatie
ympäristömuuttujaa ei ole olemassa suorittamallaset classpath =
. (Keskustelenluokkatie
myöhemmin tässä artikkelissa.) - Syötä muokkausohjelmalla Listing 2: n lähdekoodi ja tallenna koodi a: hon
Käytä testpkg1.java
tiedosto juurihakemistossa. - Koota
Käytä testpkg1.java
kirjoittamallajavac Usetestpkg1.java
. Sinun pitäisi nähdä luokan tiedostoKäytä testkg1luokkaa
näkyvät juurihakemistossa. - Tyyppi
java Usetestpkg1
tämän ohjelman suorittamiseksi.
Kuva 2 kuvaa vaiheet 3 - 5 ja näyttää ohjelman tuotoksen.
Mukaan Käytä testkg1
tuotos, main ()
method-ketju käyttää onnistuneesti testipkg.A
on y
-kenttään ja kutsuu palata ()
menetelmä. Lisäksi tulos osoittaa ohjelman onnistuneen toteuttamisen testpkg.A.StartStop
sisäinen käyttöliittymä.
Sillä Käytä testkg1
, etuliite testpkg.
että A
kolmessa paikassa ei tunnu iso juttu. Mutta kuka haluaa määrittää täysin hyväksytyn paketin nimen etuliitteen sadassa paikassa? Onneksi Java toimittaa tuonti
-direktiivi tuoda paketin julkisen viitetyypin nimi (t), joten sinun ei tarvitse kirjoittaa pakollisia paketin nimen etuliitteitä. Express tuonti
direktiivin lähdekoodissa seuraavan syntaksin kautta:
'tuonti' paketin nimi [ '.' subpackageName ... ] '.' ( referencetypeName | '*' ) ';'
An tuonti
direktiivi koostuu tuonti
avainsana, jota seuraa välittömästi tunniste, joka nimeää paketin, paketin nimi
. Valinnainen luettelo subpackageName
tunnisteet seuraavat sopivan alipaketin tunnistamiseksi (tarvittaessa). Direktiivin lopussa on joko a referencetypeName
tunniste, joka tunnistaa tietyn luokan tai käyttöliittymän paketista, tai tähti (*
) merkki. Jos referencetypeName
ilmestyy, direktiivi on a yksityyppinen tuonti
direktiivi. Jos tähtimerkki ilmestyy, direktiivi on a tyyppi-on-demand tuonti
direktiivi.
Varoitus |
---|
Kuten paketti direktiivi, tuonti direktiivien on oltava ennen muita koodeja, lukuun ottamatta kolmea poikkeusta: a paketti direktiivi, muu tuonti direktiivejä tai kommentteja. |
Yksityyppi tuonti
Direktiivi tuo yhden julkisen viitetyypin nimen paketista, kuten seuraava koodinpätkä osoittaa:
tuo java.util.Date;
Edellinen yksityyppi tuonti
direktiivi tuo luokan nimen Päivämäärä
lähdekoodiksi. Tämän seurauksena määrität Päivämäärä
sijasta java.util.Päiväys
kussakin paikassa kyseisen luokan nimi esiintyy lähdekoodissa. Esimerkiksi, kun luot a Päivämäärä
objekti, määritä Päivämäärä d = uusi päivämäärä ();
sijasta java.util.Date d = uusi java.util.Date ();
.
Ole varovainen yhden tyyppisellä tuonti
direktiivejä. Jos kääntäjä havaitsee yhden tyypin tuonti
Direktiivi, joka määrittää myös lähdetiedostossa ilmoitetun viitetyypin nimen, kääntäjä ilmoittaa virheestä, kuten seuraava koodiosa osoittaa:
tuo java.util.Date; luokan päivämäärä {}
Kääntäjä pitää koodifragmenttia yrityksenä ottaa käyttöön kaksi samaa viitetyyppiä Päivämäärä
nimi: