Muuttujanäyttö
jokainen muuttuja on käytettävissä (ja käytettävissä) vain siinä yhteydessä, jossa se on ilmoitettu. Jos haluat määrittää asiayhteyden, katso lähimmät avautumis-ja sulkemismerkit, jotka ympäröivät ilmoitusta. Useimmissa ohjelmointikielissä käytetään curly-henkseleitä ({}
) merkitsemään koodilohkon alkua ja loppua. Katso tästä esimerkistä:
täällä ei tarvitse ymmärtää jokaista koodinpätkää, keskity vain kiharoihin. 🙂 Kun puhutaan muuttujien saatavuudesta kontekstissa, puhutaan laajuudesta. Tässä näkyy, että muuttuja root
on julistettu kahden purppuralla ympyröidyn kiharan väliin. Muuttujan laajuus on kaikkea noiden kahden hammasraudan välillä.
muuttujan laajuus voi olla sekä paikallinen että globaali riippuen siitä, missä muuttuja on ilmoitettu. Globaali muuttuja voi olla saatavilla kaikille ohjelman luokille ja menetelmille, kun taas paikallinen muuttuja voi olla käytettävissä vain siinä menetelmässä, jossa se on ilmoitettu:
täällä olemme laajentaneet koodia hieman ja laajentaneet ensimmäistä koodilohkoamme sisältämään toisen! Jos jäljität violetit viivat, näet, että suluissa ensimmäisen lohkon kattaa kaikki koodin toisen. Seuraavaksi voidaan todeta, että uusi muuttuja, spy
, on ilmoitettu vihreän paikallispiirin sisällä.
koska root
muuttuja on ilmoitettu globaalissa laajuudessa, se tarkoittaa, että se on kaikkien saatavilla violeteissa suluissa, mukaan lukien kaikki paikallisessa laajuudessa ilmoitettu. Toisessa koodilohkossa näkyy juuri spy-muuttujan julistuksen alapuolella oleva rivi, jossa käytetään root
. Se on sallittua!
se, mikä on paikallisella soveltamisalalla, ei kuitenkaan ole saatavilla maailmanlaajuiselle soveltamisalalle tai muille paikallisille koodilohkoille. Katsotaanpa toista esimerkkiä:
tässä on lisätty toinen koodilohko, jolla on oma paikallinen soveltamisala ja oma muuttuja, anotherSpy
. Katso nyt vakoojamuuttujan lohkon viimeinen rivi:
System.out.println(anotherSpy); // Error
näyttää siltä, että on virhe! Tämä johtuu siitä, että se yrittää käyttää anotherSpy
muuttujaa. Mutta se ei voi, koska anotherSpy
ei kuulu globaaliin eikä samaan paikalliseen piiriin. Tämä koodilohko ei pääse siihen käsiksi. anotherSpy
on saatavilla vain siinä koodilohkossa, jossa se on ilmoitettu.
sama pätee toiseenkin suuntaan. Näet, että myös viimeisen koodilohkomme viimeisellä rivillä on virhe:
System.out.println(spy); // Error
tässä yritetään käyttää muuttujan spy toisesta koodilohkosta. Mutta se ei voi, koska spy
ei ole samassa laajuudessa kuin sitä yrittävä koodilohko.
muuttujan soveltamisala luokissa
kun ilmoitat luokan, sovelletaan samoja yleisiä tarkkailusääntöjä: jokainen muuttuja on käytettävissä vain ilmoituslohkossaan. Kokeillaan yksisarvisluokkaa:
aivan kuten ensimmäisessä esimerkissämme, on olemassa sekä globaaleja että paikallisia luokkamuuttujia. Tarkastellaan yksityiskohtaisesti:
-
muuttujat
height
japower
ovat luokan kenttiä, ja ne ovat käytettävissä missä tahansa luokan sisällä. -
muuttuja
minutesToRun
on saatavilla vain sen koodilohkon paikallisella soveltamisalalla, jossa se on ilmoitettu.
muuttujaminutesToSleep
on saatavilla vain sen koodilohkon paikallisella soveltamisalalla, jolla se on ilmoitettu.
muuttujan laajuus rajoittaa sen saavutettavuutta määritelmän mukaan. Luokkakenttiä voi kuitenkin käyttää luokan ulkopuolella, ja niitä voi käyttää mikä tahansa muu koodilohko.
esimerkissämme ne ovat height
ja power
. Jos julistamme yksisarvisen muuttujan, voimme lukea tai muuttaa näitä arvoja:
luokkamuuttujien kanssa pelleilyllä voi olla vakavia seurauksia. Hyvä uutinen on – voit hallita sitä! Ennen kuin tarkistamme, miten, muista harjoitella vaihteleva scoping.
Kokeile itse!
kulunvalvonta
aiomme käyttää kulunvalvonnan ajatusta toteuttamalla rajoitetun pääsyn luokkaan, moduuliin tai tiedostoon. Tiedät jo, mikä luokka ja tiedosto ovat, koska olemme työskennelleet niiden kanssa!
moduuli on joukko nimeen liittyviä lähdekooditiedostoja, kuten kehys. Viitekehys on tietyn asiayhteyden mukaan ryhmitelty funktioiden joukko. Se nopeuttaa kehitysprosessia ja antaa ohjeita koodin kirjoittamiseen.
jokaisessa kehitysympäristössä on useita kehyksiä. Tosiasia on, että näiden puitteiden toteuttaminen on paljon enemmän kuin mitä niitä käyttävät kehittäjät voivat nähdä ja hyödyntää. Se tehdään rajoittamalla pääsyä toteutuksen yksityiskohtiin, joka tunnetaan myös kulunvalvonnan toteuttamisena.
Kontrollitasot
Java-kielessä on käytettävä yhtä avainsanoista kontrollitason osoittamiseksi:
-
Julkinen: näkyvä maailmalle ja siten vähiten rajoittava
-
paketti-suojattu: tyypillisesti ne näkyvät vain siinä paketissa, jossa ne ovat (oletusasetukset)
-
Yksityiset: saatavilla vain siinä kontekstissa, jossa ne on määritelty (luokan sisällä se sijaitsee)
suojattu: näkyvissä paketille ja kaikille sen alaluokille
näiden erillisten rajoitusten asettaminen tekee kehittämisestä paljon helpompaa. Sinun ei tarvitse huolehtia mitään ei-toivottua näkyvyyttä Oman täytäntöönpanon ja enemmän niin, ei-toivottuja muutoksia.
aseta sopiva hakusana siihen liittyvän ilmoituksen eteen:
silloin, jos yrität päästä käsiksi luokan ulkopuolisiin yksityisiin jäseniin, saat virheitä:
kontrollitasot voidaan jakaa luokan elementteihin sekä luokkiin:
public class PublicClass {}private class PrivateClass {}
turvallisuuden lisäksi kontrollitasojen määrittäminen luokan jäsenille antaa paremman luettavuuden. Kun Kehittäjä valmistelee lähdetiedostoa, on aina selvää, mitä elementtejä voidaan käyttää ulkoisesti.
Kontrollihierarkia
elementillä voi olla sama tai rajoittavampi kontrollitaso kuin sen sisältävällä elementillä:
yllä olevassa esimerkissä luokan ilmoitetaan olevan public
. Koska luokka on sisältävä elementti, tämä tarkoittaa, että kaikki kyseisen luokan osatekijät voivat olla saman tai vähäisemmän altistuksen tasoa. Tässä tapauksessa se sisältää kaikki tasot.
Jos ilmoittaa luokan private
, sen alkuaineet voivat olla vain package-private
tai private
:
class PrivateClass { int internalProperty = 0; // automatically assigned package-private by default protected defaultProperty = true; // automatically assigned package-private public boolean publicProperty = true; // automatically converted to package-private private String fileprivateProperty = "Hello!"; //only available to the class private static void privateMethod() { }}
yllä olevassa esimerkissä olemme lisänneet attribuutti ilman nimenomaista kulunvalvontasanaa. Tässä skenaariossa oletuksena se olettaa tason sisältävän elementin. Tällöin se on meidän luokkamme, joten se olettaa tason PrivateClass
.
ylätason luokkaa ei voi merkitä yksityiseksi, mutta sen asettaminen oletukseksi asettaa sen pakettisuojatulle tasolle. Jos ilmoitusyhteyden tarkastustaso on luokan muuttujaa ilmoitettaessa korkeampi, muuttujalla on oltava myös nimenomainen tarkastustaso. Julistetaan FileprivateClass-muuttuja:
String a = PrivateClass(); // Errorprivate String b = PrivateClass(); // Okprivate String c = PrivateClass(); // Ok
kuten näet, jos muuttujan asiayhteyden oletuskäyttötaso on korkeampi kuin sille määrittämäsi luokka, on muuttujan taso erikseen määriteltävä samaksi tai alemmaksi kuin luokan taso.
Yhteenveto
tässä luvussa olet oppinut muuttujan saavutettavuudesta:
-
muuttujan soveltamisala on se koodialue, jolla se on ilmoitettu.
-
yleinen muuttujan soveltamisala koskee kaikkia koodilohkoja, myös luokkia.
-
toinen välttämätön tapa kontrolloida muuttujien ja toimintojen saatavuutta on käyttää kontrollitasoja: julkisia, suojattuja, pakettisuojattuja ja yksityisiä.