Edellisessäni Java 101 opetusohjelma, opit organisoimaan koodisi paremmin ilmoittamalla viitetyypit (tunnetaan myös luokkina ja rajapinnoina) muiden viitetyyppien ja lohkojen jäseninä. Esitin myös, kuinka voit käyttää sisäkkäisyyttä, jotta vältetään nimiristiriidat sisäkkäisten viitetyyppien ja ylätason viitetyyppien välillä, joilla on sama nimi.
Pesimisen ohella Java käyttää paketteja samannimisten ongelmien ratkaisemiseen ylätason viitetyypeissä. Staattisen tuonnin käyttö yksinkertaistaa myös staattisten jäsenten käyttöä pakatuissa ylätason viitetyypeissä. Staattinen tuonti säästää näppäinpainalluksia, kun käytät näitä jäseniä koodissasi, mutta on muutamia asioita, joita on syytä varoa, kun käytät niitä. Tässä opetusohjelmassa esitän sinut pakettien ja staattisen tuonnin käyttämisestä Java-ohjelmissasi.
lataa Hae koodi Lataa lähdekoodi esimerkiksi sovelluksiin tässä Java-opetusohjelmassa. Luonut Jeff Friesen JavaWorldille.Pakkauksen viitetyypit
Java-kehittäjät ryhmittelevät niihin liittyvät luokat ja rajapinnat paketteihin. Pakettien käyttö helpottaa viitetyyppien löytämistä ja käyttöä, välttää nimiristiriitoja samannimisten tyyppien välillä ja hallita tyyppien käyttöä.
Tässä osassa opit paketeista. Löydät paketit, tutustu paketti
ja tuonti
lauseita ja tutustu suojattujen käyttöoikeuksien, JAR-tiedostojen ja tyyppihakujen aiheisiin.
Mitä Java-paketit ovat?
Ohjelmistokehityksessä järjestämme tavallisesti kohteet niiden hierarkkisten suhteiden mukaan. Esimerkiksi edellisessä opetusohjelmassa esitin sinulle, kuinka ilmoitetaan luokat muiden luokkien jäseniksi. Voimme käyttää tiedostojärjestelmiä myös hakemistojen pesimiseen muihin hakemistoihin.
Näiden hierarkkisten rakenteiden käyttäminen auttaa välttämään nimiristiriitoja. Esimerkiksi ei-hierarkkisessa tiedostojärjestelmässä (yksi hakemisto) ei ole mahdollista määrittää samaa nimeä useille tiedostoille. Sitä vastoin hierarkkinen tiedostojärjestelmä antaa saman nimisten tiedostojen olla olemassa eri hakemistoissa. Vastaavasti kaksi liitettävää luokkaa voi sisältää saman nimisiä sisäkkäisiä luokkia. Nimiristiriitoja ei ole, koska kohteet on jaettu eri nimitiloihin.
Java antaa meille mahdollisuuden myös jakaa ylätason (ei sisäkkäiset) viitetyypit useisiin nimitiloihin, jotta voimme järjestää nämä tyypit paremmin ja estää nimiristiriidat. Java: ssa pakettikieliominaisuutta käytetään jakamaan ylätason viitetyypit useisiin nimitiloihin. Tässä tapauksessa a paketti on ainutlaatuinen nimitila viitetyyppien tallentamiseen. Paketit voivat tallentaa luokkia ja rajapintoja alipaketit, jotka ovat paketteja, jotka ovat sisäkkäisiä muissa paketeissa.
Paketilla on nimi, jonka on oltava varaamaton tunniste; esimerkiksi, java
. Jäsenkäyttöoperaattori (.
) erottaa paketin nimen alipaketin nimestä ja erottaa paketin tai alipaketin nimen tyypin nimestä. Esimerkiksi kahden jäsenen käyttöoperaattorit java.lang.Järjestelmä
erillinen paketin nimi java
alkaen lang
alipaketin nimi ja erillinen paketin nimi lang
alkaen Järjestelmä
tyypin nimi.
Viitetyypit on ilmoitettava julkinen
päästä käsiksi pakettiensa ulkopuolelta. Sama koskee kaikkia vakioita, konstruktoreita, menetelmiä tai sisäkkäisiä tyyppejä, joiden on oltava käytettävissä. Näet esimerkkejä näistä myöhemmin opetusohjelmassa.
Pakettilauseke
Javassa käytämme pakettilauseke luoda paketti. Tämä käsky näkyy lähdetiedoston yläosassa ja tunnistaa paketin, johon lähdetiedostotyypit kuuluvat. Sen on oltava seuraavan syntaksin mukainen:
paketti tunniste[.tunniste]*;
Pakettilauseke alkaa varatulla sanalla paketti
ja jatkuu tunnisteella, jota valinnaisesti seuraa jaksoittain erotettu tunnisteiden sekvenssi. Puolipiste (;
) lopettaa tämän lausunnon.
Ensimmäinen (vasemmanpuoleisin) tunniste nimeää paketin ja jokainen seuraava tunniste alipaketin. Esimerkiksi paketti a.b;
, kaikki lähdetiedostossa ilmoitetut tyypit kuuluvat ryhmään b
alipaketti a
paketti.
Pakettien / alipakettien nimeämiskäytäntö
Sopimuksen mukaan ilmaisemme paketin tai alipaketin nimen pienillä kirjaimilla. Kun nimi koostuu useista sanoista, sinun kannattaa ehkä kirjoittaa isot sanat ensimmäistä lukuun ottamatta; esimerkiksi, pääkirja
.
Pakettien nimien sarjan on oltava ainutlaatuinen kääntämisen ongelmien välttämiseksi. Oletetaan esimerkiksi, että luot kaksi erilaista grafiikka
ja oletetaan, että kukin grafiikka
paketti sisältää a Kolmio
luokka eri käyttöliittymällä. Kun Java-kääntäjä kohtaa jotain alla olevaa, sen on varmistettava, että Kolmio (int, int, int, int)
rakentaja on olemassa:
Kolmio t = uusi kolmio (1, 20, 30, 40);
Kolmion rajoittava laatikko
Ajattele Kolmio
konstruktori määrittelemällä rajoittavan laatikon, johon kolmio piirretään. Kaksi ensimmäistä parametria tunnistavat laatikon vasemman yläkulman ja kaksi toista parametria määrittelevät laatikon laajuuden.
Kääntäjä etsii kaikkia käytettävissä olevia paketteja, kunnes se löytää a grafiikka
paketti, joka sisältää a Kolmio
luokassa. Jos löydetty paketti sisältää sopivan Kolmio
luokka a Kolmio (int, int, int, int)
rakentaja, kaikki on hyvin. Muuten, jos löydetty Kolmio
luokassa ei ole Kolmio (int, int, int, int)
konstruktori, kääntäjä ilmoittaa virheestä. (Sanon lisää hakualgoritmista myöhemmin tässä opetusohjelmassa.)
Tämä skenaario kuvaa yksittäisten pakettien nimisekvenssien valinnan tärkeyttä. Yksilöllisen nimisekvenssin valitsemisen tapa on kääntää Internet-verkkotunnuksesi ja käyttää sitä sekvenssin etuliitteenä. Esimerkiksi valitsisin ca. javajeff
koska etuliite koska javajeff.ca
on verkkotunnukseni nimi. Haluaisin sitten täsmentää ca. javajeff grafiikka. kolmio
pääsyyn Kolmio
.
Verkkotunnuksen komponentit ja kelvolliset pakettien nimet
Verkkotunnuksen komponentit eivät aina ole kelvollisia pakettien nimiä. Yksi tai useampi komponenttien nimi voi alkaa numerolla (3D.com
), sisältävät väliviivan (-
) tai muu laiton luonne (ab-z.com
) tai olla yksi Java: n varattuista sanoista (short.com
). Yleissopimuksen mukaan sinun on lisättävä numero alaviivalla (com.3D
), korvaa laiton merkki alaviivalla (com.ab_z
) ja lisää varattu sana alaviivalla (com.short_
).
Noudata muutamia sääntöjä välttääksesi lisäongelmia pakettilausekkeessa:
- Voit ilmoittaa vain yhden pakettilausekkeen lähdetiedostossa.
- Et voi edeltää pakettilausetta muilla kuin kommenteilla.
Ensimmäinen sääntö, joka on toisen säännön erityistapaus, on olemassa, koska ei ole järkevää tallentaa viitetyyppiä useisiin paketteihin. Vaikka paketti voi tallentaa useita tyyppejä, tyyppi voi kuulua vain yhteen pakettiin.
Kun lähdetiedosto ei ilmoita pakettilauseketta, lähdetiedoston tyyppien sanotaan kuuluvan nimeämätön paketti. Ei-triviaalit viitetyypit tallennetaan tyypillisesti omiin paketteihinsa ja ne välttävät nimeämätöntä pakettia.
Java-toteutukset yhdistävät pakettien ja alipakettien nimet samannimisiin hakemistoihin. Esimerkiksi toteutus kartoittaisi grafiikka
nimettyyn hakemistoon grafiikka
. Paketin tapauksessa a. b
, ensimmäinen kirje, a kartoitetaan hakemistoon nimeltä a
ja b kartoittaisi a b
alihakemisto a
. Kääntäjä tallentaa pakettityypit toteuttavat luokkatiedostot vastaavaan hakemistoon. Huomaa, että nimeämätön paketti vastaa nykyistä hakemistoa.
Esimerkki: Äänikirjaston pakkaaminen Java-tiedostoon
Käytännön esimerkki on hyödyllinen paketti
lausunto. Tässä osassa esitän paketteja äänikirjaston yhteydessä, jonka avulla voit lukea äänitiedostoja ja hankkia äänitietoja. Lyhyesti sanottuna esitän vain luurankoversion kirjastosta.
Äänikirjasto koostuu tällä hetkellä vain kahdesta luokasta: Audio
ja WavReader
. Audio
kuvaa äänileikkeen ja on kirjaston pääluokka. Listaus 1 esittää sen lähdekoodin.
Luettelo 1. Pakettilausesimerkki (Audio.java)
paketti ca.javajeff.audio; julkinen loppuluokka Audio {private int [] -näytteet; yksityinen int sampleRate; Ääni (int [] näytteet, int sampleRate) {tämä.näytteet = näytteet; this.sampleRate = sampleRate; } public int [] getSamples () {palauta näytteet; } public int getSampleRate () {return sampleRate; } public staattinen ääni newAudio (String-tiedostonimi) {if (tiedostonimi.toLowerCase (). endWith (". wav")) palauttaa WavReader.read (tiedostonimi); muuten palauta null; // ei tuettu formaatti } }
Käydään läpi Listing 1 vaihe vaiheelta.
-
Audio.java
Tiedosto luettelossa 1 tallentaaAudio
luokassa. Tämä luettelo alkaa pakettilausekkeella, joka tunnistaaca. javajeff.audio
luokan pakettina. Audio
ilmoitetaanjulkinen
jotta siihen voidaan viitata paketin ulkopuolelta. Lisäksi se on julistettulopullinen
jotta sitä ei voida laajentaa (tarkoittaen alaluokkaa).Audio
julistaayksityinen
näytteet
janäytteenottotaajuus
kentät äänidatan tallentamiseksi. Nämä kentät alustetaan arvoille, jotka välitetäänAudio
rakentaja.Audio
rakentaja on ilmoitettu paketti-yksityinen (tarkoittaa, että rakentajaa ei ilmoitetajulkinen
,yksityinen
taisuojattu
), jotta tätä luokkaa ei voida instantisoida paketin ulkopuolelta.Audio
lahjojagetSamples ()
jagetSampleRate ()
menetelmät äänileikkeen näytteiden ja näytteenottotaajuuden palauttamiseksi. Jokainen menetelmä ilmoitetaanjulkinen
jotta se voidaan kutsua ulkopuoleltaAudio
paketti.Audio
päättyy ajulkinen
jastaattinen
uusiAudio ()
tehdas menetelmä palauttaaAudio
objektia vastaavaTiedoston nimi
Perustelu. Jos äänileikettä ei löydy,tyhjä
palautetaan.uusiAudio ()
vertaaTiedoston nimi
: n laajennus.wav
(tämä esimerkki tukee vain WAV-ääntä). Jos ne sopivat yhteen, se toteutetaanreturn WavReader.read (tiedostonimi)
palauttaaAudio
objekti WAV-pohjaisen äänidatan kanssa.
Listaus 2 kuvaa WavReader
.
Listaus 2. WavReader-apulaite (WavReader.java)
paketti ca.javajeff.audio; final class WavReader {static Audio read (String filename) {// Lue tiedostonimen sisältö ja käsittele se // joukoksi näyte-arvoja ja näytteenottotaajuus // arvo. Jos tiedostoa ei voi lukea, palauta null. // Lyhyyden vuoksi (ja koska en ole vielä keskustellut Javan // tiedoston I / O-sovellusliittymistä), esitän vain luurankokoodin, joka // palauttaa aina ääniobjektin oletusarvoilla. palauta uusi ääni (uusi int [0], 0); }}
WavReader
on tarkoitettu lukemaan WAV-tiedoston sisältö Audio
esine. (Luokka on lopulta isompi lisäkursseilla yksityinen
kentät ja menetelmät.) Huomaa, että tätä luokkaa ei ole ilmoitettu julkinen
, joka tekee WavReader
saatavilla Audio
mutta ei koodata ca. javajeff.audio
paketti. Ajatella WavReader
auttajaluokana, jonka ainoa syy olemassaololle on palvella Audio
.
Suorita seuraavat vaiheet tämän kirjaston rakentamiseksi:
- Valitse sopiva sijainti tiedostojärjestelmässä nykyiseksi hakemistoksi.
- Luo
ca / javajeff / audio
alihakemistohierarkia nykyisessä hakemistossa. - Kopioi ilmoitukset 1 ja 2 tiedostoihin
Audio.java
jaWavReader.java
vastaavasti; ja tallenna nämä tiedostotaudio-
alihakemisto. - Olettaen, että nykyinen hakemisto sisältää
noin
alihakemisto, suoritajavac ca / javajeff / audio / *. java
kääntää kaksi lähdetiedostoa sisäänca / javajeff / audio
. Jos kaikki menee hyvin, sinun pitäisi löytääAudio.luokka
jaWavReader.class
tiedostotaudio-
alihakemisto. (Vaihtoehtoisesti tässä esimerkissä voit vaihtaaaudio-
alihakemisto ja suoritajavac * .java
.)
Nyt kun olet luonut äänikirjaston, haluat käyttää sitä. Pian tarkastelemme pientä Java-sovellusta, joka osoittaa tämän kirjaston. Ensin on opittava tuontilausekkeesta.
Java-tuontilausunto
Kuvittele, että sinun on määritettävä ca. javajeff grafiikka. kolmio
jokaisesta esiintymisestä Kolmio
lähdekoodissa toistuvasti. Java tarjoaa tuontilausekkeen käteväksi vaihtoehdoksi jättää pois pitkät pakettitiedot.
Tuontilauseke tuo tyyppejä paketista kertomalla kääntäjälle, mistä etsiä pätevöimätön (ei paketin etuliitettä) -tyyppien nimet käännöksen aikana. Se näkyy lähdetiedoston yläosassa ja sen on noudatettava seuraavaa syntaksia:
tuonti tunniste[.tunniste]*.(typeName | *);
Tuontilauseke alkaa varatulla sanalla tuonti
ja jatkuu tunnisteella, jota valinnaisesti seuraa jaksoittain erotettu tunnisteiden sekvenssi. Tyypin nimi tai tähti (*
) seuraa, ja puolipiste lopettaa tämän lauseen.
Syntaksi paljastaa tuontilausekkeen kaksi muotoa. Ensin voit tuoda yhden tyyppinimen, joka tunnistetaan typeName
. Toiseksi voit tuoda kaikki tyypit, jotka tunnistetaan tähdellä.
*
symboli on jokerimerkki, joka edustaa kaikkia luokittelemattomia tyyppinimiä. Se kehottaa kääntäjää etsimään tällaisia nimiä tuontilausekkeen pakettijärjestyksen oikeassa reunassa olevasta paketista, ellei tyypin nimeä löydy aiemmin haetusta paketista. Huomaa, että jokerimerkin käytöstä ei seuraa suoritusrangaistusta eikä se johda koodin turpoamiseen. Se voi kuitenkin johtaa nimiristiriitoihin, jotka näet.
Esimerkiksi, tuoda ca.javajeff.graafisia kuvia.Triangle;
kertoo kääntäjälle, että pätemätön Kolmio
luokka on olemassa ca. javajeff grafiikka
paketti. Samoin jotain
tuoda noin. javajeff-grafiikkaa. *;
käskee kääntäjän etsimään tätä pakettia kohdatessaan a Kolmio
nimi, a Ympyrä
nimi tai jopa Tili
nimi (jos Tili
ei ole jo löydetty).
Vältä * monikehittäjäprojekteissa
Kun työskentelet monikehittäjäprojektissa, vältä *
jokerimerkki, jotta muut kehittäjät näkevät helposti, mitä tyyppejä lähdekoodissasi käytetään.