Mitä pääsyn muokkaajia on Javassa. Javan muokkaukset: staattinen, lopullinen, abstrakti, synkronoitu, ohimenevä, epävakaa

Täällä yritämme tarkastella lähes kaikkia käyttöoikeusmuutosten käyttötapauksia. Ainoa poikkeus on niiden käyttö sisäkkäisiin ( sisäkkäinen) ja sisäinen ( sisäinen) -luokille sekä käyttöliittymille, koska emme ole vielä käsitelleet näitä aiheita.

Pääsymuuttajien yhteydessä käytettävät luokat ja paketit toimivat kapselointivälineinä, eli keinona piilottaa toteutusyksityiskohdat yksinkertaisen käyttöliittymän taakse.

Pääsymääritteitä voidaan soveltaa sekä luokkiin että niiden jäseniin - kenttiin ja menetelmiin. Pääsymääritteitä on yhteensä neljä, ja tässä annamme niistä lyhyen kuvauksen, jonka jälkeen tarkastelemme kutakin yksityiskohtaisesti.

  • julkinen- mikä tahansa komponentti, joka on ilmoitettu nimellä julkinen, käytettävissä millä tahansa koodilla
  • suojattu- mahdollistaa pääsyn paketin komponenttiin ja luokkiin jälkeläisille
  • yksityinen- mahdollistaa pääsyn luokan komponentteihin
  • oletuksena(ei avainsanaa) - mahdollistaa pääsyn paketin komponentteihin

Jälkeläisluokat ovat luokasta perittyjä luokkia. Perintöä, jota emme ole vielä tutkineet.

Pääsy luokkiin

Oletuksena huipputason luokat ovat saatavilla paketissa, jossa ne on määritetty.. Kuitenkin, jos huippuluokan luokka on ilmoitettu julkinen, niin se on saatavilla kaikkialla (tai missä itse paketti on saatavilla). Olemme rajoittaneet tämän lausunnon ylätason luokkiin, koska luokat voidaan ilmoittaa muiden luokkien jäseniksi. Koska nämä sisäiset luokat ovat luokan jäseniä, niihin sovelletaan luokan jäsenten pääsynvalvontasääntöjä..

Pääsy luokan jäsenille

Luokan jäsenet ovat aina tavoitettavissa luokan sisällä. Oletus luokan jäsenet ovat myös saatavilla paketissa, jossa luokka on määritelty.

julkinen muokkaus

Sisäkkäiselle luokalle voidaan määrittää vain toinen kahdesta mahdollisesta käyttöoikeustasosta: annettu oletuksena ja julkinen . Kun luokka on ilmoitettu julkinen, sen pitäisi olla ainoa julkinen luokka, joka on ilmoitettu tiedostossa, ja tiedostonimen on vastattava luokan nimeä.

Miten julkinen luokat, kentät, menetelmät ja konstruktorit voidaan ilmoittaa.

suojattu muuntaja

Keskustelemme tästä modifikaattorista yksityiskohtaisesti luokan periytymisen aiheessa. Jos periytymistä ei käytetä, tämä muokkaus toimii, aivan kuten oletusmuunnin.

Ainoa asia, joka voidaan nyt lyhyesti sanoa, on, että komponenteille, jotka on ilmoitettu nimellä suojattu, on pääsy mikä tahansa lapsiluokka mistä tahansa paketista tai mikä tahansa luokka samasta paketista.

Miten suojattu kentät, menetelmät, rakentajat, sisäkkäiset luokat ja sisäkkäiset rajapinnat voidaan ilmoittaa.

suojattu .

yksityinen muokkaaja

Tämä on rajoittavin pääsyn muokkaaja. Elementit, jotka on ilmoitettu yksityinen saatavilla vain samalla luokalla, ei kenellekään luokan ulkopuolisille.

Miten yksityinen kentät, menetelmät, rakentajat, sisäkkäiset luokat ja sisäkkäiset intressit voidaan ilmoittaa.

Huipputason luokkia ja rajapintoja ei voida ilmoittaa yksityinen .

Pääsymääritykset ovat pohjimmiltaan yksinkertainen aihe, mutta palaamme siihen myöhemmin. Toistaiseksi se oli vain esittely. Ja nyt vähän harjoittelua...

Tein Mod02.java-, DefMod.java-, ProMod.java- ja PrvMod.java-luokat, jotka kuuluvat pro.java.pkg002-pakettiin, sekä PubMod.java-luokan, joka kuuluu pro.java.pkg003-pakettiin. Seuraavaksi annan vain kuvakaappauksia näistä luokista ja ohjelman tuloksesta:

Java-kieli tarjoaa monia muuntajia, jotka on jaettu seuraaviin luokkiin:

  • pääsyn muokkaaja
  • Ei-pääsy-muokkaus

Muuntajaa käytetään määrittämään luokka, menetelmä tai muuttuja, yleensä lauseen eturintamassa. Havainnollistavan seuraavan esimerkin kautta:

julkinen luokka luokanNimi ( // ... ) yksityinen boolean myFlag; staattinen viimeinen kaksoisviikko = 9,5; suojattu staattinen lopullinen int BOXWIDTH = 42; public static void main(merkkijonoargumentit) ( // 方法体 )

Kulunvalvontamuunnin

Java, voit käyttää pääsynhallintamerkkejä suojataksesi pääsyä luokkiin, muuttujiin, menetelmiin ja rakentajiin. Java tukee neljää erilaista käyttöoikeutta.

Oletus, joka tunnetaan myös oletuksena oletuksena, näkyvät samassa paketissa, älä käytä modifioijia.

Yksityinen määritetylle yksityinen samassa luokassa näkyvä muuntaja.

Kyllä, osoittamaan yleistä muokkaus näkyy kaikille luokille.

suojattu, sisään suojattu modifier määrittää, että kaikki saman paketin luokat ja alaluokat ovat näkyvissä.

Oletusarvoinen käyttöoikeusmuutos - älä käytä avainsanoja

Käytä muuttujia ja menetelmiä, jotka on ilmoitettu samassa näkyvässä paketissa olevan luokan oletuskäyttöoikeusmuuntimessa. Liitäntä, jossa muuttujat ilmoitetaan implisiittisesti julkisiksi staattisiksi lopullisiksi, ja käyttöliittymä, jossa oletusarvoinen aksessorimenetelmä on julkinen.

Seuraavan esimerkin lauseessa muuttujat ja menetelmät eivät voi käyttää mitään muuntajaa.

Merkkijonoversio = "1.5.1"; boolean processOrder() ( palauttaa tosi; )

Yksityinen pääsyn muokkaaja - yksityinen

Yksityinen pääsy modifier, on kaikkein rajoittavin käyttöoikeustaso, se on julistettu yksityisiksi menetelmiksi, muuttujiksi ja kuuluu rakentajaluokkaan pääsee vain käsiksi, mutta luokkia ja rajapintoja ei voida julistaa yksityisiksi.

Yksityiseksi pääsytyypeiksi ilmoitettuihin muuttujiin pääsee käsiksi vain luokan ulkopuolelta luokan public getter -metodin kautta.

Yksityisen pääsyn muokkaajaa käytetään ensisijaisesti luokan takana olevien toteutustietojen ja tietojen suojaamiseen.

Seuraavat luokat käyttävät yksityisen käyttöoikeuden muokkaajaa:

Julkinen luokkaloggeri ( yksityinen merkkijonomuoto; julkinen merkkijono getFormat() ( palauttaa tämä.muoto; ) public void setFormat(merkkijonomuoto) ( this.format = muoto; ) )

Esimerkiksi Logger-luokan muuttujamuoto on yksityinen muuttuja, joten muut luokat eivät voi suoraan saada ja asettaa muuttujan arvoa. Toisen luokkamuuttujan käyttäminen määrittelee kaksi julkista menetelmää: GetFormat() (palautusarvon muoto) ja SetFormat(String) (muotoasetus).

Avoimen pääsyn muokkaaja -julkinen

Se on ilmoitettu julkisiksi luokiksi, menetelmiksi, rakentajiksi ja liitännät voivat olla minkä tahansa muun tyyppisiä käyttöoikeuksia.

Jos useita yhteisiä käyntejä julkisissa luokissa eri paketeissa, sinun on tuotava vastaava julkinen luokkapaketti pysyvästi. Koska luokka periytyy, kaikkien julkisten menetelmien ja muuttujien luokka voidaan periä sen alaluokilla.

Seuraavat ominaisuudet käyttävät julkista pääsynhallintaa:

Julkinen staattinen void main(merkkijonoargumentit) ( // ... )

Java-ohjelman päämenetelmä () on asetettava julkisesti, muuten Java-tulkki ei pysty ajamaan luokkaa.

Suojatut käyttöoikeudet suojatut

Saman paketin suojatuiksi määritetyillä menetelmillä ja rakentajilla voi olla minkä tahansa muun tyyppinen käyttöoikeus, ja niitä voidaan käyttää eri paketeissa alaluokittain.

Suojattua pääsymuuttujaa ei voi muokata luokilla ja liitännöillä, metodit ja jäsenmuuttujat voidaan julistaa suojatuiksi, mutta rajapintojen muuttujia ja jäsenmetodeja ei voida julistaa suojatuiksi.

modifier Alaluokat voivat käyttää ilmoitettuja suojattuja menetelmiä ja muuttujia, joten voimme suojata toisiinsa liittymättömiä luokkia käyttämällä näitä menetelmiä ja muuttujia.

Seuraava pääluokka käyttää suojattua käyttöoikeusmuunninta, joka aliluokat ohittaa pääluokan openSpeaker()-metodin.

Luokka AudioPlayer ( suojattu boolean openSpeaker(Speaker sp) ( // 实现细节 ) ) luokka StreamingAudioPlayer ( boolean openSpeaker(Speaker sp) ( // 实现细节 ) )

Jos openSpeaker()-metodi on julistettu yksityiseksi, se ei voi käyttää menetelmää AudioPlayer-luokan lisäksi. Jos openSpeaker() on julkinen, kaikilla luokilla on mahdollisuus käyttää menetelmää. Jos haluamme tehdä prosessin näkyväksi luokan alaluokille, menetelmä julistetaan suojatuksi.

Kulunvalvonta ja perintö

Huomaa, että seuraavat menetelmät ovat periytyneet säännöt:

    Myös alaluokassa julkisiksi menetelmiksi määritellyn yläluokan on oltava julkinen.

    Class Parent on julistettu suojatuksi menetelmäksi alaluokassa, suojatuksi tai julkisesti. Sinua ei voi julistaa yksityiseksi.

    Yksityiseksi menetelmäksi ilmoitettua yläluokkaa ei voi periä.

Ei-pääsy-muokkaus

Monien muiden ominaisuuksien saavuttamiseksi Java tarjoaa myös joukon muokkaajia ilman pääsyä.

staattista modifioijaa käytetään luomaan luokkamenetelmiä ja luokkamuuttujia.

Lopullinen modifioija, jota käytetään koristelemaan luokkia, menetelmiä ja muuttujia, lopullista muokattua luokkaa ei voi periä, modifioitua luokkamenetelmää ei voi periä ohittaa, muokattuja vakiomuuttujia ei voi muuttaa.

Abstraktia muokkaajaa käytetään abstraktien luokkien ja abstraktien menetelmien luomiseen.

Synkroniset ja haihtuvat modifioijat, pääasiassa ohjelmointivirtojen ohjelmointiin.

Staattinen muuntaja

    Staattiset muuttujat:

    Staattista avainsanaa käytetään ilmoittamaan staattiset muuttujat, jotka eivät ole riippuvaisia ​​objektista, riippumatta luokan esiintymäobjekteista, se on vain yksi kopio staattisesta muuttujasta. Staattiset muuttujat tunnetaan myös luokkamuuttujina. Paikallisia muuttujia ei voida ilmoittaa staattisiksi muuttujiksi.

    Staattiset menetelmät:

    Staattista avainsanaa käytetään määrittelemään objekti staattisesta menetelmästä riippumattomaksi. Staattiset menetelmät eivät voi käyttää ei-staattista muuttujaluokkaa. Staattinen menetelmä tietojen saamiseksi parametriluettelosta ja laskea tiedot.

Pääsyä luokkamuuttujiin ja menetelmiin voidaan käyttää suoraan luokannimi.muuttujannimi ja luokannimi.metodinnimi käyttöoikeuksilla.

Seuraavassa esimerkissä staattista muuntajaa käytetään luomaan luokkamenetelmiä ja luokkamuuttujia.

Julkinen luokka InstanceCounter ( yksityinen staattinen int numInstances = 0; suojattu staattinen int getCount() ( palauttaa numInstances; ) yksityinen staattinen void addInstance() ( numInstances++; ) InstanceCounter() ( InstanceCounter.addInstance(); ) julkinen staattinen void main(merkkijonoargumentit) ) ( System.out.println("Alkaen " + InstanceCounter.getCount() + " esiintymät"); for (int i = 0; i< 500; ++i){ new InstanceCounter(); } System.out.println("Created " + InstanceCounter.getCount() + " instances"); } }

Esimerkkejä yllä olevista muokkaustuloksista seuraavasti:

Aloitettu 0 esiintymällä Luotu 500 esiintymää

Lopullinen luokitin

Lopulliset muuttujat:

Lopulliset muuttujat voidaan alustaa eksplisiittisesti, ja ne alustetaan vain kerran. Hakemisto on ilmoitettu lehtiobjektiksi, joka ei voi osoittaa toiseen objektiin. Mutta lopputavoite on se, missä tietoja voidaan muuttaa. Tämä on viimeinen viittaus objektiin, jota ei voi muuttaa, mutta jonka arvoa voidaan muuttaa.

Lopullista muuntajaa käytetään yleensä yhdessä luomaan staattinen muuntajaluokkavakio.

Julkinen luokka Testi(lopullinen int arvo = 10; // 下面是声明常量的实例 public static final int BOXWIDTH = 6; static final String TITLE = "(!LANG:Manager"; public void changeValue(){ value = 12; //将输出一个错误 } } !}

Lopullinen menetelmä

Kohdeluokan menetelmät perivät alaluokat, mutta alaluokat eivät voi muokata niitä.

Metodin päätarkoituksena on estää menetelmän lopullisen lausunnon muuttaminen.

Kuten alla näytetään, käyttämällä ilmoituksen muokkaajan lopetusmenetelmiä.

Julkinen luokkatesti( public final void changeName()( // 方法体 ))

viimeinen luokka

Lopullisia luokkia ei voi periä, mikään luokka ei voi periä mitään lopullisen luokan ominaisuuksia.

Julkinen loppukoe ( // 类体 )

Abstrakti muuntaja

Abstrakti luokka:

Abstraktia luokkaa ei voida käyttää objektin ilmentämiseen, lausunnon ainoa tarkoitus on abstraktoida luokka luokan tulevaa laajentamista varten.

Luokkaa ei voi muuttaa abstraktiksi ja lopulliseksi. Jos luokka sisältää abstrakteja menetelmiä, luokka on ilmoitettava abstraktiksi luokaksi, muuten kääntäjävirhe.

Abstrakti luokka voi sisältää abstrakteja menetelmiä ja ei-abstrakteja menetelmiä.

Abstraktiluokka Caravan( yksityinen tuplahinta; yksityinen merkkijonomalli; yksityinen merkkijono vuosi; julkinen abstrakti void goFast(); //抽象方法 julkinen abstrakti void changeColor(); )

Abstrakti menetelmä

Mikään metodi ei ole abstrakti menetelmätoteutus, alaluokkien tarjoama konkreettinen menetelmätoteutus. Abstrakteja menetelmiä ei voida julistaa lopullisiksi ja tiukoiksi.

Jokaisen abstraktin luokan perivän alaluokan tulee toteuttaa kaikki emoluokan abstraktit menetelmät, ellei alaluokka ole abstrakti luokka.

Jos luokka sisältää useita abstrakteja menetelmiä, luokka on ilmoitettava abstraktiksi luokaksi. Abstrakti luokka ei voi sisältää abstrakteja menetelmiä.

Abstrakti menetelmän määrittely päättyy puolipisteeseen, esimerkiksi: public abstrakti kuvio ();

Julkinen abstrakti luokka SuperClass( abstract void m(); //抽象方法 ) luokka Alaluokka laajentaa SuperClass( //实现抽象方法 void m()( ......... ) )

Synkroninen muuntaja

Synkroninen avainsanamenetelmä ilmoittaa samaan aikaan vain yhden säikeen pääsyn. Synkronista muuntajaa voidaan soveltaa neljään pääsyn muokkaajaan.

julkinen synkronoitu void showDetails()( ....... )

Siirtymämuunnin

Serialisoitu objekti sisältää Java Virtual Machine (JVM) -ilmentymän transienttimuuttujia, jotka on muokattu ohittamaan kyseinen muuttuja.

Muuntaja sisältyy lausemuuttujien määritelmään tietotyyppien ja muuttujien esikäsittelyä varten.

julkisen transientin int raja = 55; // ei säily julkisesti int b; // säilyy

Haihtuvat modifioijat

Haihtuva muokattu jäsenmuuttuja joka kerta, kun sitä käytetään, säikeet pakotetaan lukemaan jäsenmuuttujan arvo uudelleen jaetusta muistista. Myös jäsenmuuttujien muuttuessa säiettä on pakko muuttaa jaettuun muistiin kirjoitettu arvo. Joten milloin tahansa kaksi eri säiettä näkevät aina saman jäsenmuuttujan arvon.

Julkinen luokka MyRunnable toteuttaa Runnable ( yksityinen haihtuva boolean aktiivinen; public void run() ( aktiivinen = tosi; while (aktiivinen) // 第一行 ( // 代码 )) public void stop() ( aktiivinen = false; // 第二行) )

Normaalioloissa säie kutsuu Suorita () -menetelmää (avoimen säikeen Runnable) toisessa säikeessä stop () -menetelmää. Jos aktiivinen arvo on ensimmäinen linja puskuria käytetään toinen rivi kun aktiivinen silmukka on epätosi, se ei pysähdy.

Yllä olevassa koodissa käytämme kuitenkin muokattua haihtuvaa aktiivisuutta, joten silmukka pysähtyy.

Muokkausluokka
Modifier-luokka koodaa kaikki muuntajat
käytetään tyyppiilmoituksissa, lomakkeessa
vakiot:
TIIVISTELMÄ, LOPULLINEN, LIITTYMÄ, NATIIVINEN,
YKSITYINEN, SUOJATTU, JULKINEN, STAATTINEN,
tiukka, SYBKRONISOITU, SIIRTYVÄINEN,
HAILUVA.
Jokainen vakio vastaa lomakkeen pyyntömenetelmää
isMod (int modifier) ​​​​(tässä Mod on yksi yllä olevista
etunimet, esimerkiksi isPublic),
joka palauttaa tosi, jos muuntaja
mod on läsnä tyyppiselvityksessä.

Harkitse esimerkkiä. Anna olla
kenttäilmoitus
julkinen staattinen lopullinen int s=10;
sitten menetelmän palautusarvo
getModifiers vastaavan objektin
Field-luokan näyttää
Modifier.PUBLIC | Modifier.STATIC |
Modifier.FINAL
strictfp-muokkaus tulee näkyviin
jatkuva TIIKAA.
Pyyntömenetelmiä voidaan käyttää
seuraavaa lomaketta

Modifier.isPrivate(field.getModifiers());
tämä vastaa seuraavaa ehtoa
(field.getModifiers()&Modifier.PRIVATE)!=0
Kenttäluokka
Field-luokka toteuttaa menetelmiä
pyytää tietoja aiheesta
kentän tyyppi sekä lukea ja asettaa se
merkitys.
Harkitse joitain Field-luokan menetelmiä
1. getType() - palauttaa luokkaobjektin
Nykyisen kentän tyyppiä vastaava luokka.
Esimerkiksi int-tyypin kentälle saamme
int luokka

2. Methods set and get - voit lukea
kentän nykyinen arvo sekä aseta uusi.
Harkitse esimerkkiä:
julkinen staattinen void printField(Object o,
merkkijonon nimi) heittää
NoSuchFieldException,
IllegalAccessException(
kenttäkenttä = o.getClass().getField(nimi);
Lyhyt arvo = (lyhyt) kenttä.get(o);
System.out.println(arvo);
}
Nuo. get-metodi palauttaa arvon, joka
viittaa vastaavaan kenttään tai objektiin
kuoriluokka.
Esimerkki set-menetelmän käytöstä näyttää tältä:

public static void setField(Object o, merkkijonon nimi,
lyhyet nv) heitot
NoSuchFieldException,
IllegalAccessException(
Kenttäkenttä = o.getClass().getField(nimi) ;
field.set(o,new Short(nv));
}
Tallentaaksesi nv:n tämän objektin kenttään
kääreluokkia on käytettävä.
On myös menetelmiä, jotka näyttävät
getPrimitiveType (esim. getInt) ja
setPrimitiveType. Nämä menetelmät voivat
käytä luokan kenttien vaihtamiseen,
jolla on primitiivinen tyyppi. Esimerkiksi,
field.setShort(o,nv);

Menetelmäluokka
Method-luokan välineet - voit saada
täydelliset tiedot koskien
tietyn luokan menetelmien ilmoitukset,
ja kutsu näitä menetelmiä tarvittaessa
annettujen objektien kontekstissa.
Harkitse Method-luokan menetelmiä.
1. public Class getReturnType() - palauttaa
tyyppiä vastaava Class-objekti
nykyisen menetelmän palauttama arvo.
Jos kirjoita palautuksen sijaan
menetelmän ilmoittama palvelu
sana void, kyseinen menetelmä palaa
void.class objekti.

2. public Class getParameterTypes() - palauttaa

parametrit, jotka on asetettu ilmoituksessa
nykyinen menetelmä. Objektit syötetään taulukkoon
siinä järjestyksessä, jossa parametrit on lueteltu
menetelmän ilmoitus. Jos menetelmä ei
parametrit, palautetaan tyhjä taulukko.
3. public Class getExceptionTypes() - palauttaa
tyyppiä vastaavien luokkaobjektien joukko
ehdotuksessa mainituista poikkeuksista
heittää nykyisen menetelmän ilmoituksen. Objektit
syötetään taulukkoon siinä järjestyksessä, jossa
poikkeustyyppien nimet on lueteltu
menetelmän ilmoitus.

4. julkinen objektin kutsu (Object onThis, Object args)
heittää IllegalAccessExceptionin,
IllegalArgumentException,
InvocationTargetException
Kutsuu nykyisen objektin määrittelemää menetelmää
Menetelmä työtehtävän onThis-objektin yhteydessä
args-taulukon välittämät argumenttiarvot.
Ei-staattisille menetelmille toteutuksen valinta
suoritetaan todellisen tyypin perusteella
onThis-parametrin määrittämä objekti. varten
staattiset menetelmät päälläTätä ei hyväksytä aikana
huomiota ja voi olla tyhjä.
Args-taulukon pituuden on vastattava numeroa
parametrit menetelmän määrittelyssä, ja taulukkoelementtien objektityyppien on oltava määritettävissä
vastaavat menetelmäparametrit - in
muuten tehdään poikkeus
IILegalArgumentException.

10.

Jos osana määriteltyä objektia
onTämä parametri, ei tyyppiä, jäsen
mikä on nykyinen menetelmä,
heitetään poikkeus
IllegalArgumentException.
Jos onThis-arvon arvo on tyhjä ja menetelmä ei ole
staattinen, heittää poikkeuksen kuten
NullpointerException.
Jos kutsutun menetelmän suorittaminen
päättyy epänormaalisti, heitetään pois
poikkeus tyypistä InvocationTargetException.

11.

Harkitse esimerkkiä. Kutsutaan keinoja
heijastusmenetelmä return str.indexOf(".", 8)
sitten meillä on
yrittää(
Сluokka strClass = str.getClass();
Menetelmä indexM = strClass.getMethod("indexOf",
new Class(string.class, int.class));
Objektin tulos = indexM.invoke(str, uusi objekti (
".", uusi lnteger(8)));
return ((Kokonaisluku)tulos).intValue();
}
saalis (NoSuchMethodException e) ( …….. )
saalis (invocationTargetException e) (…….. )
saalis (illegalAccessException e) (……)

12.

Rakentajan luokka
Uusien esiintymien (objektien) luominen
tyyppimenetelmää voidaan käyttää
Luokka-objektin uusi ilmentymä,
vastaavat tätä tyyppiä.
Metodi kutsuu konstruktoria ilman argumentteja,
tyypin omistama ja palauttaa viitteen
luokan Object äskettäin luotuun objektiin,
joka on nimenomaisesti muutettava
vaadittu tyyppi.
Harkitse esimerkkiä.

13.

staattinen kaksoistestiData = ( 0,3, 1,3 e-2, 7,9, 3,17 );

yrittää(
for(int arg = 0; arg< args.length; arg++){
Merkkijonon nimi = args;
Class classFor = Class.forNimi(nimi);
LajitteleKaksoislajittelija =
(SortDouble)classFor.newInstance();
SortMetrics-metriikka = sorter.sort(testData);
System.out.println(nimi + ": " + mittarit);
for(int i =0; i< testData.length; i++)
System.out.println(" " + testiData[i]); ) )
catch(Poikkeus e) ( System.err.println(e); ) )

14.

newlnstance-menetelmä, kun se on virheellinen
sovellus pystyy heittämään ulos suuria
erilaisten poikkeusobjektien määrä
tyypit.
InstantiationException - jos luokka, objekti
joka pitäisi luoda, ei omista
konstruktori ilman argumentteja tai
määritelty abstraktiksi tai in
todellisuus on käyttöliittymä,
tai luontimenettelyn suorittaminen
jokin muu keskeyttää kohteen
syyt.
IllegalAccessException - jos luokka on joko sen
konstruktoria ilman argumentteja ei ole saatavilla.

15.

SecurityException - jos nykyinen käytäntö
turvallisuus kieltää uusien objektien luomisen
ExceptionInitializerError - heitetään kun
luokan alustus.
Constructor-luokassa on määritelty muitakin menetelmiä.
julkinen Сluokka getParameterTypes()

jotka vastaavat parametrityyppejä
määritelty nykyisen rakentajan ilmoituksessa.
julkinen luokka getExceptionTypes()
Palauttaa joukon Class-objekteja,
jotka vastaavat poikkeuksia
määritelty ilmoituksen heittolausekkeessa
nykyinen rakentaja.

16.

julkinen Object new Instance (Object args)
heittää InstantiationExceptionin,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
Käyttää virran edustamaa konstruktoria
luotava ja alustettava konstruktoriobjekti
luokan uusi esiintymä, jossa rakentaja
julisti annetuilla argumenteilla.
Palauttaa viittauksen juuri luotuun ja
alustettu objekti. args-taulukon pituus
on vastattava sisällä olevien parametrien määrää
konstruktorimäärittelyn ja taulukkoelementin objektityyppien on oltava määritettävissä
vastaavat konstruktoriparametrit -
muuten tehdään poikkeus
IllegalArgumentException.

17.

Harkitse esimerkkiä:
classOmaluokka(
yksityinen int a;
julkinen Oma luokka(int k)(a=k;)
julkinen int func(int a,int b)(paluu a+b;)
}
public class Main(
julkinen staattinen void main(String args)(
yrittää(
Stringname="omaluokka";
Luokka mycl=Class.forName(nimi);
luokka d=(int.class);
Rakentaja c=mycl.getConstructor(d);
Omaluokka ob=(Omaluokka)c.newInstance(new Object(
uusi Kokonaisluku(10)));
System.out.println(ob.func(3,5)); )
saalis(poikkeus e)();
}}

18.

AccessibleObject-luokka
Field-, Constructor- ja Method-luokat ovat
johdettu AccessibleObject-luokasta,
mikä mahdollistaa sallimisen tai
poista käyttöoikeuslipun tarkistus käytöstä
kielet, kuten julkinen ja yksityinen.
AccessibleObject-luokassa on menetelmiä
1. public void setAccessible (boolen lippu)
Asettaa objektin pääsylipuksi
argumentin arvon mukaan: tosi
tarkoittaa, että kohdetta ei enää totella
tasolla asetettuja pääsysääntöjä
kieli (ja on aina saatavilla), väärä
pakottaa kohteen säilyttämään määritetyn
käyttöoikeustaso.
Jos oikeudet muuttaa käyttöoikeuslippu
ei riitä, poikkeus heitetään kuin
TurvallisuusPoikkeus

19.

2. julkinen staattinen
void setAccessible(AccessibleObject array,
boolen lippu)
Voit asettaa pääsylipun
objektit välitettiin taulukkona.
Jos käsittelyssä seuraava
objekti heittää tyypin poikkeuksen
TurvallisuusPoikkeus, esineet sijaitsevat
taulukossa aiemmin, tallenna uusi joukko
käyttöoikeustason arvot ja kaikki muut
esineet pysyvät samoina.
3. julkinen boolean isAccessible()
Palauttaa pääsylipun nykyisen arvon
esineeseen

20.

Array-luokka
Array-luokkaa käytetään taulukon luomiseen
heijastuskeinoja.
Taulukoiden luomiseen käytetään kahta menetelmää
uusi Instance.
public Object new Instance (Class compType, int pituus)
Palauttaa viittauksen uuteen taulukkoon, jonka tyyppi on compType
annettu pituus pituus.
julkinen objekti uusi ilmentymä (Class compType, int dim)
Palauttaa viittauksen uuteen moniulotteiseen matriisityyppiin
compType, jonka mitat ovat arvojen antamia
taulukon parametrin elementit himmennetään.
Jos taulukon himmennys on tyhjä tai sen pituus on suurempi kuin
sallittu määrä mittoja (yleensä 255),

LegalArgumentException.

21.

Harkitse esimerkkejä.
Esimerkki1. Muodostetaan tavutyyppinen taulukko
ba = (tavu)
Array.newInstance(byte.class,13);
Tämä on vastaava
ba = uusi tavu;
Esimerkki2.
int dims = (4, 4);
kaksoimatriisi = (kaksois)
Array.newInstance(double.class, dims);
Tämä on vastaava
kaksoismatriisi = uusi kaksois;

22.

Array-luokassa on get and set -menetelmät.
Olkoon int-tyyppisten arvojen taulukko xa; sitten
lauseke xa[i] vastaa:
Kokonaisluku n=Array.get(xa, i)
Voit määrittää taulukon elementille arvon seuraavasti:
xa[i] = 23; on sama kuin
Array.set(xa, i, new Integer(23));
Pakettiluokka
Class-luokan getPackage-metodin kutsuminen sallii
hanki luokan Paketti objekti, joka sisältää
Kuvaus paketista, joka sisältää
luokka (itse pakettiluokka sijaitsee paketissa
java.lang).
Package-objektin getName()-metodi palauttaa
nykyisen paketin koko nimi.

23.

Välityspalvelinluokka
Proxy-luokan avulla voit luoda dynaamisesti
luokat, jotka toteuttavat yhden tai useamman
käyttöliittymät.
Oletetaan, että meillä on luokka A,
joidenkin rajapintojen toteuttaminen.
Java-kone ajon aikana voi
luoda välityspalvelinluokka annetulle
luokka A, ts. luokka, joka
toteuttaa kaikki luokan A rajapinnat, mutta
korvaa kaikkien näiden menetelmien kutsumisen
käyttöliittymät kutsumenetelmän kutsumiseen,
käyttöliittymä InvocationHandler, varten
jonka voit määritellä omasi
toteutus.

24.

Välityspalvelinluokka luodaan menetelmäkutsulla
Proxy.getProxyClass, joka ottaa Classloaderin ja
joukon rajapintoja (rajapintoja) ja palauttaa objektin
luokka java.lang.Class joka on ladattu
hyväksytyn ClassLoaderin ja toteuttaa hyväksytyn taulukon
käyttöliittymät.
Läpäistyille parametreille on useita rajoituksia:
1. Kaikkien rajapintataulukon objektien on oltava
käyttöliittymät. Ne eivät voi olla luokkia tai
primitiivit.
2. Liitäntätaulukossa ei voi olla kahta identtistä
esineitä.
3. Kaikkien rajapintojen rajapintojen on oltava
menetelmälle välitettävä ClassLoader lataa
getProxyClass.
4. Kaikki ei-julkiset rajapinnat on määriteltävä
samassa paketissa, muuten luotu välityspalvelinluokka
ei voi toteuttaa niitä kaikkia.

25.

5. Kahta rajapintaa ei voi olla
menetelmä samalla nimellä ja
parametrin allekirjoitus, mutta erilainen
palautustyypit.
6. Liitäntätaulukon pituus on rajoitettu
65535 liitännät. Ei Java-luokkaa
ei voi toteuttaa enempää kuin 65535
käyttöliittymät.

26.

Dynaamiset välityspalvelimen ominaisuudet
1. Välityspalvelinluokka on julkinen edellyttäen
viimeinen muuntaja eikä ole abstrakti.
2. Oletusvälityspalvelinluokan nimi ei ole
määritelty, mutta alkaa välityspalvelimella. Kaikki
välityspalvelimella alkava nimiavaruus
varattu proxy-luokille
(Tätä ei vaadita Javan uusimmissa versioissa.)
3. Välityspalvelinluokka on peritty
java.lang.reflect.Välityspalvelin.
4. Välityspalvelinluokka toteuttaa kaikki rajapinnat,
siirretty luomisen yhteydessä siirtojärjestyksessä.

27.

5. Jos välityspalvelinluokka toteuttaa ei-julkisen
käyttöliittymä, se luodaan kyseisessä paketissa,
joka määrittelee tämän kaikkein ei-julkisen
käyttöliittymä. Yleensä paketti, joka
välityspalvelinluokka undefined luodaan.
6. Menetelmä Proxy.isProxyClass palauttaa true for
kanssa luodut luokat
Proxy.getProxyClass ja objektiluokille,
luotu sovelluksella Proxy.newProxyInstance ja
vääriä muuten.
Tätä menetelmää käyttää alajärjestelmä
Java-suojaus ja sinun on ymmärrettävä se
luokka, joka on yksinkertaisesti peritty
java.lang.reflect.Välityspalvelin palauttaa false.

28.

Välityspalvelinluokan luodun esiintymän ominaisuudet ovat seuraavat:
1. Välityspalvelinluokan objekti välitetään kaikkiin liitäntöihin,
välitetty käyttöliittymätaulukossa. Jos IDemo on yksi
hyväksytyistä liitännöistä, sitten toimintovälityspalvelininstanssi
IDemo palauttaa aina true, kun taas (IDemo) välityspalvelintoiminto
päättyy oikein.
2. Staattinen menetelmä Proxy.getInvocationHandler
palauttaa luomisen yhteydessä välitetyn puhelunkäsittelijän
välityspalvelinluokan esiintymä. Jos siirretään tähän
Metodiobjekti ei siis ole välityspalvelinluokan esiintymä
IllegalArgumentException-poikkeus heitetään.
3. Puhelunkäsittelijäluokka toteuttaa rajapinnan
InvocationHandler, joka määrittää kutsumenetelmän,
jolla on seuraava allekirjoitus:
public Object invoke (Object proxy, Method method,
Object args) heittää Heitettävä

29.

Harkitse esimerkkiä:
pakettijavasovellus3;
käyttöliittymä Tili(
double getBalance();
void changeBalance(int summa);
tyhjä prosentti (kaksi per);)
luokka MyAccount toteuttaa tilin(
yksityinen kaksinkertainen tasapaino;
julkinen OmaTili()(saldo=0.0; )
julkinen double getBalance()(palautussaldo; )
julkinen void muutosSaldo(in summa)(
saldo+=summa ;)
julkinen tyhjä prosentti (kaksois per)(
saldo+=saldo*/100; ); )

30.

luokan MyAccountProxy toteuttaa
InvocationHandler(
yksityinen tili ac;
julkinen MyAccountProxy(Tilitili)(ac=acc; )
julkinen staattinen tili uusi ilmentymä(tili da)(
return (Account)Proxy.newProxyInstance(
da.getClass().getClassLoader(),
da.getClass().getInterfaces(),
uusi MyAccountProxy(da));
}

31.

public Object Invoke (Objektivälityspalvelin,
Method method, Object args)
heittää heitettävissä(
if(method.getName()=="prosenttia")(
double d=((Double)args).doubleValue();
jos (d<0) d=0;
jos(d>30) d=30;
args=new Double(d);

muu(
return method.invoke(ac, args); )
}
}

32.

public class Main(
julkinen staattinen void main(String args)(
MyAccountma=uusi OmaTili();
tili
a=(Account)MyAccountProxy.newInstance(ma);
a.changeBalance(150);

a.prosenttia(20);
System.out.println(a.getBalance());
a.prosenttia(35);
System.out.println(a.getBalance());) )

33.

Ladataan luokkia
Ajonaikainen järjestelmä lataa luokat tarpeen mukaan.
niiden tarve.
Käynnistysmenettelyjen toiminnalliset ominaisuudet
luokat riippuvat olennaisesti
Java-virtuaalikoneiden toteutus, mutta sisään
useimmissa tapauksissa löytää luokkia,
sovelluksessa osoitettu, mutta ei ladattu
toimeenpanojärjestelmää, mekanismia sovelletaan
katsomalla luokan hakupolkua.
Voit luoda sovelluksen, joka voi
ladata luokat muilla tavoilla kuin
oletuksena tarjotaan, pitäisi
käytä ClassLoader-luokan objektia,
pystyy saamaan halutun toteutuksen tavukoodin
luokkaa ja lataa se ajon aikana
järjestelmät.

34.

ClassLoader-luokka on abstrakti luokka.
Luodaksesi oman luokkalataimen,
sinun on luotava luokka, joka perii
ClassLoader ja ohitusmenetelmä
suojattu luokka findClass(merkkijonon nimi) heittää
ClassNotFoundException
Joka löytää tietyn luokan tavukoodin
nimetty nimi ja lataa tiedot ympäristöön
virtuaalikone, palauttaa Class-objektin,
edustaa löydettyä luokkaa.
Latausobjekti voi delegoida
luvat ladata luokkia "vanhempi"
luokan latauslaite (emoluokan latausohjelma).
"Vanhempi" luokkalataaja voi olla
annettu luokan konstruktoriargumenttina
luokan kuormaaja.

35.

suojattu ClassLoader()
Luo implisiittisesti ClassLoader-objektin
käyttää "vanhempana"
luokan loader järjestelmän kuormaaja
(joita saa kautta
kutsumalla getSystemClassLoader-metodia).
suojattu ClassLoader (ClassLoader-emo)
Luo ClassLoader-objektin käyttämällä
annettu "vanhempi" luokkalataaja.
ClassLoader-luokan pääosa
on loadClass-menetelmä

36.

public Сlass loadClass(merkkijonon nimi) heittää
ClassNotFoundException
palauttaa Class-objektin luokalle, jolla on annettu
nimi ja valinnaisesti lataa tämä
Luokka. Jos luokkaa ei voi ladata,
tyypin poikkeus heitetään
ClassNot FoundException.
Metodin tarjoama luokan latauskaavio
loadClass oletuksena ja yleensä ei
ohitus näyttää tältä:
1. Tarkista menetelmäkutsulla
findLoadedClass of Class ClassLoader, ei
onko annettu luokka ladattu aiemmin; osana
ClassLoader toimitti objektitaulukon
Luokka kaikille luokille ladattu keinoin
nykyinen luokan latauslaite; jos luokka oli
ladattu aiemmin, findLoadedClass-menetelmä
palauttaa viittauksen olemassa olevaan luokkaobjektiin;

37.

2. jos luokkaa ei ladattu, se kutsutaan
"Parent" loaderin loadClass
luokat; jos nykyinen käynnistyslatain ei ole
on "vanhempi", käytetään
järjestelmä luokan kuormaaja;
3. jos luokkaa ei vieläkään ole ladattu,
kutsutaan findClass-menetelmää, joka suorittaa
haku ja luokan lataus.
Siksi se on tarpeen toteuttaa
omat versiot seuraavista menetelmistä
luokkalataaja:

38.

suojattu synkronoitu luokka
loadClass(merkkijonon nimi, looginen ratkaisu)

suojattu luokka findClass (merkkijonon nimi)
heittää ClassNotFoundExceptionin
suojattu java.net.URL findResource(merkkijonon nimi)
suojattu java.util.Enumeration
findResources(merkkijonon nimi) heittää IOExceptionin
(Abstrakti luokka ClassLoader edustaa
vain loadClass-menetelmän toteutus, joka perustuu
suojatuissa menetelmissä - findLoadedClass ja findClass).

39.

Harkitse esimerkkiä.
class PlayerLoader laajentaa ClassLoader(
public Class findClass(merkkijonon nimi) heittää
classNotFoundException(
yrittää(
byte buf = bytesForClass(nimi);
return defineClass(nimi, buf, 0, buf.pituus);
}
saalis(IOPoikkeus e)(
heittää uusi ClassNotFoundException(e.toString());
}
}
// ... BytesForClass-menetelmän ja muiden ilmoitukset
menetelmiä
}

40.

FindClass-menetelmällä on yleensä kaksi asiaa
toimintoja.
Ensin sen on tunnistettava tavukoodi
annetusta luokasta ja tallenna se taulukkoon
tavutyyppi - tämä velvollisuus esimerkissä
määritetty bytesForСlass-menetelmälle.
Toiseksi se käyttää käytettyä menetelmää
defineClass tehdä todellisen
ladataan tavukoodin määrittelemä luokka.
defineСlass-menetelmä näyttää tältä

41.

suojattu lopullinen Luokka defineClass(merkkijonon nimi,
tavudata, int offset, int pituus) heittää
ClassFormatError
Palauttaa Luokka-objektin luokasta, jolla on annettu nimi
nimi; luokan binääriesitys välitetään
taulukkotietona.
Luokan lataamiseen käytetään vain tavuja,
sisältyvät tietotaulukon elementteihin indekseillä
offsetista offsettiin+pituus. Jos tavut määritetystä
aukot eivät täytä vaadittua muotoa
luokkailmoitukset, poikkeusobjekti heitetään
tyyppiä ClassFormatError.
Metodi vastaa viittauksen ylläpitämisestä objektiin
Luokka ladatulle luokalle ladatussa taulukossa
luokat haettiin findLoadedClass-metodilla.

42.

Harkitse bytesForClass-menetelmää.
suojattu tavu bytesForClass(merkkijonon nimi) heittää
lOException, ClassNotFoundException(
FileInputStream in = null;
yrittää(


if (pituus == 0) heittää uusi ClassNotFoundException(nimi);
tavu buf = uusi tavu;

paluu puskuri;
}
vihdoin (
if (in!=null) in.close();
}
}

43.

Joten täydellinen koodi näyttää tältä:
tuonti java.lang.reflect.*;
tuo java.io.*;
class MyClassLoader laajentaa ClassLoader(
julkinen luokkafindClass(merkkijonon nimi) heittää
classNotFoundException(
byte buf=ReadFromBuffer(nimi);
if(nimi.equals("Oma käyttöliittymä1"))(

) else if(buf==null) (
return findSystemClass(nimi);
) muu (
return defineClass(nimi,buf,0,buf.pituus);
}
}

44.

suojattu tavu ReadFromBuffer(merkkijonon nimi) heittää
classNotFoundException(
FileInputStream in = null;
yrittää(
in = new FileInputStream(nimi + ".luokka");
int pituus = in.available(); // käytettävissä olevien tavujen määrä
jos (pituus == 0) heittää
uusi ClassNotFoundException(nimi);
tavu buf = uusi tavu;
in read(buf); // Lue tavuja
paluu puskuri;
}
catch(FileNotFoundException e)( return null;)
catch(IOException e)(palautus null;)
vihdoin (
try( if (in!=null) in.close(; )
saalis(IOpoikkeus e)( )
}
}

45.

suojattu synkronoitu luokka
loadClass(merkkijonon nimi, looginen ratkaisu) heittää
classNotFoundException(
luokka tulos= findClass(nimi);
if (resolve) solveClass(result);
palauttaa tuloksen;
}
}

46.

julkinen luokka Main1(
julkinen staattinen void main(String args) (
yrittää(
Stringname="omaluokka";
ClassLoader ld=new MyClassLoader();
Luokka cl=Class.forName(nimi, tosi, ld);
Rakentaja s=cl.getConstructor(int.class);
Oma käyttöliittymä1
ob=(OmaInterface1)s.newInstance(
uusi kokonaisluku(8));
System.out.println(ob.func(3,5));
)saalis(poikkeus e)( );
}
}

47.

julkinen käyttöliittymä MyInterface1(
public int func(int a,int b);
}
julkinen luokka Myclass toteuttaa MyInterface1 (
yksityinen int a;
julkinen Oma luokka(int k) ( a=k; )
public int func(int a,int b)( return a+b; )

Hei! Tämän päivän luennossa tutustumme käsitteeseen " pääsyn muokkaajat ja harkitse esimerkkejä heidän kanssaan työskentelystä. Vaikka sana "tutustu" ei olekaan aivan oikea: useimmat niistä ovat jo tuttuja aiemmilta luennoilta. Päivitelläänpä muistoa varmuuden vuoksi pääasiasta. Access Modifiers ovat useimmiten avainsanoja, jotka säätelevät pääsyn tasoa koodisi eri osiin. Miksi "useimmiten"? Koska yksi niistä on asennettu oletuksena, eikä sitä ole merkitty avainsanalla :) Javassa on neljä pääsyn muokkaajaa. Listaamme ne järjestyksessä tiukimmasta "pehmeimpään":

  • yksityinen;
  • suojattu;
  • oletus (paketti näkyvissä);
  • julkinen.
Katsotaan jokaista niistä, päätetään milloin niistä voi olla meille hyötyä ja annetaan esimerkkejä :)

yksityinen muokkaaja


Yksityinen on rajoittavin pääsyn muokkaaja. Se rajoittaa tietojen ja menetelmien näkyvyyden yhteen luokkaan. Tiedät tämän muuntajan luennolta gettereistä ja settereistä. Muistatko tämän esimerkin? julkinen luokka Kissa ( julkinen merkkijonon nimi; julkinen int ikä; julkinen keskipaino; julkinen kissa (merkkijonon nimi, int ikä, keskipaino) ( tämä . nimi = nimi; tämä . ikä = ikä; tämä . paino = paino; ) julkinen kissa () ( ) public void sayMeow () ( System. out. println ("Miau!" ) ; ) ) public class Main ( public static void main (String args) ( Cat cat = new Cat () ; cat. name = " " ; kat. ikä = - 1000 ; kat. paino = 0 ; ) ) Käsittelimme sitä yhdessä artikkeleista aiemmin. Tässä teimme vakavan virheen: avasimme tietomme, jonka seurauksena ohjelmoijat pääsivät suoraan luokkakenttiin ja muuttivat niiden arvoa. Lisäksi nämä arvot määritettiin ilman tarkistuksia, minkä seurauksena ohjelmassamme on mahdollista luoda kissa, jonka ikä on -1000 vuotta, nimi "" ja paino 0. Tämän ongelman ratkaisemiseksi me käytetty getterit ja setterit, ja myös rajoitettu pääsy tietoihin käyttämällä yksityistä muokkaajaa. julkinen luokka Kissa ( yksityinen merkkijonon nimi; yksityinen int ikä; yksityinen keskipaino; julkinen kissa (merkkijonon nimi, keski-ikä, sisäpaino) ( tämä . nimi = nimi; tämä . ikä = ikä; tämä . paino = paino; ) julkinen kissa () ( ) public void sayMeow () ( System. out. println ("Miau!" ) ; ) public String getName () ( paluunimi; ) public void setName (merkkijonon nimi) ( tämä . nimi = nimi; ) public int getAge () ( paluuikä; ) public void setAge (int age) ( tämä . ikä = ikä; ) public int getWeight () ( paluupaino; ) public void setWeight (int paino) ( tämä . paino = paino; ) ) Oikeastaan , kenttiin pääsyn rajoittaminen ja getter-setterien käyttöönotto on yleisin yksityisen käyttötapa tosityössä. Tuo on kapseloinnin toteuttaminen ohjelmassa on tämän muuntajan päätarkoitus. Tämä ei muuten koske vain peltoja. Kuvittele, että ohjelmassasi on menetelmä, joka toteuttaa joitain ERITTÄIN monimutkaisia ​​toimintoja. Jos haluat keksiä jotain tällaista esimerkkiä varten… Oletetaan, että readDataFromCollider()-menetelmäsi ottaa osoitteen ja syöttää tietoja, lukee tiedot Large Hadron Colliderista tavumuodossa, muuntaa nämä tiedot tekstiksi, kirjoittaa sen tiedostoon ja tulostaa se ulos. Jopa menetelmän kuvaus näyttää pelottavalta, koodista puhumattakaan :) Koodin luettavuuden lisäämiseksi olisi hyvä olla kirjoittamatta menetelmän monimutkaista logiikkaa yhteen paikkaan, vaan pikemminkin hajottaa toiminnallisuus erillisiin menetelmiin. Esimerkiksi readByteData()-menetelmä vastaa tietojen lukemisesta, convertBytesToSymbols() muuntaa törmäyksestä luetun tiedon tekstiksi, saveToFile() tallentaa vastaanotetun tekstin tiedostoon ja printColliderData() tulostaa datatiedostomme. ReadDataFromCollider()-metodi olisi lopulta paljon yksinkertaisempi: julkinen luokka ColliderUtil ( public void readDataFromCollider (Path pathToData) ( tavu colliderData = readByteData (pathToData) ; String textData = convertBytesToSymbols (colliderToDataC =Data-tiedosto) (TekstitiedostoWData-Data) ; fileWithData) ) ; ) julkinen tavu readByteData(Path polku tiedoihin) ( // lukee dataa tavuina) julkinen merkkijono convertBytesToSymbols (byte colliderDataInBytes) ( ) julkinen tiedosto saveToFile (String colliderData) ( ) public void printColliderData (File fileWithColliderData) ( // Tulosta tiedot tiedostosta) ) Kuitenkin, kuten muistat rajapintoja käsittelevästä luennosta, käyttäjä pääsee vain lopulliseen käyttöliittymään. Ja neljä menetelmäämme eivät ole osa sitä. Ne apu: loimme ne parantamaan koodin luettavuutta emmekä laittamaan neljää eri tehtävää samaan menetelmään. Sinun ei tarvitse antaa käyttäjälle pääsyä näihin menetelmiin. Jos käyttäjällä on pääsy convertBytesToSymbols()-menetelmään työskennellessään törmäyslaitteen kanssa, hän ei todennäköisesti yksinkertaisesti ymmärrä, mikä tämä menetelmä on ja miksi sitä tarvitaan. Mitä tavuja muunnetaan? Mistä he tulivat? Miksi muuntaa ne tekstiksi? Tässä menetelmässä suoritettava logiikka ei ole osa käyttöliittymää. Vain readDataFromCollider()-metodi on osa käyttöliittymää. Mitä tehdä näillä neljällä "sisäisellä" menetelmällä? Oikein! Rajoita pääsyä niihin yksityisellä muokkaajalla. Joten he voivat turvallisesti tehdä työnsä luokassa, eivätkä johda käyttäjää harhaan, joka ei tarvitse jokaisen logiikkaa erikseen. public class ColliderUtil ( public void readDataFromCollider (Path pathToData) ( byte colliderData = readByteData (pathToData) ; String textData = convertBytesToSymbols (colliderData) ; File fileWithData = saveToFile (textData) // lukee dataa tavuina) yksityinen merkkijono convertBytesToSymbols (byte ColliderDataInBytes) ( // muuntaa tavut merkeiksi) yksityinen tiedosto saveToFile(String ColliderData) ( // tallentaa luetut tiedot tiedostoon) yksityinen void printColliderData(File fileWithColliderData)( // Tulosta tiedot tiedostosta } }

suojattu muuntaja

Seuraavaksi rajoittavin pääsyn muokkaaja on suojattu.
Suojatuilla käyttöoikeuksilla merkityt kentät ja menetelmät tulevat näkyviin:
  • kaikissa luokissa, jotka ovat samassa paketissa kuin meidän;
  • kaikissa luokissamme, jotka perivät luokaltamme.
On vaikea kuvitella, milloin tätä saattaisi tarvita. Älä ihmettele: suojattuja käyttöjä on paljon vähemmän kuin yksityisiä, ja ne ovat erityisiä. Kuvittele, että meillä on abstrakti luokka AbstractSecretAgent , joka tarkoittaa jonkin erikoispalvelun salaista agenttia, sekä paketti top_secret , joka sisältää tämän luokan ja sen jälkeläiset. Konkreettiset luokat periytyvät siitä - FBISecretAgent , MI6SecretAgent , MossadSecretAgent jne. Abstraktin luokan sisällä haluamme toteuttaa agenttilaskurin. Kun uusi agenttiobjekti luodaan jonnekin ohjelmaan, se kasvaa. paketti top_secret; julkinen abstrakti luokka AbstractSecretAgent ( julkinen staattinen int agentCount = 0 ; ) Mutta agenttimme ovat salaisia! Joten vain heidän eikä kenenkään muun pitäisi tietää heidän numerostaan. Voimme helposti lisätä suojatun modifikaattorin agentCount-kenttään, jolloin joko muiden salaisten agenttien luokkien objektit tai ne luokat, jotka sijaitsevat "salaisessa" top_secret -paketissamme, voivat saada sen arvon. julkinen abstrakti luokka AbstractSecretAgent ( suojattu staattinen int agentCount = 0 ; ) Tällaisiin erityistehtäviin tarvitaan suojattu muuntaja :)

paketin näkyvä muuntaja

Seuraavaksi luettelossa on oletusmuunnin tai, kuten sitä myös kutsutaan, paketti näkyvissä . Sitä ei ole merkitty avainsanalla, koska se on oletusarvoisesti asetettu Javassa kaikille kentille ja menetelmille. Jos kirjoitat koodiisi - int x = 10 ... muuttujalla x on sama paketti näkyvän pääsyn. On helppo muistaa, mitä hän tekee. Itse asiassa oletus = suojattu -perintö :) Sen käyttötapaukset ovat rajalliset, kuten suojattu muuntaja. Useimmiten oletuskäyttöä käytetään paketissa, jossa on joitain apuohjelmaluokkia, jotka eivät toteuta tämän paketin kaikkien muiden luokkien toimintoja. Otetaan esimerkki. Kuvittele, että meillä on paketti palvelut". Sen sisällä on erilaisia ​​luokkia, jotka toimivat tietokannan kanssa. On esimerkiksi UserService-luokka, joka lukee käyttäjätietoja tietokannasta, CarService-luokka, joka lukee autotietoja samasta tietokannasta, ja muita luokkia, joista jokainen toimii oman tyyppisten kohteidensa kanssa ja lukee tietoja niistä tietokannasta. . pakettipalvelut; julkisen luokan UserService ( ) -pakettipalvelut; public class CarService ( ) Helposti voi kuitenkin käydä niin, että tietokannan tiedot ovat yhdessä muodossa, mutta tarvitsemme sitä toisessa. Kuvittele, että käyttäjän syntymäaika tietokantaan on tallennettu muodossa TIMESTAMP WITH TIME ZONE... 2014 - 04 - 04 20 : 32 : 59.390583 + 02 ...tarvitsemme sen sijaan yksinkertaisimman objektin - java.util. Päivämäärä . Tätä tarkoitusta varten voimme luoda palvelupaketin sisään erityisen Mapper-luokan. Se vastaa tietokannan tietojen muuntamisesta meille tutuiksi Java-objekteiksi. Yksinkertainen auttajaluokka. Luomme yleensä kaikki luokat julkisena luokkana ClassName , mutta tämä ei ole pakollista. Voimme julistaa auttajaluokkamme yksinkertaisesti luokan Mapperiksi. Tässä tapauksessa se silti tekee tehtävänsä, mutta ei näy palvelupaketin ulkopuolisille! pakettipalvelut; luokan Mapper() pakettipalvelut; public class CarService ( Mapper mapper; ) Ja tämä on pohjimmiltaan oikea logiikka: miksi kukaan paketin ulkopuolella näkisi apuluokan, joka toimii vain samassa paketissa olevien luokkien kanssa?

julkinen muokkaus

Ja viimeisenä mutta ei vähäisimpänä, julkinen muokkaus! Tapasit hänet ensimmäisenä päivänäsi JavaRushissa, kun suoritit julkista static void main (String args) ensimmäistä kertaa elämässäsi.
Nyt kun olet opiskellut rajapintoja käsitteleviä luentoja, sen tarkoitus on sinulle selvä :) Julkinenhan on luotu antamaan jotain käyttäjille. Esimerkiksi ohjelman käyttöliittymä. Oletetaan, että olet kirjoittanut käännösohjelman, ja se voi kääntää venäjän tekstiä englanniksi. Olet luonut translate(String textInRussian) -menetelmän, jonka sisällä on toteutettu tarvittava logiikka. Merkitsit tämän menetelmän sanalla public , ja nyt siitä tulee osa käyttöliittymää: public class Translator ( public String translate (String textInRussian) ( // kääntää tekstiä venäjästä englanniksi) ) Voit liittää tämän menetelmäkutsun "käännä" -painikkeeseen ohjelmanäytössä - ja siinä kaikki! Kuka tahansa voi käyttää sitä. Julkisella koodilla merkityt osat on tarkoitettu loppukäyttäjälle. Esimerkkinä elämästä, yksityisiä ovat kaikki prosessit, jotka tapahtuvat television sisällä sen toimiessa, ja julkisia ovat television kaukosäätimen painikkeet, joilla käyttäjä voi ohjata sitä. Samaan aikaan hänen ei tarvitse tietää, miten televisio on järjestetty ja miten se toimii. Konsoli on joukko julkisia menetelmiä: on() , off() , nextChannel() , previousChannel() , expandVolume() , vähentääVolume() jne.

Viimeisin päivitys: 03.10.2019

Kaikilla luokan jäsenillä - kentät, menetelmät, ominaisuudet - heillä kaikilla on pääsyn muokkaajat. Pääsymääritteiden avulla voit asettaa luokan jäsenille sallitun laajuuden. Toisin sanoen pääsyn muokkaajat määrittelevät kontekstin, jossa tiettyä muuttujaa tai menetelmää voidaan käyttää. Aiemmissa aiheissa olemme jo kohdanneet sen, kun julistimme luokkakentät julkisiksi (eli julkisella muokkaajalla).

C# käyttää seuraavia käyttöoikeusmääritteitä:

    julkinen: julkinen, julkinen luokka tai luokan jäsen. Tällainen luokan jäsen on käytettävissä mistä tahansa koodin kohdasta sekä muista ohjelmista ja kokoonpanoista.

    yksityinen: yksityinen luokka tai luokan jäsen. Edustaa julkisen muuntimen täsmällistä vastakohtaa. Tällainen yksityinen luokka tai luokan jäsen on käytettävissä vain koodista samassa luokassa tai kontekstissa.

    suojattu: Tällainen luokan jäsen on käytettävissä mistä tahansa nykyisessä luokassa tai johdetuissa luokissa. Tässä tapauksessa johdetut luokat voivat sijaita muissa kokoonpanoissa.

    sisäinen: Luokka ja luokan jäsenet, joilla on samanlainen muokkaus, ovat käytettävissä mistä tahansa koodin kohdasta samassa kokoonpanossa, mutta se ei ole muiden ohjelmien ja kokoonpanojen käytettävissä (kuten julkisen muuntimen tapauksessa).

    suojattu sisäinen: yhdistää kahden muuntajan toiminnot. Tällä muokkaimella varustetut luokat ja luokan jäsenet ovat käytettävissä nykyisestä kokoonpanosta ja johdetuista luokista.

    yksityinen suojattu: Tällainen luokan jäsen on käytettävissä mistä tahansa nykyisessä luokassa tai johdetuista luokista, jotka on määritelty samassa kokoonpanossa.

Voimme asettaa käyttöoikeusmuuntimen nimenomaisesti, esimerkiksi:

Yksityinen suojatun luokan tila ( sisäinen int a; suojattu void Print() ( Console.WriteLine($"a = (a)"); ) )

Tai emme voi määritellä:

Luokan tila ( int a; void Print() ( Console.WriteLine($"a = (a)"); ) )

Jos kentille ja menetelmille ei ole määritetty pääsyn muokkaajaa, yksityistä muokkaajaa käytetään oletuksena.

Ilman muokkausta ilmoitetuilla luokilla ja rakenteilla on oletuksena sisäinen käyttöoikeus.

Kaikilla luokilla ja rakenteilla, jotka on määritetty suoraan nimiavaruuksiin ja joita ei ole sisäkkäisiä muihin luokkiin, voi olla vain julkisia tai sisäisiä muokkaajia.

Katsotaanpa esimerkkiä ja luodaan seuraava tilaluokka:

Julkinen luokka Tila ( // ei ole väliä onko yksityinen int oletusVar; int oletusVar; // kenttään pääsee vain nykyisestä luokasta private int privateVar; // käytettävissä nykyisestä luokasta ja johdetuista luokista, jotka on määritelty samassa projektin suojattu yksityinen int suojattuPrivateVar; // käytettävissä nykyisestä luokasta ja johdetuista luokista suojattu int protectedVar; // käytettävissä missä tahansa nykyisen projektin sisäinen int sisäinenVar; // käytettävissä missä tahansa nykyisessä projektissa ja johdetuista luokista muissa projekteissa suojattu sisäinen int protectedInternalVar; // käytettävissä missä tahansa ohjelmassa, samoin kuin muille ohjelmille ja kokoonpanoille public int publicVar; // siinä on oletusarvoisesti muuntaja private void defaultMethod() => Console.WriteLine($"defaultVar = (defaultVar)" ); // menetelmä on käytettävissä vain nykyisestä luokasta private void privateMethod() => Console.WriteLine($"privateVar = (privateVar)"); // käytettävissä nykyisestä luokasta ja johdetuista luokista, jotka on määritelty samassa lauseke projekti suojattu yksityinen void protectedPrivateMethod() => Console.WriteLine($"protectedPrivateVar = (protectedPrivateVar)"); // käytettävissä nykyisestä luokasta ja johdetuista luokista suojattu void protectedMethod()=> Console.WriteLine($"protectedVar = (protectedVar)"); // käytettävissä missä tahansa nykyisessä projektissa sisäinen void internalMethod() => Console.WriteLine($"internalVar = (internalVar)"); // käytettävissä missä tahansa nykyisessä projektissa ja johdetuista luokista muissa projekteissa suojattu sisäinen void protectedInternalMethod() => Console.WriteLine($"protectedInternalVar = (protectedInternalVar)"); // käytettävissä missä tahansa ohjelmassa, samoin kuin muille ohjelmille ja kokoonpanoille public void publicMethod() => Console.WriteLine($"publicVar = (publicVar)"); )

Koska State-luokka ilmoitetaan julkisella muokkaimella, se on käytettävissä mistä tahansa ohjelmasta, samoin kuin muista ohjelmista ja kokoonpanoista. State-luokassa on viisi kenttää kullekin käyttöoikeustasolle. Plus yksi muokkaamaton muuttuja, joka on oletuksena yksityinen.

On myös kuusi menetelmää, jotka näyttävät luokkakenttien arvot näytöllä. Huomaa, että koska kaikki muuttajat sallivat luokan jäsenten käytön tässä luokassa, kaikki luokan muuttujat, mukaan lukien yksityiset, ovat kaikkien sen menetelmien käytettävissä, koska ne ovat kaikki State-luokan kontekstissa.

Katsotaan nyt, kuinka voimme käyttää luokkamuuttujiamme ohjelmassa (eli Ohjelma-luokan Main-metodissa), jos Tila- ja Ohjelma-luokat ovat samassa projektissa:

Luokkaohjelma ( static void Main(string args) ( State state1 = new State(); // emme voi antaa arvoa oletusVar-muuttujalle, // koska siinä on yksityinen muokkaaja ja Program-luokka ei näe se // Ja ympäristö ei näe tätä riviä alleviivauksena virheellisenä tila1.defaultVar = 5; //Virhe, ei voida käyttää // sama koskee privateVar-muuttujaa status1.privateVar = 5; // Virhe, ei voida käyttää // määrittäminen arvo suojattuPrivateVar-muuttujalle ei toimi, // koska luokka Ohjelma ei ole luokka, joka perii luokasta State state1.protectedPrivateVar =5; // Virhe, ei voida käyttää // arvon määrittäminen muuttujalle protectedVar myös epäonnistuu, // koska luokka Ohjelma ei ole luokka, joka perii tila-luokasta state1.protectedVar = 5; // Virhe, ei pääse käsiksi // sisäinenVar-muuttuja sisäisellä muokkaimella on käytettävissä missä tahansa nykyisessä projektissa // joten voi turvallisesti antaa sille arvon tila1.sisäinenVar = 5; // suojattuInternalVar-muuttuja on myös käytettävissä mistä tahansa nykyisen projektin tilasta1.protectedInternalVar = 5; // muuttuja publicVar on julkinen tila1.publicVar = 5; ) )

Näin ollen pystyimme asettamaan vain muuttujat sisäinenVar, suojattuInternalVar ja publicVar, koska niiden muokkaajien avulla voimme käyttää niitä tässä yhteydessä.

Sama pätee menetelmiin:

Luokkaohjelma ( staattinen void Main(string args) ( State state1 = new State(); state1.defaultMethod(); //Virhe, ei voida käyttää state1.privateMethod(); // Virhe, ei voida käyttää state1.protectedPrivateMethod() ; // Virhe, ei voida käyttää state1.protectedMethod(); // Virhe, ei voida käyttää state1.internalMethod(); // ok tila1.protectedInternalMethod(); // ok tila1.publicMethod(); // ok ) )

Tässä vain kolme menetelmää osoittautui käytettävissämme olevan: internalMethod, protectedInternalMethod, publicMethod, joilla on vastaavasti sisäinen, suojattu sisäinen ja julkinen määritteet.

Tällaisen pääsymuutosjärjestelmän ansiosta on mahdollista piilottaa joitain luokan toteutuksen näkökohtia ohjelman muilta osilta.

Huolimatta siitä, että julkiset ja sisäiset modifioijat ovat vaikutukseltaan samanlaisia, niillä on suuri ero. Luokat ja luokan jäsenet julkisella muokkaajalla ovat myös muiden ohjelmien käytettävissä, jos tietty luokka sijoitetaan dynaamiseen kirjastoon dll ja sitä käytetään sitten näissä ohjelmissa.