Alustuslohko

Alustuslohko on olio-ohjelmoinnin konsepti , joka tunnetaan pääasiassa Java-kielestä ja joka on luokkien ja objektien luomisen ( latauksen ) aikana suoritettava komentosarja . Suunniteltu lisäämään huomattavasti rakentajan tehoa . On olemassa kahta tyyppiä: staattinen alustuslohko, jota yleisesti kutsutaan lyhennettynä staattiseksi lohkoksi, ja dynaaminen alustuslohko (instanssilohko).

Motivaatio

Kun objekti luodaan, suoritetaan useita konstruktorissa määritettyjä komentoja. Joskus on tarpeen laajentaa syntaksin mahdollisuuksia. Tyypillisesti dynaaminen lohko on olemassa vain mukavuuden vuoksi - se voidaan helposti korvata lisäämällä latausfunktio ja kutsumalla se jokaiselta rakentajalta. Staattinen lohko kuitenkin lisää huomattavasti ohjelman toimivuutta ja siksi sitä käytetään paljon useammin.

Staattinen alustuslohko

Staattinen lohko on pohjimmiltaan koko luokan rakentaja. Sen syntaksi on:

... staattinen { // Staattinen lohkokoodi } ...

Se sijoitetaan kenttämääritelmien ja luokkafunktioiden väliin. Komennot suoritetaan kahdessa tapauksessa sen mukaan, kumpi tulee ensin:

  1. Kun luot luokan ensimmäistä objektia ohjelman aikana, ennen konstruktorin suorittamista.
  2. Staattista funktiota kutsutaan ensimmäisen kerran ennen suoritusta.

Toisin sanoen koodi suoritetaan, kun luokka ladataan ensimmäisen kerran. Tässä esimerkissä haluamme luoda luokan, joka mallintaa tietyn yrityksen valmistamia autoja ja ylläpitää niitä pysyäkseen kirjaa niiden olemassaolosta, mukaan lukien nykyinen tilanne, omistajat, korjaushistoria jne. Jokainen esine on auto , ja luokassa on staattinen kenttä, joka sisältää tietokannan kaikista autoista. Perustuu karttarakenteeseen, kun avain on automalli ja sisältö on ryhmä kyseisen mallin autoja. Seuraava koodi osoittaa staattisen alustuslohkon käytön:

julkisen luokan auto { staattinen kartta < merkkijono , sarja < auto >> luettelo ; static { katalogi = uusi HashMap < String , Set < Auto >> (); katalogi . put ( "malli105" , new HashSet < Auto > ()); katalogi . put ( "malli125" , uusi HashSet < Auto > ()); katalogi . put ( "malli140" , uusi HashSet < Auto > ()); katalogi . put ( "malli201" , uusi HashSet < Auto > ()); } julkinen auto ( merkkijonomalli ) { _ katalogi . hanki ( malli ). lisää ( tämä ); //... } //... }

Linja 4 voidaan helposti kiinnittää linjaan 2 ilman staattista lohkoa. Kuitenkin rivit 5-8 osoittavat sen tarpeen - kykyä suorittaa monimutkaisia ​​komentoja luokkatasolla, jotka objektitasolla ilmestyisivät konstruktoriin.

Dynaaminen alustuslohko

Dynaaminen lohko on lisä konstruktoriin. Sen syntaksi on:

... { // Ilmentymän estokoodi } ...

Se sijoitetaan kenttämääritelmien ja luokkafunktioiden väliin. Komennot suoritetaan, kun objekti on luotu. Dynaaminen lohko on lisäosa, joka helpottaa rakentajan kirjoittamista, eikä se tuo lisätoimintoja. Sen avulla voit tallentaa käynnistystoiminnon luomisen ja sen kutsun lisäämisen kaikilta rakentajilta. Esimerkiksi koodinpätkä:

julkisen luokan auto { staattinen int count = 0 ; julkinen auto ( merkkijonomalli ) { _ init (); //... } julkinen auto ( String - malli , tuplahinta ) { init (); //... } yksityinen void init () { laskea ++ ; Järjestelmä . ulos . println ( "Hei kaikille, meillä on nyt " + count + " autoja!" ); } //... }

vastaa koodia:

julkisen luokan auto { staattinen int count = 0 ; julkinen auto ( merkkijonomalli ) { _ //... } julkinen auto ( String - malli , tuplahinta ) { //... } { laskea ++ ; Järjestelmä . ulos . println ( "Hei kaikille, meillä on nyt " + count + " autoja!" ); } //... }

Lataa tilaus

Java-kielen suunnittelun aikana muodostettiin johdonmukainen latausjärjestys. Luokan latauksen aikana järjestys on seuraava:

  1. Pääluokkien staattisten kenttien määritelmät.
  2. Staattisten kenttien alustus ja yläluokkien staattisten lohkojen suorittaminen.
  3. Luokan staattisten kenttien määritelmät.
  4. Staattisten kenttien alustaminen ja staattisten luokkalohkojen suorittaminen.

Sitten kun objekti on luotu, järjestys on seuraava:

  1. Objektikentän määritelmät yläluokista.
  2. Kentän alustus ja dynaamisten lohkojen suoritus yläluokista.
  3. Vanhempainluokkien konstruktorien suoritus.
  4. Luokkansa objektikenttien määritelmät.
  5. Kentän alustus ja dynaamisten lohkojen suorittaminen luokastaan.
  6. Rakentajan suorittaminen luokastaan.

Kun esi-isäketju on olemassa, kaikki toiminnot suoritetaan ensin kaukaisimmalle esi-isälle (luokka Object) ja sitten ketjua alaspäin samassa järjestyksessä nykyiseen luokkaan.

Jos samassa osiossa on useampi kuin yksi tyyppi, vaiheet suoritetaan siinä järjestyksessä, jossa ne näkyvät ohjelmassa. Esimerkiksi seuraava koodi:

julkinen luokka T { staattinen int i = 5 ; static { i = 10 ; } static { i = i * 3 ; } }

antaa kunkin objektin muuttujalle i arvon 30. Mutta koodi:

julkinen luokka T { static { i = 10 ; } staattinen int i = 5 ; static { i = i * 3 ; } }

antaa arvon 15. Eli ensin luodaan kenttä ja sitten kaikki toiminnot suoritetaan ohjelmassa määritetyssä järjestyksessä - ensimmäinen lohko, sitten kentän alustus, sitten toinen lohko.

Mahdolliset ongelmat

Muuttujan käyttäminen ennen sen määrittelyä

Toisin kuin saatat odottaa, seuraava koodi:

julkinen luokka T { static { i = 5 ; i = i + 1 ; } staattinen int i = 5 ; }

ei pysty kääntämään rivillä 4, koska oikeaa muuttujaa i käytettiin ennen sen määrittelyä, vaikka rivi 3 kääntää ja toimii ongelmitta, vaikka rivin 4 vasen i ei aiheuta virhettä, ja huolimatta siitä, että toiminnan aikana, kun rivin 4 alku on saavutettu, muuttuja määriteltiin ja se sai arvon. Tämä johtuu siitä, että muuttujien sijoittelu (esimerkiksi rivillä 3) tarkistetaan ohjelman suorituksen aikana määritettyyn muuttujaluetteloon, mukaan lukien kaikki staattiset kentät, ja tällaisen muuttujan käyttö tarkistetaan määritelmän sijainnin perusteella.

Paikallinen staattinen muuttuja

Toisin kuin saatat odottaa, seuraava koodi:

julkinen luokka T { static { int i = 10 ; } public static void main ( String [ ] args ) { Järjestelmä . ulos . println ( i ); } }

epäonnistuu kääntäminen rivillä 6 sillä perusteella, että muuttujaa ei ole määritelty, koska muuttujan määrittäminen staattiseen lohkoon ei luo staattista muuttujaa, vain paikallisen muuttujan kyseiseen lohkoon. Eli koodi ei ole sama kuin koodi . static {int i = 10;}static int i = 10;

Katso myös

Linkit