Ohjelmointi

Opi Java alusta asti

Joten haluat ohjelmoida Java? Se on hienoa, ja olet tullut oikeaan paikkaan. Java 101 -sarja tarjoaa itseohjatun johdannon Java-ohjelmointiin, alkaen perusasioista ja käsittelemällä kaikki keskeiset käsitteet, jotka sinun on tiedettävä tullaksesi tuottavaksi Java-kehittäjäksi. Tämä sarja on tekninen, ja siinä on runsaasti koodiesimerkkejä, jotka auttavat sinua ymmärtämään käsitteet jatkuessamme. Oletan, että sinulla on jo jonkin verran ohjelmointikokemusta, vain ei Java-kielellä.

Tämä ensimmäinen artikkeli esittelee Java-alustan ja selittää eron sen kolmen version välillä: Java SE, Java EE ja Java ME. Opit myös Java-virtuaalikoneen (JVM) roolista Java-sovellusten käyttöönotossa. Autan sinua asentamaan Java Development Kit (JDK) järjestelmääsi, jotta voit kehittää ja suorittaa Java-ohjelmia, ja opetan aloittamaan tyypillisen Java-sovelluksen arkkitehtuurin. Lopuksi opit kääntämään ja suorittamaan yksinkertaisen Java-sovelluksen.

Päivitetty Java 12: lle ja uudelle JShellille

Tämä sarja on päivitetty Java 12: lle ja sisältää nopean johdannon uuteen jshell: interaktiivinen työkalu Java-oppimiseen ja Java-koodin prototyyppien tekemiseen.

lataa Hanki koodi Lataa lähdekoodi esimerkiksi sovelluksiin tässä opetusohjelmassa. Luonut Jeff Friesen JavaWorldille.

Mikä on Java?

Voit ajatella Javaa yleiskäyttöisenä, olio-kielenä, joka näyttää paljon C: ltä ja C ++: lta, mutta jota on helpompi käyttää ja jonka avulla voit luoda vankempia ohjelmia. Valitettavasti tämä määritelmä ei anna sinulle paljon tietoa Java-ohjelmasta. Vuonna 2000 Sun Microsystems (Java-alustan alullepanija) kuvaili Javaa seuraavasti:

Java on yksinkertainen, olioihin suuntautunut, verkkoa ymmärtävä, tulkittu, vankka, turvallinen, arkkitehtuurineutraali, kannettava, suorituskykyinen, monisäikeinen, dynaaminen tietokonekieli.

Tarkastellaan kutakin näistä määritelmistä erikseen.

Java on yksinkertainen kieli. Java mallinnettiin alun perin C: n ja C ++: n jälkeen, miinus joitain mahdollisesti hämmentäviä ominaisuuksia. Osoittimet, useiden sovellusten periytyminen ja operaattorin ylikuormitus ovat joitain C / C ++ -ominaisuuksia, jotka eivät ole osa Javaa. Ominaisuus, jota ei vaadita C / C ++: ssa, mutta olennainen Java: lle, on roskien keräyslaitos, joka palauttaa objektit ja taulukot automaattisesti.

Java on olio-kieli. Javan olio-kohdistus antaa kehittäjille mahdollisuuden mukauttaa Java-ratkaisua ongelman ratkaisemiseksi sen sijaan, että pakottaisi meitä manipuloimaan ongelmaa kielirajoitusten täyttämiseksi. Tämä eroaa rakenteellisesta kielestä, kuten C. Esimerkiksi, kun Java antaa sinun keskittyä säästötiliobjekteihin, C vaatii sinua ajattelemaan erikseen säästötiliä osavaltio (tällainen saldo) ja käyttäytymistä (kuten talletus ja nostaminen).

Java on verkkotietokieli. Javan laaja verkkokirjasto on helppo selviytyä TCP / IP (TCP / IP) -verkkoprotokollista, kuten HTTP (HyperText Transfer Protocol) ja FTP (File Transfer Protocol), ja yksinkertaistaa verkkoyhteyksien luomista. Lisäksi Java-ohjelmat voivat käyttää objekteja TCP / IP-verkon kautta Uniform Resource Locators (URL) -palvelun kautta yhtä helposti kuin sinulla olisi pääsy niihin paikallisesta tiedostojärjestelmästä.

Java on tulkittu kieli. Suorituksen aikana Java-ohjelma suorittaa epäsuorasti taustalla olevan alustan (kuten Windows tai Linux) virtuaalikoneen (joka on hypoteettisen alustan ohjelmistoesitys) ja siihen liittyvän suoritusympäristön välityksellä. Virtuaalikone kääntää Java-ohjelman tavukoodit (ohjeet ja niihin liittyvät tiedot) alustakohtaisiin ohjeisiin tulkinnan kautta. Tulkinta on teko, jonka avulla selvitetään, mitä tavukoodikäsky tarkoittaa, ja valitaan sitten suoritettaviksi vastaavat "säilötyt" alustakohtaiset ohjeet. Virtuaalikone suorittaa sitten nämä alustakohtaiset ohjeet.

Tulkinta helpottaa viallisten Java-ohjelmien virheenkorjausta, koska ajon aikana on käytettävissä enemmän kääntöaikaa koskevia tietoja. Tulkinta antaa myös mahdollisuuden viivyttää Java-ohjelmakappaleiden välistä linkkivaihetta ajonaikaan, mikä nopeuttaa kehitystä.

Java on vankka kieli. Java-ohjelmien on oltava luotettavia, koska niitä käytetään sekä kuluttaja- että tehtäväkriittisissä sovelluksissa, aina Blu-ray-soittimista ajoneuvonavigointi- tai ilmanohjausjärjestelmiin. Kieliominaisuuksia, jotka auttavat Java-ohjelmiston vakaassa toiminnassa, ovat ilmoitukset, kaksoiskappaleiden tarkistus käännösaikana ja ajonaikana (versioiden ristiriitaisuuksien estämiseksi), todelliset taulukot automaattisella rajojen tarkistuksella ja osoittimien jättäminen pois. (Katso "Java-kielen perusominaisuudet" aloittaaksesi Java-kielityyppien, literaalien, muuttujien ja muiden kanssa.)

Toinen Java-robustisuuden näkökohta on, että silmukoita on ohjattava Boolen lausekkeilla kokonaislausekkeiden sijaan, joissa 0 on epätosi ja nolla-arvo on tosi. Esimerkiksi Java ei salli C-tyylistä silmukkaa, kuten kun (x) x ++; koska silmukka ei välttämättä pääty odotetulla tavalla. Sen sijaan sinun on annettava nimenomaisesti looginen lauseke, kuten kun (x! = 10) x ++; (mikä tarkoittaa, että silmukka jatkuu x on yhtä suuri kuin 10).

Java on turvallinen kieli. Java-ohjelmia käytetään verkotetuissa / hajautetuissa ympäristöissä. Koska Java-ohjelmat voivat siirtyä verkon eri alustoille ja suorittaa niitä, on tärkeää suojata nämä alustat haittaohjelmilta, jotka saattavat levittää viruksia, varastaa luottokorttitietoja tai suorittaa muita haitallisia toimia. Vahvuutta tukevat Java-kieliominaisuudet (kuten osoittimien jättäminen pois käytöstä) toimivat suojausominaisuuksien, kuten Java-hiekkalaatikkoturvamallin ja julkisen avaimen salauksen, kanssa. Yhdessä nämä ominaisuudet estävät viruksia ja muita vaarallisia koodeja tuhoamasta epäilyttävällä alustalla.

Teoriassa Java on turvallinen. Käytännössä on havaittu ja hyödynnetty useita tietoturva-aukkoja. Tämän seurauksena Sun Microsystems ja Oracle jatkavat nyt tietoturvapäivitysten julkaisemista.

Java on arkkitehtuurineutraali kieli. Verkot yhdistävät alustoja erilaisilla arkkitehtuureilla, jotka perustuvat erilaisiin mikroprosessoreihin ja käyttöjärjestelmiin. Et voi odottaa Java: n tuottavan alustakohtaisia ​​ohjeita ja saavan nämä ohjeet "ymmärtämään" kaikenlaisille verkkoalustoille. Sen sijaan Java luo alustasta riippumattomat tavukoodin ohjeet, jotka on helppo tulkita jokaiselle alustalle (toteuttamalla JVM).

Java on kannettava kieli. Arkkitehtuurineutraalius lisää kannettavuutta. Javan siirrettävyydessä on kuitenkin enemmän kuin alustasta riippumattomat tavukoodin ohjeet. Ota huomioon, että kokonaislukutyyppien koot eivät saa vaihdella. Esimerkiksi 32-bittinen kokonaislukutyyppi on aina allekirjoitettava ja sillä on oltava 32 bittiä riippumatta siitä, missä 32-bittinen kokonaisluku käsitellään (esim. 16-bittisillä rekistereillä varustettu alusta, 32-bittisillä rekistereillä varustettu alusta tai alusta 64-bittisillä rekistereillä). Javan kirjastot myötävaikuttavat myös siirrettävyyteen. Tarvittaessa ne tarjoavat tyyppejä, jotka yhdistävät Java-koodin alustakohtaisiin ominaisuuksiin mahdollisimman kannettavalla tavalla.

Java on korkean suorituskyvyn kieli. Tulkinta tuottaa suoritustason, joka on yleensä enemmän kuin riittävä. Hyvin korkean suorituskyvyn sovellusskenaarioissa Java käyttää juuri oikeaan aikaan -kokoamista, joka analysoi tulkitut tavukoodikomennosarjat ja kokoaa usein tulkitut komentosarjat alustakohtaisiin ohjeisiin. Myöhemmät yritykset tulkita nämä tavukoodikomennosarjat johtavat vastaavien alustakohtaisten ohjeiden suorittamiseen, mikä lisää suorituskykyä.

Java on monisäikeinen kieli. Java tukee niiden ohjelmien suorituskykyä, joiden on suoritettava useita tehtäviä kerralla kierteitetty toteutus. Esimerkiksi ohjelma, joka hallitsee graafista käyttöliittymää (GUI) odottaessaan verkkoyhteydeltä tulevaa syötettä, käyttää toista ketjua odottamiseen sen sijaan, että käyttäisi GUI: n oletuslangkaa molempiin tehtäviin. Tämä pitää GUI: n reagoivana. Javan synkronointiprimitiivit antavat ketjujen kommunikoida turvallisesti keskenään tietoja vioittamatta tietoja. (Katso Java-ketjun ohjelmointi, josta on keskusteltu muualla Java 101 -sarjassa.)

Java on dynaaminen kieli. Koska ohjelmakoodin ja kirjastojen väliset yhteydet tapahtuvat dynaamisesti ajon aikana, niitä ei tarvitse erikseen linkittää. Tämän seurauksena, kun ohjelma tai jokin sen kirjastoista kehittyy (esimerkiksi virheenkorjausta tai suorituskyvyn parantamista varten), kehittäjän on vain jaettava päivitetty ohjelma tai kirjasto. Vaikka dynaaminen käyttäytyminen johtaa vähemmän koodia jaettavaan versionmuutoksen tapahtuessa, tämä jakelukäytäntö voi myös johtaa version ristiriitoihin. Esimerkiksi kehittäjä poistaa luokkatyypin kirjastosta tai nimeää sen uudelleen. Kun yritys jakaa päivitetyn kirjaston, olemassa olevat luokkatyypistä riippuvat ohjelmat epäonnistuvat. Tämän ongelman vähentämiseksi Java tukee käyttöliittymän tyyppi, joka on kuin kahden osapuolen välinen sopimus. (Katso käyttöliittymät, tyypit ja muut objektisuuntaiset kieliominaisuudet, joista on keskusteltu muualla Java 101 -sarjassa.)

Tämän määritelmän purkaminen opettaa meille paljon Java: sta. Mikä tärkeintä, se paljastaa, että Java on sekä kieli että alusta. Opit lisää Java-alustan komponenteista - nimittäin Java-virtuaalikoneesta ja Java-suoritusympäristöstä - myöhemmin tässä opetusohjelmassa.

Kolme Java-versiota: Java SE, Java EE ja Java ME

Sun Microsystems julkaisi Java 1.0 -ohjelmistokehityspaketin (JDK) toukokuussa 1995. Ensimmäistä JDK: ta käytettiin työpöytäsovellusten ja sovelmien kehittämiseen, ja Java kehittyi myöhemmin kattamaan yritys-palvelin ja mobiililaite-ohjelmointi. Kaikkien tarvittavien kirjastojen tallentaminen yhteen JDK: hon olisi tehnyt JDK: sta liian suuren levitettäväksi, varsinkin kun 1990-luvun jakelua rajoittivat pienikokoiset CD-levyt ja hitaat verkon nopeudet. Koska useimmat kehittäjät eivät tarvinneet kaikkia viimeisiä sovellusliittymiä (työpöytäsovellusten kehittäjien tuskin tarvitsee käyttää yrityksen Java-sovellusliittymiä), Sun jakoi Java kolmeen pääversioon. Nämä tunnettiin lopulta nimellä Java SE, Java EE ja Java ME:

  • Java Platform, Standard Edition (Java SE) on Java-foorumi asiakaspuolen sovellusten (jotka toimivat pöytätietokoneilla) ja sovelmien (jotka toimivat verkkoselaimissa) kehittämiseen. Huomaa, että turvallisuussyistä sovelmia ei enää tueta virallisesti.
  • Java Platform, Enterprise Edition (Java EE) on Java SE: n päälle rakennettu Java-alusta, jota käytetään yksinomaan yrityskeskeisten palvelinsovellusten kehittämiseen. Palvelinpuolen sovellukset sisältävät Java-palvelimet, jotka ovat Java-ohjelmia, jotka ovat samanlaisia ​​kuin sovelmia, mutta toimivat palvelimella eikä asiakkaalla. Servletit ovat Java Servlet -sovellusliittymän mukaisia.
  • Java Platform, Micro Edition (Java ME) on myös rakennettu Java SE: n päälle. Se on Java-kehitysalusta MIDletit, jotka ovat Java-ohjelmia, jotka toimivat mobiililaitteilla, ja Xlets, jotka ovat Java-ohjelmia, jotka toimivat sulautetuilla laitteilla.

Java SE on Java-alustan alusta, ja se on Java 101 -sarjan painopiste. Koodiesimerkit perustuvat kirjoituksen tekohetken viimeisimpään Java-versioon, Java 12: een.

Java-alusta ja JVM

Java on sekä ohjelmointikieli että foorumi koottujen Java-koodien ajamiseksi. Tämä alusta koostuu pääasiassa JVM: stä, mutta sisältää myös suoritusympäristön, joka tukee JVM: n suorittamista alla olevalla (alkuperäisellä) alustalla. JVM sisältää useita komponentteja Java-koodin lataamiseen, tarkistamiseen ja suorittamiseen. Kuvassa 1 on esitetty, kuinka Java-ohjelma toimii tällä alustalla.

Jeff Friesen

Kaavion yläosassa on sarja ohjelmaluokatiedostoja, joista yksi on merkitty pääluokkatiedostoksi. Java-ohjelma koostuu ainakin pääluokan tiedostosta, joka on ensimmäinen ladattava, vahvistettu ja suoritettava luokkatiedosto.

JVM delegoi luokan lataamisen sen classloader-komponenttiin. Luokanlataimet lataavat luokkatiedostoja eri lähteistä, kuten tiedostojärjestelmistä, verkostoista ja arkistotiedostoista. Ne eristävät JVM: n luokan kuormituksen monimutkaisuuksilta.

Ladattu luokkatiedosto tallennetaan muistiin ja esitetään objektina, joka on luotu Luokka luokassa. Ladattuaan tavukoodin todentaja tarkistaa eri tavukoodin ohjeet varmistaakseen, että ne ovat kelvollisia eivätkä vaaranna tietoturvaa.

Jos luokkatiedoston tavukoodit eivät kelpaa, JVM lopetetaan. Muuten sen tulkkikomponentti tulkitsee tavukoodin yhden käskyn kerrallaan. Tulkinta tunnistaa tavukoodin ohjeet ja suorittaa vastaavat natiivikäskyt.

Jotkut tavukoodin käskysarjat suoritetaan useammin kuin toiset. Kun tulkki havaitsee tämän tilanteen, JVM: n juuri-in-time (JIT) -kääntäjä kokoaa tavukoodisekvenssin natiivikoodiksi nopeamman suorituksen varmistamiseksi.

Suorituksen aikana tulkki tapaa tyypillisesti pyynnön suorittaa toisen luokkatiedoston tavukoodi (joka kuuluu ohjelmaan tai kirjastoon). Kun näin tapahtuu, classloader lataa luokkatiedoston ja tavukooditarkistaja tarkistaa ladatun luokkatiedoston tavukoodin ennen sen suorittamista. Myös suorituksen aikana tavukoodin ohjeet saattavat pyytää JVM: ää avaamaan tiedoston, näyttämään jotain näytöllä, antamaan ääntä tai suorittamaan toisen tehtävän, joka edellyttää yhteistyötä natiivialustan kanssa. JVM reagoi käyttämällä Java Native Interface (JNI) -sillateknologiaa vuorovaikutuksessa natiivialustan kanssa tehtävän suorittamiseksi.