Siirry sisaltoon

Java

Wikipediasta
Tama artikkeli kasittelee ohjelmointikielta. Muita merkityksia on tasmennyssivulla.
Java
Paradigma olio-ohjelmointi
Tyypitys vahva, staattinen
Yleinen suoritusmalli tulkattava
Muistinhallinta automaattinen
Julkaistu 1995
Kehittaja Eclipse Foundation (aiemmin Oracle Corporation ja Sun Microsystems)
Vakaa versio Java Standard Edition 20[1] (18. tammikuuta 2022)
Merkittavimmat toteutukset Oracle, IBM ja muut
Vaikutteet Objective-C, C++, Smalltalk, Eiffel
Vaikuttanut C#, D, J#, PHP
Kayttojarjestelma alustariippumaton
Verkkosivu https://www.oracle.com/java/technologies/
Uutisryhma comp.lang.java
Infobox OK

Java on Sun Microsystemsin kehittama teknologiaperhe ja ohjelmistoalusta, johon kuuluu muun muassa laitteistoriippumaton korkean tason, luokkapohjainen, oliopohjainen ohjelmointikieli, joka on suunniteltu siten, etta siina on mahdollisimman vahan toteutusriippuvuutta, seka ajoaikainen ymparisto virtuaalikoneineen ja luokkakirjastoineen. Java (ohjelmointikieli) on yleiskayttoinen ohjelmointikieli, jonka avulla ohjelmoijat voivat kirjoittaa koodia, joka kaantaessa toimii kaikilla Javaa tukevilla alustoilla ilman tarvetta kaantaa koodia uudelleen.

Java-sovellukset on tyypillisesti kaannetty tavukoodiin, joka voi toimia missa tahansa Java-virtuaalikoneessa (JVM) taustalla olevasta tietokoneen arkkitehtuurista riippumatta. Javan syntaksi on samanlainen kuin C:n ja C++:n, mutta siina on vahemman matalan tason toimintoja kuin kummallakaan. Java-ajonaika tarjoaa dynaamisia ominaisuuksia (kuten reflektointia ja ajonaikaisen koodin muokkausta), joita ei yleensa ole saatavilla perinteisilla kaannetyilla kielilla.

Vuodesta 2019 lahtien Java oli GitHubin mukaan yksi suosituimmista kaytossa olevista ohjelmointikielista, erityisesti asiakas-palvelin-verkkosovelluksissa, ja kehittajia on raportoitu 9 miljoonalla. Alun perin kaupallisesti lisensoitu Java on vuodesta 2007 alkaen ollut vapaan GNU GPL -lisenssin alainen. Vuonna 2006 arvioitiin, etta Java-alusta on kaytossa noin 3,8 miljardissa laitteessa jossakin muodossa.[2]

Javan ollessa yksi suosituimmista ohjelmointikielista, sen avulla tehty paljon tunnettuja ja menestyneita sovelluksia. Lisaksi Javaa on kaytetty paljon mm. graafisissa kayttoliittymissa, yrityssovelluksissa, tieteessa ja sulautetuissa jarjestelmissa, joista viimeisimmasta esimerkiksi SIM-kortit ja Blu-ray soittimet ovat laajassa kaytossa.[3][4][5]

Java nimettiin tammikuussa 1995 Yhdysvalloissa Javaksi kutsutun kahvilaadun mukaan, jota tuotetaan Jaavalla Indonesiassa. Ennen nimenmuutosta kehittajat olivat kayttaneet uudesta kielestaan nimea Oak ja sita ennen nimea Greentalk. Nimea Oak ei kuitenkaan voinut enaa kayttaa, koska Oak Technologies -yhtiolla oli siihen oikeudet. Uusi nimi valittiin palaverissa kymmenen ehdotuksen joukosta, joista aanestysvaiheeseen paasivat myos nimet DNA ja Silk. Nimen Java ehdottajasta on nykyisin erilaisia kasityksia.[6]

Ohjelmointikieli JavaScript nimettiin myohemmin Javan mukaan, mutta sita yhdistaa Javaan lahinna vain syntaksi.

James Gosling, Javan luoja, vuonna 2008.
Duke, Javan maskotti.

James Gosling, Mike Sheridan, and Patrick Naughton aloittivat Java-ohjelmointikieliprojektin kesakuussa vuonna 1991. Java oli alun perin suunniteltu interaktiiviselle televisiolle, mutta se oli liian kehittynytta sen aikaiselle kaapelitelevisioteollisuudelle. Java sai alkuperaisen nimensa Oak eraan Goslingin toimiston ulkopuolella olevan tammipuun mukaan. Myohemmin projektia kutsuttiin nimella Green, jonka jalkeen se uudelleennimettiin Javaksi eraan indonesialaisen kahvin, Java coffeen, mukaan. Gosling suunnitteli Javan kayttaen C/C++ tyylista syntaksia, joka olisi jo tunnettu systeemi ja sovellus ohjelmoijille.

Sun Microsystems julkaisivat ensimmaisen julkisen version nimella Java 1.0 vuonna 1996. Se lupasi 'write once, run anywhere' (WORA)-toiminnallisuuden, tarjoten maksuttomia ajoaikoja suosituilla alustoilla. Kohtuullisen turvallinen ja sisaltaen konfiguroitavan tietoturvan, Java sallii verkko- ja tiedostonkayttorajoituksia. Pian merkittavat verkkoselaimet sisallyttivat mahdollisuuden ajaa Java-sovelmia nettisivuilla, ja Javasta tuli nopeasti suosittu ohjelmointikieli. Arthur van Hoff uudelleenkirjoitti Java-kielella Java 1.0 kaantajan noudattamaan tarkasti Java 1.0:n kielispesifikaatioita. Java 2:n tulon myota (alun perin julkaistu nimella J2SE 1.2 joulukuussa vuonna 1998-1999) uudet versiot sisalsivat useita kokoonpanoja, jotka oli rakennettu erityyppisille alustoille. J2EE sisalsi teknologioita ja rajapintoja yrityssovelluksiin, jotka tyypillisesti ajettiin palvelinymparistossa, kun taas J2ME sisalsi optimoituja rajapintoja mobiilisovelluksille. Tyopoytaversiolle annettiin uusi nimi J2SE. Vuonna 2006, Sun uudelleennimesi uudet J2-versiot Java EE:ksi, Java ME:ksi ja Java SE:ksi markkinointisyista.

Vuonna 1997 Sun Microsystems otti yhteytta ISO/ICE JTC 1 Standartia hallinnoivaan elimeen ja myohemmin Ecna internationaaliin formalisoidakseen Javan, mutta lopetti pian prosessin.[7] Java sailyi standardina, jota ohjataan ja hallitaan Java-yhteisoprosessin kautta. Kerran Sun Microsystems teki suurimman osan sen Java-implemaatioista saatavaksi ilman maksua, vaikka ne olivat heidan omaa ohjelmistoa. Sun Microsystems sai tuloja myymalla lisensseja erikoistetuille ohjelmistoille, kuten Java Enterprise System ja Java Premium System.

Marraskuussa 2006 Sun Microsystems julkaisi suuren osan Java-virtuaalikoneestaan (JVM) vapaana ja avoimena lahdekoodina (FOSS) GPL-2.0 -lisenssin ehtojen mukaisesti. Toukokuussa 2007 Sun Microsystems valmisteli prosessin loppuun ja teki JVM:n ytimen koodin saataville ilmaisena avoimen lahdekoodin jakelun ehtojen mukaisesti lukuun ottamatta pienta osaa koodista, josta Sun Microsystems:illa itsellaan ei ollut tekijanoikeutta.[8]

Sun Microsystemsin varapuheenjohtaja Rich Green sanoi, etta Sunin ihanteellinen rooli Javan suhteen oli evankelista. Oracle Corporationin hankittua Sun Microsystemsin vuosina 2009-2010 Oracle on kuvannut itseaan Java-teknologian yllapitajana, jolla on jatkuva sitoutuminen yhteison osallistumiseen ja avoimuuteen. Tama ei estanyt Oraclea nostamasta pian sen jalkeen oikeusjuttua Googlen kayttaessa Javaa Android SDK:ssa (ks. Android-kohta).

Javan kaytto Android-pohjaisissa ohjelmissa johti oikeudenkayntiprosessiin Oraclen ja Googlen valilla vuonna 2012. Toukokuussa vuonna 2012 San Franciscolainen tuomaristo huomasi, etta jos tekijanoikeudet koskivat myos ohjelmointirajapintoja, niin Google olisi rikkonut Oraclen tekijanoikeuksia kayttamalla Javaa Android-laitteissa. Karajaoikeuden William Alsup maarasi 31. toukokuuta 2012 ettei ohjelmointirajapintoja voi suojata tekijanoikeuksilla, mutta tama laki evattiin myohemmin U.S. Court of Appeals for the Federal Circuitin puolesta toukokuussa 2014. Google todettiin syyttomaksi toukokuun 26, 2016, vetoamalla Java-ohjelmointirajapintojen reiluun kayttoon Androidissa. Oikeudenkaynti kuitenkin avattiin uudelleen maaliskuussa 2018, talla kertaa San Franciscon tuomioistuimessa. Google haastoi uudet syytokset vuonna 2019 ja oikeudenkaynti totesi Googlen jalleen syyttomaksi huhtikuussa 2021. Oikeus ei muokannut tekijanoikeuslakeja ohjelmointirajapintojen ymparilla tapahtuman seurauksena, vaan sanoi naiden olevan tapauskohtaisia.

James Gosling erosi Oraclelta 2. huhtikuuta 2010.[9]

Kun Java-kielta luotiin, siina oli viisi ensisijaista tavoitetta:

1. Kielen on oltava yksinkertainen, objekti-pohjainen ja tutun oloinen.

2. Sen on oltava vahva/tukeva seka turvallinen.

3. Sen on oltava arkkitehtuurisesti neutraali ja helposti siirrettava.

Yksi Javan tavoitteista oli siirrettavyys, mika tarkoittaa, etta Java-alustalle kirjoitettujen ohjelmien on toimittava samalla tavalla kaikenlaisilla laitteisto- ja kayttojarjestelmayhdistelmalla. Tama saavutetaan kaantamalla Java-kielinen koodi valimuotoon, jota kutsutaan tavukoodiksi, sen sijaan etta se kaannettaisiin suoraan arkkitehtuurikohtaiseksi konekoodiksi. Javan tavukoodin ohjeet ovat konekoodin kaltaisia, mutta ne suoritetaan virtuaalikoneella, joka on kirjoitettu erityisesti sille isantalaitteistolle. Loppukayttajat kayttavat yleisesti Java Runtime Environment -ohjelmaa, joka on asennettu heidan laitteeseensa itsenaisia Java-sovelluksia varten tai web-selainta Java-apletteja varten.

Universaalin tavukoodin kaytto tekee ohjelmien siirrettavyydesta helppoa. Kuitenkin tavukoodin tulkitsemisesta konekoodiksi aiheutuva ylimaarainen suoritusaika tekee tulkittavista ohjelmista lahes aina hitaampia kuin suorat suoritettavat ohjelmat. Itse Java on alustariippumaton ja sopeutuu kayttoalustaan kayttamalla sille tarkoitettua Java Virtual Machine (JVM), joka muuntaa Java-tavukoodin alustan konekielelle.

4. Sen taytyy suorittaa/toimia korkealla suorituskyvylla.

5. Sen on oltava tulkittu, saikeitetty ja dynaaminen.

Java ohjelmoinnin nelja periaatetta

Java-ohjelmointikielessa on nelja keskeista periaatetta, jotka tunnetaan nimella "Java-ohjelmoinnin nelja periaatetta" tai "The Four Pillars of Object-Oriented Programming". Nama periaatteet ovat:

  1. Kapselointi (encapsulation)
  2. Periytyminen (inheritance)
  3. Polymorfismi (polymorphism)
  4. Abstraktio (abstraction)

Kapselointi tarkoittaa luokkien kayttamista ohjelman eri osien eristamiseen toisistaan, mika helpottaa koodin yllapidettavyytta ja selkeytta. Kapselointi mahdollistaa sen, etta ohjelman osat ovat riippumattomia toisistaan, ja muutokset voidaan tehda vain yhteen luokkaan kerrallaan ilman etta tarvitsee huolehtia muista osista.

Periytyminen on periaate, joka mahdollistaa uusien luokkien luomisen jo olemassa olevien luokkien pohjalta. Tama saastaa aikaa ja vaivaa, silla jo olemassa olevia toimintoja ei tarvitse kirjoittaa uudelleen uutta luokkaa varten.

Polymorfirsmi tarkoittaa eri tyyppisten olioiden kayttamista yhden ja saman nimen alla, mika vahentaa koodin monimutkaisuutta ja tekee sen yllapidosta helpompaa. Polymorfismi mahdollistaa ohjelman osien vaihtamisen toisiin, kunhan ne toteuttavat saman rajapinnan.

Abstraktio tarkoittaa oleellisten yksityiskohtien keskittymista ja epaolennaisten yksityiskohtien poistamista koodista, mika helpottaa sen yllapidettavyytta. Abstraktio mahdollistaa koodin yksinkertaisuuden sailyttamisen ja helpottaa sen ymmartamista.

Nama nelja periaatetta ovat tarkeita Java-ohjelmoinnissa, silla ne tekevat koodista jasennellympaa, ymmarrettavampaa ja yllapidettavampaa.

Java-ohjelmointikielen kehittivat Bill Joy ja James Gosling kollegoineen Sun Microsystemsilla 1990-luvun alussa. JDK 1.0 (Java Development kit) julkaistiin syksylla 1995. Se soveltui www-sivulle luotavien applettien tekemiseen, mika nosti Javan nopeasti ohjelmointimaailman kuumimmaksi puheenaiheeksi. Kevaalla 1997 julkaistiin JDK 1.1, jossa oli muuttunut erityisesti kayttoliittyman ohjelmointi oliomaisempaan suuntaan. JDK 1.2 julkaistiin loppuvuonna 1998, ja se sisalsi uuden JFC-luokkakirjaston (Java Foundation Classes), jossa mukaan tuli mm. Swing kayttoliittymien luominen ja monipuolisia tietorakenneluokkia.

Java-kielen 1990-luvun lopulla saavuttaman suuren suosion takana ovat laitteistoriippumattomuuden lisaksi kielen C++-kielta laheisesti muistuttava, mutta helpommin omaksuttavaksi suunniteltu kielioppi, oliopohjaisuus ja virtuaalikoneen mukana tuleva, erittain kattava standardikirjasto. Myos muistinhallintaa on helpotettu ottamalla kayttoon roskienkerain (engl. garbage collector), joka vapauttaa muistia kun sita ei enaa tarvita. Java kuuluu ohjelmointikieliin, joissa on kaytossa ns. vahva tyypitys. Tama tarkoittaa sita, etta jokaisella muuttujalla on tyyppi ja muuttujat voivat saada ainoastaan tyyppinsa mukaisia arvoja.

Toisin kuin tavanomaisen kielet, Javan lahdekoodia ei kaanneta suoraan konekielelle, vaan tavukoodiksi, joka suoritetaan virtuaalikoneessa.[10] Koska Java-ohjelmat ajetaan virtuaalikoneessa, ne eivat normaalisti pysty vaikuttamaan suoraan muihin prosesseihin, eivatka paase virtuaalikoneelle maaratyn hiekkalaatikon ulkopuolelle vaan esimerkiksi tiedostoja kasitellessa kaskyt kulkevat virtuaalikoneen lapi, joka varmistaa etta kasky on turvallisuusasetusten mukainen. Java-ohjelmat ovat mm. naiden rajoitusten vuoksi tavanomaisia konekieliohjelmia turvallisempia, mutta samalla hieman hitaampia.

Javan standardikirjasto sisaltaa valmiita toteutuksia useille asioille, kuten graafisen kayttoliittymakirjaston, rinnakkaisuuden hallinnan, verkko-ominaisuudet ja eraat muut rajapinnat, jotka toisissa kielissa ovat kayttojarjestelmariippuvaisia tai kolmansien osapuolten kirjastojen varassa.

Javaa markkinoitiin alun perin Web-kayttoon, selaimen sisalla ajettavia sovelmia varten. Se loi kuitenkin varsinaisesti lapi palvelinkaytossa, dynaamisia www-sivuja luotaessa (JSF, JSP, servlet), raskaissa palvelinsovelluksissa (Java EE) ja kannykoissa ja taskutietokoneissa (Java ME). Yleisyytensa ja ilmaisuutensa ansiosta se on myos suosittu opetuskieli.

Java-alustan kayttoa ei ole rajattu Java-ohjelmointikieleen, vaan mm. Python-, Ruby- ja Scheme-kielille on olemassa kaantaja, joka tuottaa Java-tavukoodia. Sun Microsystemsin lisaksi ainakin IBM ja GNU ovat kehittaneet omat Java-kaantajansa ja IBM, Novell, BEA Systems ja Apache omat virtuaalikoneensa lukuisten avoimen lahdekoodin toteutusten (kuten Kaffe, SableVM, JamVM, CACAO, Jikes RVM, VMkit) lisaksi. GNU:n kaantajaymparistoon GCC:hen kuuluva GCJ osaa kaantaa Javaa konekielelle. GNU ryhtyi myos kehittamaan korvaavaa, vapaata luokkakirjastoa GNU Classpath -projektissa.

Sun ilmoitti 13. marraskuuta 2006 julkaisevansa Javan GNU GPL-lisenssilla.[11]

Googlen Android on kayttanyt Apache Harmony -toteutusta Javan kirjastoille, mutta siirtyi kayttamaan OpenJDK-toteutusta.[12] Vuodesta 2019 lahtien Kotlin on ollut suositeltu ohjelmointikieli Android-sovelluksille Javan sijaan.[13]

Sunin/Oraclen kehitysymparisto

[muokkaa | muokkaa wikitekstia]

Javaan kuuluu ohjelmointikieli, josta on julkaistu eri versioita kehitysympariston (Java Development Kit; JDK) kehittymisen myota. Kehitysymparistoon kuuluu kaantaja (javac) ja muut kehitystyokalut (jar, javadoc, jdb). Kehitysymparisto sisaltaa myos taydellisen ajoympariston (Java Runtime Environment; JRE), joka tarvitaan kaannettyjen ohjelmien ajamiseen. Ajoymparisto sisaltaa virtuaalikoneen (Java Virtual Machine; JVM), joka on JRE:n versiosta 1.2 (joulukuu 1998) lahtien sisaltanyt ajonaikaisen kaannoksen konekielelle (just-in-time compiler; JIT). Ajoymparistoon kuuluvat myos luokkakirjastot, jotka ovat nekin saaneet lisaa ominaisuuksia Javan kehittymisen myota. Java 1.2 brandattiin suurten muutosten vuoksi nimella Java 2. Java 2 -nimea ei kuitenkaan kaytetty markkinoinnissakaan kovin kauan, silla jo Java 1.5 brandattiin Java 5:ksi.

Ajoymparisto on nykyisin jaettu kolmeen osaan.

  • Java Standard Edition (Java SE) sisaltaa yleiset ominaisuudet, graafiset kayttoliittymat, tietokanta- (Java Database Connectivity; JDBC) ja perus-XML-rajapinnat.
  • Java Enterprise Edition (Java EE) on tarkoitettu palvelinsovellusten kehittamiseen ja ajamiseen ja sisaltaa mm. nimeamis- ja hakemistopalvelut (Java Naming and Directory Interface; JNDI), komponenttirajapinnan (Enterprise Java Beans; EJB), servlet- ja portlet-maarittelyt, JSP (JavaServer Pages) ja muita web-palvelintekniikoita.
  • Java Micro Edition (Java ME) on tarkoitettu teholtaan rajoittuneiden laitteiden ohjelmointiin, kuten matkapuhelimiin ja digibokseihin (Multimedia Home Platform; DVB-MHP). J2ME eroaa merkittavasti muista ymparistoista ja kayttaa rajoitetumpaa virtuaalikonetta (K Virtual Machine; KVM) ja jattaa toteuttamatta joitain kielen ominaisuuksia (kuten liukuluvut ja luokkien purkajat). Java ME on edelleen jaettu konfiguraatioihin ja profiileihin laitteiden ominaisuuksien mukaan.

Javan tarkeimmat julkaisuversiot ja niiden julkaisupaivat:

  • JDK Beta esiteltiin 1995.
  • JDK 1.0 esiteltiin 23. tammikuuta 1996.
  • JDK 1.1 esiteltiin 19. helmikuuta 1997.
  • J2SE 1.2 esiteltiin 8. joulukuuta 1998.
  • J2SE 1.3 esiteltiin 8. toukokuuta 2000.
  • J2SE 1.4 esiteltiin 6. helmikuuta 2002.
  • J2SE 5.0 esiteltiin 30. syyskuuta 2004.
  • Java SE 6 (koodinimi "Mustang") esiteltiin 11. joulukuuta 2006.
  • Java SE 7 (koodinimi "Dolphin") esiteltiin 28. heinakuuta 2011. Viestintavirasto ilmoitti elokuussa 2012, etta Java 7 aiheuttaa Windows-ymparistossa vakavan tietoturva-aukon ja kehottaa poistamaan version.[14] Tietoturva-aukkoon tuli korjaava paivitys 30. elokuuta 2012.[15] (Tuettu heinakuuhun 2022 asti)
  • Java SE 8 (koodinimi "Spider") esiteltiin 18. maaliskuuta 2014. (Tuettu joulukuuhun 2030 asti)
  • Java SE 9 esiteltiin 9. syyskuuta 2017.
  • Java SE 10 esiteltiin 20. maaliskuuta 2018.
  • Java SE 11 esiteltiin 25. syyskuuta 2018.[16] (Tuettu syyskuuhun 2026 asti)
  • Java SE 12 esiteltiin 19. maaliskuuta 2019.[17]
  • Java SE 13 esiteltiin 16. syyskuuta 2019.[18]
  • Java SE 14 esiteltiin 17. maaliskuuta 2020.[19]
  • Java SE 15 esiteltiin 15. syyskuuta 2020.[20]
  • Java SE 16 esiteltiin 16. maaliskuuta 2021.[21]
  • Java SE 17 esiteltiin 14. syyskuuta 2021.[22] (Tuettu syyskuuhun 2029 asti)
  • Java SE 18 esiteltiin 22. maaliskuuta 2022.[23]
  • Java SE 19 esiteltiin 20. syyskuuta 2022.[24]
  • Java SE 20 esiteltiin 21. maaliskuuta 2023.[25]
  • Java SE 21 julkaistiin 17. lokakuuta 2023.[26]

Osa Java-versioista kuuluu Oraclen laajennetun tien piiriin. Pidempaan tuettuja LTS-versioita (Long-Term-Support) ovat Java SE 7, 8, 11, 17 ja 21.[27]

Kehitysympariston asentaminen

[muokkaa | muokkaa wikitekstia]

Java SE Development Kit on yksityiskayttajalle ilmainen, jonka voit ladata Oraclen sivuilta, esim. https://www.oracle.com/in/java/technologies/downloads/ . Se tukee useimpia kayttojarjestelmia, kuten, Windowsi, linuxia, Mac OSia.

Oracle JDK 20 -sertifioidut jarjestelmakokoonpanot

Oracle JDK 20 -sertifioidut jarjestelmakokoonpanot Windowsille ovat: Windows Server 2022, Windows Server 2019 Windows Server 2016 Windows Server 2012 R2, Windows 2012, Windows 11 ja Windows 10.[28]

Linuxin osalta Oracle JDK 20 -sertifioituja jarjestelmakokoonpanoja ovat Oracle Linux:n versiot 6, 7, 7.9+,8 ja 9. Ubuntu Linux:n osalta sertifioituja jarjestelmakokoonpanoja ovat 22.04 LTS, 22.10 ja 23.04, Red Hat Enterprise Linux:n osalta taas versiot 6, 7, 7.9+,8 ja 9 ja Suse Linux Enterprise Server:n sertifioituja jarjestelmakokoonpanoja ovat versiot 12 ja 15.[28] Uudemmat Linuxin eri versiot versiot tukevat X.org-tilaa, mutta Wayland-tilaa ei tueta.[28]

MacOS alustoista tuettuina ovat versiot macOS 11, macOS 12 ja macOS 13[28]

Kaikki Oracle:n sivuilla mainitut kayttojarjestelmat ovat myos sertifioituja, kun niita kaytetaan virtuaalisena vierasjarjestelmana missa tahansa seuraavista hypervisoreista/sailoista, kunhan kyseinen hypervisori/sailo tukee kayttojarjestelmaa [29]:

  • Oracle VM
  • Docker
  • Microsoft Hyper-V Server

Riippuen haluamastasi versiosta ja kayttojarjestelmastasi, tarvitset n. 200Mb tilaa kovalevyllesi, jotta saat ladattua JDK asennustiedoston koneellesi, minka jalkeen voit asentaa sen itsellesi.

Turvallisuusarkkitehtuuri

[muokkaa | muokkaa wikitekstia]

Java-teknologian syntymisen ja kayttoonoton myota tietoturvallisuus on ollut merkittava aihe seka kiinnostuksen kohde. Java-alustan turvallisuus seka uudet tietoturvaongelmat, joita Java-teknologian kayttoonotto on aiheuttanut, ovat herattaneet yha kasvavaa huomiota. Teknologian tarjoajan nakokulmasta katsottuna Javan suojaus tarjoaa kaksi nakokulmaa[30]:

  • Tarjoaa turvallisen ja valmiin Java-alustan, jolla pystyy ajamaan Java-yhteensopivia sovelluksia turvallisesti
  • Tarjoaa Java-ohjelmointikielella toteutettuja tietoturvatyokaluja ja -palveluita, jotka mahdollistavat laajemman valikoiman turvallisuusherkkia sovelluksia esimerkiksi yrityksille

Hiekkalaatikkomalli

[muokkaa | muokkaa wikitekstia]

Java-alusta tarjoaa oman tietoturva-arkkitehtuurin, jota kutsutaan "hiekkalaatikoksi". Hiekkalaatikko on yksi Javan valmiista tietoturvaominaisuuksista ja sen avulla kayttajat voivat suorittaa rajoitetussa ymparistossa epaluotettavia tai huonosti kirjoitettua koodeja. "Hiekkalaatikkoymparistossa" voidaan estaa koodia paasemasta tietyille alustan ominaisuuksille ja API-rajapinnoille. Koodia voidaan esimerkiksi estaa lukemasta tai kirjoittamasta tiedostoja paikallisessa tiedostojarjestelmassa tai estaa sita suorittamasta mielivaltaisia komentoja seka estaa paasy verkkoihin. Hiekkalaatikkomalli otettiin kayttoon Java Development Kitin (JDK) kautta, ja se otettiin yleisesti kayttoon JDK 1.0:lla rakennetuissa sovelluksissa, mukaan lukien Java-yhteensopivissa verkkoselaimissa. JDK 1.1 laajensi tata mallia tuomalla mukaan allekirjoitetun sovelman (signed applet) kasitteen; jos sovelma oli allekirjoituksen perusteella luotetun tahon valmistama, se sai jarjestelmaan taydet valtuudet. Jos nain ei ollut, sovelma suoritettiin edelleen hiekkalaatikossa. Java SE -ymparistossa hiekkalaatikkomalli on entista kehittyneempi tuoden mukanaan muun muassa hienostuneemman kayttooikeuksien hallinnan, helpommin konfiguroitavan turvallisuuspolitiikan ja helpommin laajennettavan kayttooikeuksien hallintarakenteen seka turvatarkistusten laajentamisen kaikkiin Java-ohjelmiin, mukaan lukien sovellukset ja appletit. [30]

Alkuperainen hiekkalaatikkomalli. JDK 1.0 Security Model.

Sovelluskohteet

[muokkaa | muokkaa wikitekstia]

Javan ensimmainen kohdeymparisto oli web-selaimet, joissa Java-sovelmia (applet) voitiin ajaa turvallisesti. Appletit olivat osa jo ensimmaista Java-julkaisua 1995. Tekniikan otti omakseen erityisesti Netscape selainsodissa Microsoftia vastaan. Myos Microsoft kehitti oman virtuaalikoneensa MSJVM:n, jonka toteutuksesta se joutui oikeusjutun kohteeksi Sunin taholta. Microsoft luopui Javan kehityksesta 2001 ja nyttemmin luonut oman lahes samanlaisen kilpailevan tekniikkansa (.NET ja C#). Applettien suosio on jaanyt vahaiseksi ja muut tekniikat, kuten Flash ovat ottaneet paikan yksinkertaisten selainsovellusten luonnissa. Myoskaan Java-pohjaiset verkkotietokoneet (JavaStation, JavaOs), joita useat valmistajat esittelivat, eivat yleistyneet.

Verkon yli ladattavien sovellusten luontiin Oraclella on Java Web Start -tekniikka, joka mahdollistaa taydellisten sovellusten suorittamisen verkon yli. Java Web Start esiteltiin maaliskuussa 2001 ja Java versiosta 1.4 lahtien se on ollut osana JRE:ta.

Java Servlet API on dynaamisten websivujen kehittamiseen tarkoitettu rajapinta. Se on osa Java EE -pakettia. Servlet-rajapinnan toteuttaa servlet container (joskus kaannetty suomeksi termilla kontti). Container tarjoaa web-palvelimen, jonka toiminnallisuutta voi laajentaa omilla komponenteilla hyodyntaen Javan rajapintoja. Container tarjoaa suoraan joitain palveluja, kuten istunnonhallinnan. JavaServer Pages (JSP) on Servlet API:a kayttava tekniikka, joka kayttaa yksinkertaista merkkauskielta HTML:n seassa hyodyntamaan palvelimella olevien komponenttien toiminnallisuutta tai sisaltaa suoraan Java-koodia. JSP muistuttaa lahinna CGI- tai PHP-skriptausta.

Enterprise JavaBeans (EJB) on Servlet API:n kaltainen tekniikka, mutta on tarkoitettu etupaassa tietokantakayttoon. EJB-komponentit (pavut) ajetaan sovelluspalvelimessa, joka tukee hajauttamista, transaktioita ja rinnakkaisuuden hallintaa. Sunin maarittelemaa rajapintaa hyodyntavien servlet- ja EJB-tekniikoiden hyotyna on se, etta periaatteessa sama sovellus on ajettavissa kaikissa rajapinnan toteuttavissa sovelluspalvelimissa. Naita ovat esim. JBoss, IBM WebSphere Application Server, Oracle GlassFish ja Oracle WebLogic.

Javaan on saatavilla JavaFX-ohjelmointialusta [31], jonka ensimmainen versio julkaistiin vuonna 2008. [32] JavaFX:n oli alun perin tarkoitus korvata Swing API kokonaan[33], mutta myohemmin aikeesta on luovuttu [32].

Apache-saatio kehitti Javalle avoimen lahdekoodin tyokaluja Jakarta-projektissa. Projektin nimi siirtyi Eclipse-saation Java-laajennusten paketin nimeksi samassa yhteydessa kun Eclipse otti kehitettavakseen Apachen J2EE-sovelluspalvelimen. Useat Apachen Java-projektit on eriytetty omiksi ohjelmapaketeikseen, esim. Apache Ant. Apachen yleiset Java-kirjastot tunnetaan nykyisin nimella Apache Commons.

Ohjelmointiymparistot

[muokkaa | muokkaa wikitekstia]

Javalle on olemassa monia erilaisia ohjelmointiymparistoja, jotka tarjoavat erilaisia ominaisuuksia ja tyokaluja. Ilmaisia ovat esimerkiksi NetBeans ja Eclipse ja BlueJ. Kaupallisia ovat esimerkiksi JetBrainsin IntelliJ IDEA. Googlen Android Studio on virallinen ymparisto Android-kehitykseen ja tukee myos muilla kielilla kehittamista.

Perusominaisuudet

[muokkaa | muokkaa wikitekstia]

Java tukee tyypillisia toistorakenteita (for, while) ja ehtolauserakenteita (if, else, switch).[34]

Javassa osoittimelle voidaan antaa arvoksi null eli tyhja. Kyseista erikoisarvoa kutsutaan null-osoittimeksi, joka tarkoittaa, etta osoitin ei osoita mihinkaan. Null ei ole tyyppi tai olio itsessaan, vaan viittaus, joka ei osoita mihinkaan. Null on oletusarvo minka tahansa viitetyypin muuttujalle, jota ei ole alustettu ilmoitushetkella. Tama koskee kaikenlaisia muuttujia, instanssimuuttujia tai staattisia muuttujia, paitsi etta kaantaja varoittaa, jos kayttaa paikallista muuttujaa alustamatta sita. Null-arvoa kaytetaan usein osoittamaan, etta viitemuuttujaa ei ole alustettu tai etta menetelma ei palauttanut kelvollista objektiviittausta. On tarkeaa huomata, etta null-arvo voidaan maarittaa vain viitetyypeille, minka myota sita ei voi maarittaa primitiivisille muuttujille, kuten int, double, float tai boolean. Java:n instanceof -tyyppivertailuoperaattori kokeilee, onko objekti tietyn tyypin esiintyma. Se myos vertaa ilmentymaa tyyppiin ja palauttaa joko true(tosi) tai false(epatosi). Jos instanceof-operaattoria kaytetaan minka tahansa muuttujan kanssa, jolla on null-arvo, se palauttaa arvon false. [35]

Olio-ohjelmointi

[muokkaa | muokkaa wikitekstia]

Java tukee olio-ohjelmointia. Kielessa voidaan kayttaa luokkia, joiden jasenena olevia aliohjelmia kutsutaan metodeiksi.[36]

Metodien maarittelyssa kerrotaan paluuarvon tyyppi, nimi ja valinnaisia ominaisuuksia (parametrit, nakyvyys ja niin edelleen).[37] Java tukee poikkeuksia.[38][39]

Muiden luokkien paasya voidaan rajoittaa. Paatasolla nakyvyys voi olla julkinen (public) tai pakettikohtainen. Jasentasolla nakyvyys voi olla public, private tai protected. Jos nakyvyytta ei maaritella luokalle se nakyy vain sen paketille.[40]

Java rakennettiin lahes yksinomaan oliokieleksi, joten Java-kieliset ohjelmat ovat lahes aina oliopohjaisia ohjelmia. Olio-ohjelmointi onkin nykypaivana yksi ohjelmointi alan tarkeimmista tyokaluista, jonka avulla voidaan luoda tehokkaampia, joustavampia ja helpommin yllapidettavissa olevia ohjelmistoja. Java onkin usein kaytetty ohjelmointikieli oliopohjaisessa ohjelmoinnissa.lahde?

Olio-ohjelmoinnin perusperiaatteisiin kuuluu kapselointi, periytyminen, polymorfismi ja abstraktio. Nama auttavat ohjelmiston kehittajia luomaan modulaarisia ohjelmistoja, joissa eri osat ovat itsenaisia ja ovat helposti laajennettavissa. Taman avulla koodia voidaan uudelleenkayttaa ja nain vahentaa saman tai samantyylisen koodin toistamista ohjelmistoissa. Olio-ohjelmointi tekee isojen ohjelmien koodista helpommin organisoitavaa. Tama auttaa ohjelmistojen kehittajia tyoskentelemaan tehokkaammin yhdessa ja monimutkaisten ohjelmistojen hallitsemissa. Olio-ohjelmoinnin merkitys tulee tulevaisuudessa vain kasvamaan ohjelmistojen kehittyessa yha monimutkaisimmiksi.kenen mukaan?lahde?

Kapseloinnilla tarkoitetaan tiedon piilottamista. Eli luokan sisaiset yksityiskohdat voidaan piilottaa ulkopuolisilta.lahde?

Periytymisella tarkoitetaan sita, etta lapsiluokka perii vanhempiensa tiedot ja toiminnallisuudet. Tata voidaan havainnollistaa esimerkiksi niin, etta koira ja kissa ovat kummatkin erilaisia elaimia, mutta ne molemmat ovat nisakkaita. Talloin he perivat nisakkaan ominaisuudet, mutta niilla on myos omia ominaisuuksia.lahde?

Polymorfismilla tarkoitetaan olioiden kykya ottaa monta muotoa. Esimerkiksi ihminen voi olla jonkun puoliso, lapsi ja tyontekija samaan aikaan, mutta kayttaytyy eri tavalla naissa tilanteissa.lahde?

Abstraktio tarkoittaa kokonaisuuksien kasittelya, jossa tarkennetaan tarvittaessa.lahde?

Olio-ohjelmoitaessa pyritaan luokilla ja niiden ilmentymilla tyypillisesti mallintamaan jotain todellisen elaman prosessia tai toiminnallisuutta. Olio-ohjelmoinnissa instanssit ovat interaktiivisia ja niiden ominaisuudet, kuten metodit ja muuttujat vastaavat realistista kayttotarkoitusta.[41] Hyvan tyyliohjeen mukaisesti esimerkiksi "Elain" -luokalla voi olla ainoastaan eri "elain" -ilmentymia, kuten siili tai kissa. Vastaavasti nailla olioilla voi olla vain loogisesti yhteensopivia muuttujia kuten "nimi" tai "ika", eika esimerkiksi "teho" tai "polttoainetankin tilavuus".

Javan ja olio-ohjelmoinnin eri ominaisuudet ja perusperiaatteet kuten nakyvyyden rajoittaminen ja periytyminen oikein ja yhdessa kaytettyna ohjaavat jasentelemaan koodia siten, etta se mallintaisi todellista maailmaa tai vahintaankin jotain kiinteaa systeemia. Esimerkiksi elain olion, kuten "kissa", kyky peria kantaluokaltaan kaikille elaimille tyypillisia piirteita kuvastaa hyvin olio-ohjelmoinnin reaalimaailman mallintamisen periaatetta. Laadukas oliopohjainen ohjelma nayttaa ulospain ryhmalta olioita, jotka toimivat keskenaan omien tarkoitustensa pohjalta ja kommunikoivat niiden toisilleen tarjoamien rajapintojen avulla.

Jokaisella oliolla on oma tehtava ja tarkoituksensa eika muiden olioiden tarvitse valttamatta tietaa mista piilotetuista metodeista ja muuttujista olio tarkalleen muodostuu. Esimerkiksi "kuljettaja" -olion ei tarkalleen tarvitse tietaa miten "auto" -olio toimii. Sille riittaa, etta se voi kayttaa "auto" -olion toiminnallisuuksia, kuten "kaynnista moottori", "aja" tai "kaanny". Tama rajapintojen muodostama abstraktio tekee olio-ohjelmoinnista joustavan ja helposti laajennettavissa olevan ohjelmointikielen. Olioiden muodostamien rajapintojen avulla laajennusten yhteensovittaminen on suhteellisen yksinkertaista, kunhan tunnetaan rajapintojen mahdolliset rajoitteet ja oikeat toiminnallisuudet.

Javan syntaksi on ottaa suurimman osan paapiirteistaan C++ ja C ohjelmointikielista. Toisin kuin C++, joka yhdistaa syntaksinsa jarjesteltyyn, geneeriseen ja oliopohjaiseen ohjelmointiin, Java rakennettiin puhtaaksi olio-ohjelmointikieleksi. Kaikki koodi on kirjoitettu luokkien sisalle, ja jokainen tietokohde on olio, poikkeuksena ovat kuitenkin primitiiviset datatyypit, (kuten esimerkiksi kokonaisluvut ja Boolen arvot), jotka eivat ole oliota suorituskykyyn liittyvien syiden takia. Java uudelleen kayttaa joitain suosittuja C++ ominaisuuksia.

Toisin kuin C++, Java ei tue operaattorin ylirasitusta tai monimuotoista periytymista luokille, mutta toisaalta monimuotoinen periytyminen on tuettu kayttoliittymille.

Java kayttaa saman tyyppisia kommentteja kuin C++. On olemassa kolme erilaista tyylia kommentoida: yhden rivin tyyli merkittyna kahdella kenoviivalla (//), monen linjan tyyli aloitettuna talla /* ja lopetettuna talla */, ja Javadoc kommentointi tyyli aloitettuna talla /** ja lopetettuna talla */. Javadocin tyyli kommentoida mahdollistaa sen, etta kayttaja voi ajaa Javadoc suoritettavan luodakseen dokumentointia ohjelmalle. Sen dokumentoinnin voi mahdollisesti lukea integroiduilla kehitysymparistoilla (IDE:t) , kuten Eclipsella antaakseen mahdollisuuden kehittajille paasta dokumentointiin kasiksi IDE:n sisalla.

Tunnistin

Tunnistin on koodissa olevan elementin nimi. On olemassa tiettyja vakiintuneita nimeamiskaytantoja, joita tulee noudattaa elementtien nimien valinnassa. Javassa tunnisteet ovat kirjainkoosta riippuvaisia.

Tunnistin voi sisaltaa:

-Minka tahansa Unicode-merkin, joka on kirjain (mukaan lukien numeroa esittavat kirjaimet, kuten roomalaiset numerot) tai numero.

-Valuuttamerkin (kuten Y=).

-Yhdistavan valimerkin (kuten _).

Tunnistin ei voi:

-Aloittaa numerolla.

-Olla yhta kuin varattu avainsana, null-arvo tai boolean-literal.

Muuttujat

Muuttujat ovat tunnisteita, jotka liittyvat arvoihin. Ne julistetaan kirjoittamalla muuttujan tyyppi ja nimi, ja ne voidaan halutessaan alustaa samassa lausekkeessa antamalla sille arvo.

int count; //Declaring an uninitialized variable called 'count', of type 'int' count = 35; //Initializing the variable

int count = 35; //Declaring and initializing the variable at the same time

int count; //Declaring an uninitialized variable called 'count', of type 'int'
count = 35; //Initializing the variable
int count = 35; //Declaring and initializing the variable at the same time

Useita saman tyyppisia muuttujia voidaan julistaa ja alustaa yhdessa lausekkeessa kayttaen pilkkua erotinmerkkina.

int a, b; //Declaring multiple variables of the same type
int a = 2, b = 3; //Declaring and initializing multiple variables of the same type


Operaattorit Javassa ovat samankaltaisia kuin C++:ssa. Kuitenkin Javassa ei ole poisto-operaattoria roskien keraysmekanismien vuoksi, eika osoittimiin liittyvia toimintoja, koska Java ei perustu osoittimiin, seka Java suorittaa muistinhallinnan automaattisesti, ilman etta ohjelmoijan tarvitsee manuaalisesti allokoida muistia. Toinen ero on, etta Javassa on merkitsematon oikeanpuoleinen siirto-operaattori (>>>), kun taas C: n oikeanpuoleinen siirto-operaattorin merkki riippuu tyypista. Javassa operaattoreita ei voi ylikuormittaa.

Etusija Operaattori Kuvaus Liitannaisyys
1 ()[]

,

Metodin kutsu, taulukon taytto

Luokan jasenten valinta

Vasemmalta oikealle
2 ++ -- Jalkikateen lisaaminen ja vahentaminen
3 ++ --

+ -

! ~

type (val)

new

Etukateen lisaaminen ja vahentaminen

Yksittainen plus- ja miinusmerkki

Looginen EI ja binaarinen EI

Tyyppimuunnos

Luokan ilmentyma tai taulukon luominen

Oikealta vasemmalle
4 * / % Kertolasku, jakolasku ja jakojaannos Vasemmalta oikealle
5 + -

+

Yhteen- ja vahennyslasku

Merkkijonojen yhdistaminen

6 << >> >>> Bittioperaatiot: vasen siirto, merkitseva oikea siirto ja merkitsematon oikea siirto
7 < <=

> >=

instanceof

Suhteellinen "pienempi kuin" ja "pienempi tai yhta suuri kuin"

Suhteellinen "suurempi kuin" ja "suurempi tai yhta suuri kuin"

Tyypin vertailu

8 == != Vertailuoperaattorit: "yhta suuri kuin" ja "ei yhta suuri kuin"
9 & Binaarinen ja looginen JA
10 ^ Binaarinen ja looginen XOR (poissulkeva tai)
11 | Binaarinen ja looginen TAI (sisallyttava tai)
12 && Looginen ehdollinen JA
13 || Loginen ehdollinen TAI
14 c ? t : f Kolminkertainen ehdollinen (katso ?:) Oikealta vasemmalle
15 =+= -=

*= /= %=

<<= >>= >>>=

&= ^= |=

Yksinkertainen sijoitus, summan ja erotuksen mukainen sijoitus

Tulon, osamaaran ja jakojaannoksen mukainen sijoitus

Sijoitus binaarisella vasemmalle siirrolla, merkitsevalla oikealle siirrolla ja merkitsemattomalla oikealle siirrolla

Binaarisen JA, XOR- ja TAI-laskun mukainen sijoitus

Javassa ohjelmoija joutuu antamaan nimen eli tunnuksen monille asioille. Esimerkiksi luokat, muuttujat, attribuutit ja metodit tarvitsevat tunnuksen. Javassa tunnus saa sisaltaa kirjaimia, numeroita ja alaviivan _. Dollarin merkkia $ ja plussaa + ei kannata kayttaa omien luokkien nimissa, koska naita Java kayttaa nimetessaan sisaluokkia ja luetellun tietotyypin vakiarvoja. Valilyonteja tai muita tyhjatilamerkkeja ei saa sisaltya tunnukseen. Tunnuksella ei ole pituusrajoitusta ja sen pitaa alkaa kirjaimella. Hyvin kuvaavia nimia saa kayttaa tunnuksen nimeamisessa. Tunnuksista pitaa tehda kuvaavia ja sopivan pituisia. Tunnukset, jotka ovat liian pitkia, ennemminkin tekevat koodista epaselvaa luettavaa kuin auttavat koodin ymmartamisessa. Tunnus ei saa olla mikaan Javan avainsanoista.[42]

Isot ja pienet kirjaimet tarkoittavat tunnuksissa eri asiaa. Monisanaisten tunnusten sanojen alkukirjaimet kirjoitetaan aina isolla kirjaimella, mika on vakiintunut tapa Javassa. Luokan nimessa ensimmaisen sanan alkukirjain on tapana kirjoittaa isolla kirjaimella. Muuttujien, attribuuttien ja metodien nimissa pienta alkukirjainta kaytetaan ensimmaisen sanan alkukirjaimena. Esimerkiksi Raketti, RakettiMoottori, RakettiLaukaisualusta ja Alus ovat nimeamissaannon perusteella luokan nimia. Nimeamissaannon perusteella muuttujien, attribuuttien ja metodien nimia ovat esimerkiksi raketti, rakettiMoottori, rajaytaAlus ja ajaa.[42]

Erikoiset merkit voivat aiheuttaa ongelmia tiedostojen nimissa, minka takia luokkien nimeamisessa kannattaa kayttaa vain merkkeja a-z. Esimerkiksi Aiti on huono luokan nimi, koska se sisaltaa a-kirjaimen.[42]

Tyypillinen "Hello, World" -esimerkki:

public class HelloWorld {
public static void main(String[] args) {
// Tulostetaan teksti "Hello, world"
System.out.println("Hello, world!");
}
}

Java-ohjelmoinnissa kaikki lahdetiedostot tulee nimeta niiden sisaltavan julkisen luokan mukaan ja lisaksi siihen on liitettava jalkiliite .java. Ylla esiintyvassa esimerkkitapauksessa tama tarkoittaa sita etta taman public-class ( julkisen luokan ) nimen ollessa HelloWorld, tulee lahdetiedosto tallentaa seuraavalla nimella (HelloWorld) ja jalkiliitteella (.java) HelloWorld.java Ensin java-kaantajan on kaannettava tama tavukoodiksi ja tuotettava .class paatteinen tiedosto. Esimerkkitapauksessa tata vastaa HelloWorld.class. Vasta taman jalkeen tuotos voidaan suorittaa tai kaynnistaa.

Java-lahdekooditiedosto voi sisaltaa vain yhden julkisen luokan, mutta siina voi olla useita luokkia, joilla on ei-julkisen paasyn maarittava muuttuja seka mita tahansa maaraa julkisia sisaluokkia. Kun lahdekooditiedosto sisaltaa useita luokkia, yhden niista (joka on maaritelty class-avainsanalla) taytyy olla julkinen (jota edeltaa public-avainsana) ja lahdekooditiedosto taytyy nimeta kyseisen julkisen luokan nimella.

Luokka, joka ei ole julkinen, voidaan tallentaa mihin tahansa .java-tiedostoon. Kaantaja generoi luokkatiedoston jokaiselle lahdekoodissa maaritellylle luokalle. Luokkatiedoston nimi on luokan nimi, johon on lisatty .class-paate.

Metodi nimi main ei ole avainsana Java-ohjelmointikielessa, vaan ns. 'paaohjelmametodi'. Java-ohjelma kaynnistetaan kaynnistamalla luokka, jossa main- metodi on. Tata metodia voidaan kayttaa missa tahansa luokassa, joka on osana ohjelmaa. Main- metodin sisaltavalla luokalla voi olla mika vain nimi, mutta yleensa naita luokkia kutsutaan vain Main nimella.

Avainsanojen merkitysta esitellaan alla seuraavasti:

Avainsana public kertoo, etta metodin voi kutsua muista luokista, tai etta luokkaa voi kayttaa myos luokkahierarkian ulkopuolella olevat luokat. Luokkahierarkia liittyy siihen kansioon, jossa .java-tiedosto sijaitsee, ja tata kutsutaan paasya maarittavaksi muuttujaksi. Muita paasya maarittavia muuttujia ovat private (metodi, johon paasee vain samassa luokassa) ja protected (joka sallii kayttaa koodia samasta paketista). Jos koodi yrittaa kayttaa yksityisia tai suojattuja metodeja, JVM antaa SecurityExceptionin. Esimerkki julkisesta ja ei-julkisesta metodista julkisessa luokassa:

public class MainClass {

public void publicMethod() {
System.out.println("Tama on julkinen metodi");
}
private void nonPublicMethod() {
System.out.println("Tama on ei-julkinen metodi");
}
}

Avainsana static metodin edessa tarkoittaa, etta kyseessa on staattinen metodi, joka on assosioitu vain luokkaan eika mihinkaan tiettyyn luokan instanssiin. Vain staattisia metodeja voi kutsua ilman viittausta olioon. Staattiset metodit eivat voi kayttaa luokan jasenia, jotka eivat ole staattisia. Metodit, joita ei ole maaritelty staattisiksi vaativat tietyn luokan esiintyman toimiakseen.

Avainsana Void osoittaa, etta paamenetelma ei palauta kayttajalle mitaan arvoa. Mikali Java-ohjelman on tarkoitus poistua ohjelmasta virhekoodilla, sen taytyy kutsua nimenomaisesti metodia System.exit().

Javassa on 53 avainsanaa, jotka on luokiteltu useisiin luokkiin, kuten paasymuuntimet, ohjauskulku, luokat ja tietotyypit. Esimerkkeja kayttooikeusmaarityksista ovat "public," "private," ja "protected", jotka maarittelevat luokan tai menetelman laajuuden. Ohjauskulun avainsanat, kuten "if", "else", "for" ja "while", antavat ohjelmoijille mahdollisuuden maarittaa ehdollisen logiikan ja silmukat. Luokkiin ja tietotyyppeihin liittyvia Java-avainsanoja ovat "class," "interface," "enum," "extends" ja "implements". Naiden avainsanojen avulla ohjelmoijat voivat maarittaa luokkia, rajapintoja ja enumeja seka ilmoittaa ja alustaa eri tietotyyppien muuttujia.

Javassa on geneerisen ohjelmoinnin tuki sen tyyppijarjestelmassa.[43] Generics on lisatty JDK versiossa 5.[44]

Esimerkiksi ArrayList on listarakenne, joka tukee geneerista ohjelmointia.[45]

ArrayList on dynaaminen lista, joka toimii huomattavasti tehokkaammin kuin perinteiset taulukot.

Esimerkki ArrayListin kaytosta:

import java.util.ArrayList;

...
// ArrayList, joka hyvaksyy String-tyypin
ArrayList<String> hedelmaSalaatti = new ArrayList<>();
hedelmaSalaatti.add("Omena");
hedelmaSalaatti.add("Mango");

for (String hedelma: hedelmaSalaatti)
{
System.out.println("- " + hedelma);
}

Ylla havainnollistettu "import java.util.Arraylist" on ArrayList:n sijaitsema kirjasto ja sen tuominen java-ohjelmaan mahdollistaa ArrayList:n kayton. Listaa pystytaan hyodyntamaan katevasti myos luokkien valilla ja siihen liittyva toiminta voi tapahtua toisen luokan metodeilla.

Tassa esimerkissa ArrayListin kaytto toimii seuraavalla tavalla:

Maaritellaan lista "ArrayList", mita tietotyyppia listaan syotetaan tai alemman esimerkin mukaan , mita tietoa listaan syotetaan "hedelmaSalaatti". Luodaan uusi lista "new Arraylist<>()". Tyypiksi voidaan maaritella ainoastaan luokkia, eika primitiivisia datatyyppeja voida kayttaa. Jokaiselle primitiiviselle datatyypille on oma "luokkaversionsa" (wrapper).

Listaan voidaan lisata tietoja.add menetelmalla, tassa tapauksessa hedelmaSalaatti .add(). Listalta voidaan myos poistaa tietoja metodilla .remove. Tassa tilanteessa hedelmaSalaatti.remove(). Size metodilla voidaan tulkita listan koko, joka toimii seuraavasti ylla olevaa esimerkkia hyodyntaen: hedelmaSalaatti.size(). Vastaavasti get-metodilla voidaan nayttaa tietylla indeksilla varustettu alkio seuraavasti: hedelmaSalaatti.get(0). Tassa etsimme listan 0:n alkion, mika vastaa ensimmaista jasenta.

Vastaavasti sita kayttaa myos muilla tietotyypeilla:

// ArrayList, joka hyvaksyy int-tyypin
ArrayList<Integer> hedelmaSalaatti = new ArrayList<>();
hedelmaSalaatti.add(1);
hedelmaSalaatti.add(2);

Java-ohjelmointikielessa kommentit ovat valttamaton osa koodia, jonka avulla kehittajat voivat dokumentoida ja selittaa ohjelmakoodia. Kommentit ovat tarkeita, koska ne helpottavat ohjelman ymmartamista ja yllapitoa, auttavat valttamaan virheita seka mahdollistavat koodin nopean paivittamisen ja muokkaamisen. Java tukee kahta erilaista kommentointityyppia: yksirivisia ja monirivisia kommentteja.

Yksiriviset kommentit aloitetaan kahdella etuliitteella "//" ja ne paattyvat automaattisesti rivin loppuun. Yksirivisia kommentteja kaytetaan yleensa lyhyisiin selityksiin, kuten muuttujien tai metodien nimien selittamiseen.

Moniriviset kommentit aloitetaan "/" merkinnalla ja paattyvat "/" merkinnalla. Monirivisia kommentteja kaytetaan yleensa laajempiin selityksiin, kuten ohjelman toimintaa selittamiseen tai koodin osien dokumentointiin. Monirivisia kommentteja voidaan kayttaa myos tilanteissa, joissa koodia ei haluta suorittaa, mutta sita ei haluta poistaa kokonaan koodista. Tama on hyodyllista esimerkiksi testauksen yhteydessa, kun halutaan jattaa tiettyja testilohkoja kommentoituna kayttoon myohempaa kayttoa varten.

Kommentit ovat tarkeita myos siksi, etta ne helpottavat koodin yllapidettavyytta ja mahdollistavat koodin ymmarrettavyyden muille kehittajille. Koodin ymmarrettavyys on erityisen tarkeaa, kun useampi kehittaja tyoskentelee saman projektin parissa tai kun projektin yllapitoa siirretaan toiselle kehittajalle. Kommentit helpottavat myos ohjelmakoodin testausta ja vahentavat virheiden riskia.

On tarkeaa kayttaa kommentteja harkiten ja jarkevasti. Liikaa kommentteja voi tehda koodista sekavan ja hankalan lukea, kun taas liian vahan kommentteja voi tehda koodista vaikeasti ymmarrettavaa. Hyva kaytanto on lisata kommentteja aina silloin, kun koodi ei ole ilmeisen selvaa tai se saattaa aiheuttaa epaselvyyksia muille kehittajille.

Periytyminen (inheritance) on yksi Javan eli olio-ohjelmoinnin perusperiaatteita. Sen avulla voidaan vahentaa turhan koodin toistamista. Siina luokat voivat peria ominaisuusia ylemmilta luokilta. Tallaista luokkaa, joka perii ylemman luokan ominaisuuksia, kutsutaan lapsiluokaksi. Vastaavasti luokkaa, jonka ominaisuuksia peritaan, kutsutaan lapsiluokan kantajaksi. Lapsiluokan kantaluokassa voidaan maaritella muuttujia ja metodeja, joita lapsiluokka perii ja voi kayttaa. Ehtona talle on kuitenkin se, etta lapsiluokan kantaluokassa niiden nakyvyysmaare on maaritelty suojattuna eli kyseessa on protected.

Kantaluokan toteutus metodille perityy lapsiluokalle Javassa. Lapsiluokalle on kuitenkin mahdollista kirjoittaa oma toteutuksensa metodille vanhan tilalle. Korvaavan metodin tulisi silti tayttaa sama palvelu kuin alkuperaisen eri toteutuksella samaan rajapintaan. Lapsiluokan ilmentymaa kutsuessa tulee kutsua kantaluokan rakentajaa. Javassa lapsiluokka kutsuu kantaluokan oletusrakentajaa automaattisesti. Java kayttaa avainsanaa super oletuksen muuttamiseen. Oletuksen muuttamiseksi on kantaluokassa maariteltava parametriton rakentaja lapsiluokan kayttoon. super -avainsanalla paastaan kasiksi lapsiluokasta kantaluokan rakentajiin.

Rajapintaluokkaa kaytetaan myos jaetun toiminnallisuuden eristamiseen. Luokan tehtavana on maarittaa rajapinta, jota ohjelmiston luokat voivat ilmoittaa kayttavansa. Rajapintaluokka sisaltaa vain staattisia ja julkisisa vakiotietokenttia, ilman mahdollisuutta kayttaa itseaan kantaluokkana periytymisessa. Mika tahansa ohjelmisto voi taman sijasta ilmoittaa toteuttavansa rajapinnan. Maarittely tehdaan vaihtamalla normaalin luokan class -avainsana avainsanaksi interface. Luokasta ei voi luoda ilmentymia eika maaritella rakentajaa. Ainoat hyvaksytyt tietokentat ovat luokkamuuttujavakioita. Rajapintaluokan kaikki metodit ovat abstrakteja metodeja. Metodien tulee myos olla julkisia. Mikali nakyvyysmaareita public, static tai final ei olla sisallytetty metodeiden maarittelyyn, ne lisataan maaritelmaan automaattisesti.

Ajatellaan periytymista seuraavan esimerkin avulla. Kaikille moottoriajoneuvoille (lapsiluokan kantaluokka) yhteisia muuttujia voisi olla valmistaja, polttoaine seka moottorin kapasiteetti. Vastaavasti yhteisia metodeja kaikille moottoriajoneuvoille voisi olla moottorin sammutus seka kaynnistys. Moottoriajoneuvojen lapsiluokkia voisi olla auto, lentokone ja vene, jotka perivat siis ylla olevat muuttujat seka metodit itselleen. Naiden lisaksi jokaisella lapsiluokalla voi olla omia muuttujia seka metodeja. Auton muuttuja voisi olla vari, metodi voisi olla vaihda vaihdetta. Lentokoneen muuttaja voisi olla siipivali, metodi voisi olla nosta/laske lentokorkeutta. Veneen muuttuja voisi olla veneen pituus, metodi voisi olla ruorin kaantaminen oikealle ja vasemmalle. Jotta homma ei olisi liian yksinkertaista, voi auto toimia lapsiluokan kantaluokkana erilaisille autotyypeille. Esimerkiksi avo-, lava-, henkilo- ja kuorma-auto perivat kaikki auton seka moottoriajonevon suojatut muuttujat ja metodit. Avoautolla voisi viela omana muuttujana olla malli seka metodina voisi olla katon nostaminen auki kuumana kesapaivana.

Abstraktit luokat ja metodit

[muokkaa | muokkaa wikitekstia]

Abstrakti luokka on Javassa eras tapa lisata ohjelman enkapselointia tarkistamalla, ettei paaluokasta luoda uutta oliota, mutta paaluokan lapsiluokkien olioiden luominen on sallittu. Abstraktia luokkaa ei voida implementoida, mutta abstraktin luokan lapsiluokka voidaan.[46]

Abstraktin luokan rakenteella tehdaan maaritelman avulla muottipohja luokasta periytyville lapsiluokille. Nain varmistetaan, etta jokainen periytyva metodi toteuttaa tietyn toiminnallisuuden ilman etta kantaluokkaa suoraan kutsutaan. Sen kayttoa edellyttaa yleensa jonkin jaetun toiminnallisuuden tarpeen toteamista abstraktia luokkaa varten. Abstrakti luokka luodaan lisaamalla avainsana abstract class -avainsanan eteen. Ei-abstraktia abstraktin luokan lapsiluokkaa kutsutaan konkreettiseksi luokaksi.


Abstraktin luokan maaritys tapahtuu abstract -avainsanalla.

public abstract class className {}

Jos abstraktista luokasta yritetaan luoda uusi olio, Java palauttaa virheviestin. Virheen voi saada kiinni ajon aikana InstantiationError luokan avulla jos ja vain jos luokan maaritys on yhteensopimattomasti muuttunut.[47] Abstrakti metodi on metodi, joka on maaritelty ilman ohjelmakoodia abstraktissa luokassa. Abstrakteja metodeja ei voida maaritella ei-abstraktissa luokassa. Abstraktin metodin maaritys tapahtuu abstract -avainsanalla.

public abstract class className {
abstract void method();
}

Abstraktin luokan lapsiluokat voivat kayttaa abstrakteja metodeja implementoimalla tai kumoamalla (Override) abstraktin metodin, joka periytynyt paaluokasta.

public abstract class subClassName extends className {
@Override
void method();
}

Kun abstrakti luokasta on luotu lapsiluokkia, lapsiluokka valittaa implementoinnit kaikkiin abstrakteihin metodeihin sen paaluokassa. Jos nain ei ole, niin lapsiluokka pitaa myos maaritella abstraktiksi.[48] Abstrakteissa luokissa ja metodeissa voidaan kayttaa avainsanaa static

Tiedostonkasittely Javassa

[muokkaa | muokkaa wikitekstia]

Javassa tiedostoon kirjoittaminen ja sielta lukeminen on melko yksinkertaista. Java tarjoaa naita toimintoja varten kayttajalleen useita eri kirjastoja ja metodeja, joita Java-ohjelmoijat paasevat vapaasti kayttamaan. FileWriter on yksi java.io kirjaston tarjoama luokka, jota voi hyodyntaa tiedoston kirjoittamiseen tai lukemiseen. Taman jalkeen voidaan kayttaa write-metodia tekstin kirjoittamiseen. Esimerkiksi jos halutaan luoda ja kirjoittaa tekstia tiedostoon "tiedosto.txt", tapahtuu se seuraavanlaisesti.

try (FileWriter kirjoittaja = new FileWriter("tiedosto.txt")) {
kirjoittaja.write("Kirjoitetaan tekstia tiedostoon.");
} catch (IOException e) {
// Poikkeukset tahan
}

Java pakottaa kayttajansa lisaamaan poikkeuksenkasittelyn, jota esimerkiksi Pythonissa ei tarvitse tehda. Talla varmistetaan se, etta tiedostojen puuttumiset, kayttooikeusongelmat seka muut odottomattomat ongelmat otetaan huomioon. Kuten ylla olevasta koodista huomaa, tapahtuu tiedostoon kirjoittaminen try-lausekkeen sisalla.


Olion lisaaminen tiedostoon tapahtuu Javassa hieman erilailla, kuin esimerkiksi tavallisen tekstin kanssa toimiessa. Tama johtuu siita, etta oliot usein sisaltavat tietoa, joka ei yksinkertaisesti ole kirjoitettavissa tekstina, vaan se on tallennettava binaarimuodossa. Javassa ohjelmoija joutuu kayttamaan ObjectOutputStream - toimintoa, jos haluaa lisata sen tiedostoon ja vastaavasti sen voi lukea sielta ObjectInputStream-luokkien avulla. Tassa on yksinkertainen esimerkki siita, miten olion tallentaminen tiedostoon tapahtuu.

Henkilo henkilo = new Henkilo("Matti Meikalainen", 30);
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("tiedosto.txt"))) {
objectOutputStream.writeObject(henkilo);
} catch (IOException e) {
// Poikkeukset tahan
}

Muistinhallinta

[muokkaa | muokkaa wikitekstia]

Javan muistinhallinta on automaattista. Java kayttaa automaattista roskienkerainta (eng. automatic garbage collector) muistinhallintaan. Sen tarkoitus on hallita objektin muistinkayttoa sen kayttoian aikana.

Tama poikkeaa esimerkiksi C- ja C++-kielten kaytannoista, joissa ohjelman muistinhallinta on manuaalista ja siten ohjelmoijan vastuulla. Manuaalisen muistinhallinnan ohjelmointikielissa on mahdollista saada aikaan muistivuotoa, eli tilanteen, jossa ohjelma varaa muistia toimintojaan varten, mutta ei vapauta sita tarpeen ja ohjelman paattyessa.

Javan roskienkeraajan tarkoitus on ehkaista muistivuotoa. Vaikka roskienkerays ei eliminoi muistivuotoja taysin, se vahentaa niita merkittavasti, kuin myos niiden ehkaisemiseen kuluvia resursseja ohjelmistokehittajilta.[49]

Roskienkeraaja ajaa jaksollisesti taustalla "roskienkerayksen" (eng. garbage collection), joka pyrkii tunnistamaan muistissa olevat "kuolleet" objektit, joihin ei tulla enaa viittaamaan ohjelmassa, vapauttamaan naiden objektien viema tila muistista ja uudelleenorganisoida "elavat" objektit muistinkayton ja tulevien roskienkeraysten optimoimiseksi.[49]

Roskienkeraajatyyppeja on useita erilaisia toteutuksia. Kaytettava roskienkeraaja riippuu kaytettavissa olevista laitteiston resursseista seka suorituskykyvaatimuksista. Roskienkeraajatyypit Javassa[50]:

  • Serial Garbage Collector - Suorittaa kaiken toiminnan yhdella saikeella. Omaa suuremmat taukoajat, mutta kayttaa vahan resursseja. Sopii parhaiten yhden prosessorin systeemeihin.
  • Parallel Garbage Collector - Samankaltainen Serial Garbage Collectorin kanssa, mutta kayttaa useita saikeita.
  • Concurrent Mark Sweep (CMS) Garbage Collector (Hylatty JDK 9:ssa, poistettu JDK 14:ssa) - Vahentaa roskienkerayksen taukoaikoja suorittamalla toimintojaan sovelluksen toimiessa.
  • Garbage First (G1) Garbage Collector (Oletuksena JDK:n versiosta 9) - Parannus CMS GC:sta, syrjayttaa taman. G1 sopii parhaiten usean prosessorin laitteisiin suurella muistikapasiteetilla.
  • ZGC (Kokeellinen JDK 11:ssa, tuotanto JDK 15:ssa) - Erittain matalan viiveen roskankeraara, skaalattavissa usean teratavun "keon" (eng. heap) sovelluksiin. ZGC:n sisainen toteutus ja kayttaytyminen poikkeavat merkittavasti muista roskankeraajista.

Tyyppimuunnokset

[muokkaa | muokkaa wikitekstia]

Java on staattisesti tyypitetty kieli. Valilla saattaa tulla eteen tilanne, jossa on tarve tehda tyyppimuunnos. Tyyppimuunnoksella tarkoitetaan prosessia, jossa muutetaan muuttujan tai arvon tietotyyppi toiseksi tietotyypiksi. Tyyppimuunnos voi tapahtua automaattisesti tai manuaalisesti.

Jos tyyppimuunnoksessa tietotyypit ovat yhteensopivia, ja tavoiteltu tietotyyppi on laajempi kuin alkuperainen tietotyyppi, tekee Java tyyppimuunnoksen automaattisesti. Esimerkiksi "int"-tyypin muuttuja voidaan muuttaa "long"-tyyppiseksi muuttujaksi, silla "long"-tietotyypissa on tarvittava maara muistia "int"-tyypin muuttujan sailymiseen. Lisaksi Java muuttaa automaattisesti kokonaislukuarvon "int" liukulukuarvoksi "float", kun laskee naiden kahden jakolaskun.

Jos tyyppimuunnoksessa ei voida taata taydellista datan sailymista, ei automaattista tyyppimuunnosta voida tehda. Kun tyyppimuunnos ei tapahdu automaattisesti, voi tyyppimuunnoksen tehda manuaalisesti kayttamalla tyyppimuunnosoperaattoria. Operaation nimi on pakotettu tyyppimuunnos. Esimerkiksi, jos haluat muuttaa muuttujan, jonka tietotyyppi on "float" tietotyypiksi "int", voisit kayttaa tyyppimuunnosoperaattoria seuraavalla tavalla: (int) float-muuttuja. Haluttu tietotyyppimuuttuja siis sijoitetaan sulkeisiin, jonka jalkeen kirjoitetaan alkuperainen, muutettava muuttuja. Java pyrkii tekemaan tyyppimuunnoksen, vaikkei se olisi kyseisessa tilanteessa mahdollista. Tallainen tilanne voi aiheuttaa ongelmia myohemmassa vaiheessa, viimeistaan ohjelman ajovaiheessa.

Tyyppimuunnos auttaa kasittelemaan erilaisia tietotyyppeja ja tehostaa ohjelman suorituskykya. Tyyppimuunnosta on kuitenkin kaytettava tarkkaavaisuutta vaatien, silla sen vaarinkaytto voi johtaa virheisiin. Tyyppimuunnoksen yhteydessa esiintyvia yleisimpia virheita ovat tyyppimuunnoksen tyyppien yhteensopimattomuus seka muunnoksen aiheuttamat tietojen menetys tai vaaristyminen. Tyyppimuunnoksen kayton tarpeellisuutta onkin tarpeen harkita tapauskohtaisesti.

Javan ohjelmointikieli nahdaan laajalti suorituskyvyltaan hitaampana kuin muut nopeammat kielet, kuten C ja C++. Ongelma johtuu perustavanlaatuisesta erosta kielien rakenteessa: C ja C++ suorittavat ohjelman suoraan tietokoneen prosessorilta. Java taas avaa virtuaalikoneen (Java virtual machine, JVM) ohjelmaa varten, johtaen merkittavaan suorituskyvyn menetykseen.

Java kehittaa JVM:n suorituskykya ja optimointia jatkuvasti uusissa versioissa. Vuonna 1997 Java alkoi kayttamaan ajonaikaista kaantoa (Just-in-Time compilation, JIT), joka toi merkittavan parannuksen JVM:n suorituskyvyssa.

Java-ohjelman suorituskyky on siis olennaisesti sidottu paitsi itse ohjelman optimointiin myos kaytossa olevaan Javan versioon. Uudemmat versiot Javan virtuaalikoneesta kayttavat tietokoneen prosessointikykya tehokkaammiin ja ohjelman suorittaminen voi nopeutua merkittavasti vanhemmista versioista. Taman takia Java-ohjelman suorituskykya testattaessa on olennaista raportoida kaytossa olevan JVM:n versio, myyja, kayttojarjestelma seka laitearkkitehtuuri.

Virheidenkasittely

[muokkaa | muokkaa wikitekstia]

Java ohjelmointi kielena tarjoaa laajan virhekontrolli mekanismin. Yksi paatavoista, jolla tama saavutetaan on poikkeuksen kasittely systeemi (exception). Kun virhe tapahtuu ohjelman aikana, Java voi implementoida poikkeuksen, jossa objekti kuvastaa virhetta. Tama systeemi mahdollistaa ohjelman kasittelemaan virheet jasennellysti eika niin, etta ohjelma kaatuisi tai tekisi hankalaksi ohjelman ajamista.

Javassa, poikkeukset kasitellaan kayttaen try-catch-finally-block systeemia. Try-lause sisaltaa koodia, joka saattaa poikkeuksen ja Catch-lause sisaltaa koodin, joka kasittelee poikkeuksen. Finally-lause on naiden jalkeinen toimenpide, joka tekee resurssien putsauksen, kun aiemmat lauseet ovat ajettu.

Java tarjoaa myos mekanismin, jossa throw ja catch menetelmat toteutetaan eri tavalla, jossa ohjelmoija maarittelee niiden toimenpiteet. Tama antaa ohjelmoijille hyvan mahdollisuuden tehda joustavaa virheiden kasittelya Javan-ohjelmointi kielen normaalien poikkeuskasittelyn toimenpiteiden lisaksi.

Javan ohjelmointikielella on myos toinen tapa kasitella virheita ja se perustuu type-safe mekanismiin. Javan ohjelmointkieli on vahvasti "nappailty" kieli mika tarkoittaa sita, etta muuttujien tyyppi on oltava taysin ilmoitettu siina ajassa, kun sita maaritellaan. Tama helpottaa virheissa kuten tyyppien yhteensopimattomuudessa seka null-osoittimien poikkeuksissa.

Yleisesti Java-ohjelmointikielen virheidenkasittely mekaniikat ovat luotettavia ja naiden avulla pystytaan ohjelmoimaan vakaata ja helposti kasiteltavaa koodia ohjelmistoihin.

Javan tarjoamia kirjastoja

[muokkaa | muokkaa wikitekstia]

Java tarjoaa laajan skaalan erilaisia kirjastoja helpottamaan ohjelmoijien tyota. Kirjastoista yleisin ja kaytetyin on Javan standardikirjasto (eng. Java Standard Library) joka pitaa sisallaan useita tarkeita kirjastoja, kuten esimerkiksi java.lang, jo aiemmin mainittu java.util ja java.math. Javan kirjastot saadaan dynaamisesti kayttoon ajon aikana sisallyttamalla kirjastot koodin alkuun komennolla "import" ja kutsumalla kirjastojen sisaltamia komentoja osana koodia. Nain Javassa saadaan kayttoon hyvin laaja skaala komentoja vain parilla lisasanalla.

Esimerkkikirjastoja

[muokkaa | muokkaa wikitekstia]
  • Javan standardikirjasto (eng. Java Standard Library) - Javan standardikirjasto on alun perin kehitetty tukemaan Javan sovelluskehitysta. Kirjasto on Oraclen ja sen yhteistyokumppaneiden luoma. Kirjasto sisaltaa monenlaisia ominaisuuksia, esimerkiksi:
    • IO/NIO - ( Package java.io/java.nio ) Kirjasto maarittaa ne puskurit, jotka sisaltavat dataa seka antaa yleiskatsauksen muista NIO paketeista.
    • Verkostoituminen - ( Package java.net)
    • Heijastuminen
    • Samanaikaisuus
    • Geneerisyys
    • Skriptaus/kaantaja
    • Toiminnallinen ohjelmointi
    • Java-kokoelmakehys - Sisaltaa erilaisia rajapintoja, jotka maarittelevat erilaisia kokoelmia ja luokkia, jotka toteuttavat niita. Java-kokoelmakehys toimii samalla tavalla kuin kirjastot.
    • Turvallisuus
    • Kirjastot, joiden avulla kayttaja pystyy kommunikoimaan ulkoisten jarjestelmien kanssa
  • java.util - Tarjoaa esimerkiksi Arraylist:n jonka avulla voidaan lisata esimerkiksi string ja int muotoista tekstia helposti listaan .add-komennon avulla, Scanner:n jonka avulla voidaan esimerkiksi kysya ajonaikana kaytettavia tietoja kayttajalta, Date:n jonka avulla voidaan helposti kasitella aikaa ja paivamaaria, seka LinkedList:n joka tarjoaa mahdollisuuden luoda linkitetyn listan seka GregorianCalendar:n eli kalenterin.
  • java.math - Tarjoaa paljon erilaisia laskemisessa tarvittavia funktioita, kuten Math.abs(), jolla saadaan halutun numeron itseisarvo, Math.round(), jolla saadaan pyoritettya luku, seka Math.log(), jolla voidaan laskea halutun luvun luonnollinen logaritmi.
  • java.time - Tarjoaa esimerkiksi hyodyllisen luokan LocalDate, jolla saadaan kayttoon paikallinen paivamaara seka LocalTime, jolla saadaan koodin kayttoon paikallinen aika. Mikali haluaa molemmat, kannattaa kayttaa java.time:n tarjoamaa LocalDateTime:a, jolla saadaan molemmat kayttoon. Kaikki mainituista sisaltaa myos mahdolliset talvi- ja kesaajat.
  • java.text - Tarjoaa muun muassa DecimalFormat:n, jolla voidaan maarittaa naytetaanko kayttajalle desimaalierottimena oletusarvona olevaa pistetta vai pilkkua seka SimpleDateFormat:n jonka avulla voidaan maarittaa, minkalaisessa muodossa kayttajalle naytettavat paivamaarat naytetaan.
  • java.lang - sisaltaa perusluokkia ja rajapintoja, jotka ovat olennaisia ohjelmointikielen suunnittelussa.
  • java.applet - Sisaltaa luokat, joita tarvitaan ohjelman luomiseen seka luokat, joita ohjelma kayttaa kommunikoidakseen kontekstinsa kanssa.
  • java.awt.font - Sisaltaa luokkia ja rajapintoja, jotka tarjoavat erilaisia fontteja.
  • java.awt - Sisaltaa luokkia kayttoliittyman luomiseen seka grafiikan ja kuvien tekemiseen.
  • java.awt.datatransfer - Sisaltaa luokkia ja rajapintoja, jotka mahdollistavat tietojen siirtamisen sovellusten sisalla ja niiden valilla.
  • java.awt.geom - Sisaltaa luokkia kaksiulotteisten geometristen objektien toimintojen maarittamiseen ja suorittamiseen.
  • java.awt.image - Sisaltaa luokkia kuvien luomiseen ja muokkaamiseen.
  • java.time.format - Sisaltaa luokkia paivamaarien ja aikojen jasentamiseen ja tulostamiseen.
  • java.util.zip - Sisaltaa luokkia ZIP- ja GZIP-tiedostomuotojen lukemiseen ja kirjoittamiseen.
  • java.swing text - Sisaltaa luokkia ja rajapintoja, jotka kasittelevat muokattavia ja ei-muokattavia tekstikompontentteja.
  • Integraatiokirjastot, jotka mahdollistavat sovelluksen kehittajan kommunikoimaan ulkoisten jarjestelmien kanssa:
  • Kayttoliittymakirjastot:
    • Abstract Window Toolkit (AWT), joka tarjoaa GUI komponentteja. Kirjasto tarjoaa myos tyokaluja asetella kyseisia komponentteja seka kasitella kyseisiin komponentteihin liittyvia tapahtumia
    • Swing kirjastot, jotka ovat rakennettu AWT:n paalle, mutta tarjoavat ei-natiiveja toteutuksia AWT pienoisohjelmasta
    • Ohjelmointirajapintoja aanen tallentamiseen, prosessointiin seka toistoon
    • JavaFX, joka tarjoaa alustan tyopoytasovellusten seka monipuolisten verkkosovellusten luomiseen
  • Java Web Start, joka mahdollistaa Java ohjelmien jakamisen tehokkaasti loppukayttajille Internetissa
  • Kirjastoja ohjelmien lisensointiin ja dokumentoimiseen
  • Lisaosia, jotka mahdollistavat sovelmien ajamisen selaimessa
  • Ohjelmistoalusta riippuvainen toteutus Javan virtuaalikoneesta, jonka avulla Java-kirjastojen ja kolmannen osapuolen sovellusten tavukoodit suoritetaan
  • Kirjastoja data-analytiikkaan, koneoppimiseen ja tekoalyyn:
    • Deeplearnin4j - DL4J kirjasto koneoppimiseen ja tekoalyyn, jolla on laaja tuki syvaoppimisalgoritmeille.
    • Java Statistical Analysis Tool - JSAT kirjasto tilastolliseen laskentaan ja koneoppimiseen
    • Java Machine Learning Library - Java-ML kirjasto koneoppimiseen ja tiedonlouhintaan. Kirjaston tarjoamia algoritmeja ovat mm. datan klusterointi, klassifiointi seka datan suodatus algoritmit.

Ulkoiset Java kirjastot

[muokkaa | muokkaa wikitekstia]

Java tarjoaa myos mahdollisuuden kayttaa ulkoisia kirjastoja. Kirjastot on luotu helpottamaan sovellusten kehitysta tarjoamalla erilaisia tyokaluja ja valmiiksi kirjoitettua koodia. Niita voidaan lisata omaan ohjelmaan sen toiminnallisuuden laajentamiseksi tai koodin ongelmakohtien ratkaisemiseksi. Kirjastojen tarkoitus on mahdollistaa ohjelmoijan keskittyminen sovelluksen rakenteeseen matalatasoisen toteutuksen sijasta.

Esimerkkikirjastoja:

  • Spring[51] on kevyt mutta tehokas Java-sovelluskehityskehys, jota kaytetaan yleisesti JEE (Java Enterprise Edition) -sovelluksissa. Se tarjoaa erilaisia moduuleja, kuten Spring Security, Spring MVC, Spring Batch, Spring ORM, Spring Boot ja Spring Cloud. Lisaksi Spring tukee Dependency Injection -integraatiota, mika mahdollistaa riippuvuuksien ratkaisemisen joustavasti. Spring pystyy myos ratkaisemaan riippuvuudet, silla se tukee Dependency Injection -integraatiota.
  • Hibernate[52] helpottaa tietokantaan paasya ja hallintaa seka tarjoaa ominaisuuksia, kuten SQL-kyselyjen kasittelya, valimuistitusta ja suorituskyvyn optimointia. Hibernate mahdollistaa myos oletusarvoista SQL-tyyppien ohittamista, Java Enumien mappamisen sarakkeisiin seka yhden ominaisuuden mappamisen useaan sarakkeeseen.
  • Grails[53] tarjoaa yhtenaisen kehitysympariston, joka hyodyntaa olemassa olevia Java-teknologioita, kuten Hibernatea ja Springia, yhden kayttoliittyman alla. Grails tarjoaa myos dokumentaatiota tarkeimmista osista, kuten pysyvyyskehyksesta, GSP-templaattikielen kaytosta ja dynaamisista tag-kirjastoista. Lisaksi Grails tarjoaa esimerkkisovelluksia, kehysarkkitehtuurin laajennettavuuden seka tuen Ajaxille.
  • Play[54] on nykyaikainen ja kevyt web-kehys, joka keskittyy kehittajien tuottavuuteen ja tehokkuuteen. Se tukee RESTful-arkkitehtuuria, sisaltaa yksikkotestauksen tukemisen JUnitin ja Seleniumin avulla, tarjoaa monia sisaanrakennettuja elementteja ja tukee asynkronista I/O:ta.

Muita ominaisuuksia

[muokkaa | muokkaa wikitekstia]

Java tukee myoskin sisakkaisia luokkia. Sisakkaisia luokkia on erityyppisia kuten esimerkiksi staattinen sisainen luokka. Sisakkaiset luokat parantavat koodin jarjestelya. [55]Lisaksi anonyymit luokat ovat yksi sisaisten luokkien tyyppi.[56]

Erot muihin kieliin

[muokkaa | muokkaa wikitekstia]

Ohjelmointikielia on paljon ja monet niista jakavatkin samanlaisia ominaisuuksia. C-kieli on rakenteellista ja proseduraalista, kun taas sen jalkelainen C++ tarjoaa laajemman valikoiman ominaisuuksia ja kielen toiminnallisuus pohjautuu huomattavasti enemman oliopohjaiseen ohjelmointiin kuten Java. JavaScriptia taas kuvaillaan enemman C:n kaltaisena.

Java-ohjelmointi pohjautuu hyvin vahvasti useiden eri luokkien, metodien, olioiden ja niille maaritettyjen funktioiden suorittamiseen. Filosofiassaan kieli noudattaa SOLID-periaatetta.

Java ja JavaScript

[muokkaa | muokkaa wikitekstia]

Vaikka kielet Java ja JavaScript jakavatkin osittain saman nimen, ovat ne hyvin erilaisia ohjelmointikielia toimivuudeltaan ja ajatusmaailmaltaan. Java kaantyy Java-bittikoodiksi, jonka takia Javaa suoritetaan useimmiten JVM (Java Virtual Machine) sisalla, kun taas JavaScript suoritetaan selaimen puolella. Muuttamalla koodin Java-biteiksi, Javan oma virtuaalikone mahdollistaa paremman turvallisuuden perustasolla ilman ylimaaraista koodia. JavaScriptia kaytetaankin usein front end-suunnittelussa ja Javaa back end-suunnittelussa.[57]

Java on kieli, joka tarkistaa static-tietotyyppeja ja JavaScript dynaamisia. Javan kirjoitus voi olla hieman tyolaampaa, koska siina voi joutua kirjoittamaan enemman ja pitamaan huolta suunnittelun ohella, etta tietotyyppi on maaritelty oikein. JavaScript on kielena nopeampi. Sen scripti tarkastetaan silla hetkella, kun sita suoritetaan. JavaScriptin koodia on helpompi ymmartaa, silla se kirjoitetaan yksinkertaisena tekstina. Sita ei ole kaannetty kuten Javassa tehdaan.

JavaScriptia kaytetaan paaosin nettiselainten suunnitteluun ja toteutukseen ja sen paatehtava on tehda sivuista vuorovaikutteisempia kuin perinteisesti koodatut yksinkertaiset sivut.

Javan suunnittelu ja kirjoitus vaatii JDK:n (Java Development Kit), joten sita voidaan mieltaa hieman edistyksellisempana ohjelmointikielena.

Uuden luokan tekeminen ja kayttaminen. Luokan rakentaja ja metodien yksinkertaista kayttoa.

[muokkaa | muokkaa wikitekstia]

Luokka, eli olio. Tarkoitus on saada koodi selkeammin hallittavaan pakettiin, etta koodi olisi helpommin muokattavissa ja luettavissa.

Ohessa lyhyt esimerkki kahteen tiedostoon rakennetusta ohjelmasta, missa kaytetaan uutta luokkaa, rakentajaa ja sen metodeita.

Esimerkki.

package com.example;

public class App
{
public static void main( String[] args ){
Animal siili1 = new Animal(); // Luodaan siili1 niminen olio. Rakentajaa kaytetaan ilman parametreja,
// jolloin elain saa vakio parametrit.
Animal siili2 = new Animal("Pekka",9); //Luodaan siili2 niminen olio ja kaytetaan paramerillista rakentajaa.
System.out.println("Siilin1 nimi: " + siili1.getName());//Tulostetaan siili1 nimi
System.out.println("Siilin2 ika: " + siili2.getAge()); //Tulostetaan siili2 ika
siili1.setName("Maija"); //Siilin nimea voidaan myos vaihtaa lennosta.
System.out.println(siili1.getName());
siili1.printAnimalSpecs(); //Tulostetaan siilin1 tiedot kayttaen metodia.
siili2.printAnimalSpecs(); //Tulostetaan siilin2 tiedot kayttaen metodia.
}
}

Olioita voidaan luoda tarpeen mukaan.

Luokkatiedosto. Luokan ja metodien tekeminen

[muokkaa | muokkaa wikitekstia]

Esimerkki.

package com.example;

public class Animal {
public String name = "Heikki"; //Asetettu String tyyppinen nimimuuttuja "Heikki"
public int age = 15; //Asetettu int tyyppinen ikamuuttuja 15.

//Voidaan tehda useampi rakentaja, kunhan sisaan tulevat parametrit eroavat toisistaan.
public Animal(){ //Rakentaja ilman parametreja. Nimeksi jaa tassatapauksessa nimi "Heikki" ja ika 15, ellei niita erikseen muuteta
}
public Animal(String name,int ika){ //Rakentaja parametreilla.
this.name = name; //Sanaa this.name kertoo kaantajalle, etta kaytetaan taman luokan muuttujaa name.
age = ika; //Sama voidaan tehda myos, jos sisaan tulevan parametrin nimea muutetaan erinimiseksi.
}
public String getName(){ //saadaan haettua Animal olion nimi.
return name;
}
public void setName(String name){ //voidaan asettaa Animal olion nimi.
this.name = name;
return;
}
public int getAge(){ //Voidaan hakea Animal olion ika.
return age;
}
public void setAge(int age){ //Voidaan asettaaa Animal olion ika.
this.age = age;
return;
}
public void printAnimalSpecs(){//Tulostetaan siilin tiedot.
System.out.println("Nimi: " + name + " ika: " + age);
}
}

Tuloste:
Siilin1 nimi: Heikki
Siilin2 ika: 9
Maija
Nimi: Maija ika: 15
Nimi: Pekka ika: 9

Metodeita tehdaan sen mukaan, etta mita tietoja halutaan saada luokasta ulos, tai luokkaan sisaan.

Singleton on Javassa kaytetty suunnittelumalli, jonka avulla voidaan varmistaa, etta singelton-luokassa on vain yksi olio (luokan ilmentyma) kerrallaan. Avaintekijoina singleton-luokan luomisessa toimii yksityinen luokkamuuttuja, yksityinen rakentaja ja julkinen metodi siihen kasiksi paasemiseen. Luokan rakentaja maaritellaan yksityiseksi, jotta uusien olioiden luominen luokan ulkopuolella voidaan estaa, ja yksityisella luokkamuuttujalla (maarittelylla private static) paastaan kasiksi luotuun olioon. Julkisella luokkametodilla (maarittelylla public static) luodaan paasy yksityiseksi maariteltyyn olioon. Nimenomaan taman julkisen luokkametodin sisalla on toiminnallisuus, jolla useampien olioiden luominen luokan ulkopuolella voidaan estaa.

Yksinkertainen esimerkki singleton-luokan luomisesta voi olla esimerkiksi seuraavanlainen:

public class singletonExample{

//yksityinen luokkamuuttuja, jonka arvoksi maaritellaan aluksi "null"
private static Storage storage = null;

//yksityinen rakentaja
private Storage(){
}

//Luokkametodi, joka tarkistaa onko luokkamuuttuja Storage jo tehty.
//Jos Storagen arvo on edelleen "null" eli sita ei ole viela luotu, luodaan
//se tassa metodissa ja palautetaan se. Jos Storage on jo olemassa,
//palauttaa metodi kyseisen valmiiksi olemassa olevan Storagen.
public static Storage getInstance(){
if(storage == null){
storage == new Storage();
}
return storage;
}
}

Singleton-luokan ongelmana on kuitenkin esimerkiksi sen globaalia muuttujaa muistuttava luonne. Kaikilla luokilla on paasy muuttujaan julkisen instanssin vuoksi, mutta luokkien valisia riippuvuuksia on vaikea maarittaa, koska singelton-luokan yksityisella rakentajalla ei ole niita. Luokilla kuitenkin on riippuvuus, jos toinen luokka kayttaa toisen instanssia.

Singleton-luokkaa kaytetaan usein tietokantoja kasittelevissa ohjelmissa. Kaytannon nakokulmasta singelton luokka toimii niin, etta koko applikaatio, ohjelma tms. kayttaa vain yhta ja samaa tietokannan ilmentymaa sen kaikissa toiminnoissa. Tama ehkaisee virheiden ja poikkeusten esiintymista, koska aina luotaessa uusi ilmentyma nama ovat mahdollisia. Lisaksi saman ilmentyman kayttaminen nopeuttaa tiedonhakua ja sen palauttamista tietokannasta.

Javassa voi kaynnistaa kayttojarjestelman tukemana tavallista ohjelmaprosessia kevyempia saikeita. Saikeen kayttamat resurssit kuuluvat saikeen kaynnistavalle prosessille. Yksittainen prosessi voi kaynnistaa yhden tai suuren maaran saikeita yhdessa tai useammassa suoritinytimessa kayttojarjestelma- ja resurssirajoitteiden puitteissa. Saie on yksi ohjelman suoritusketjuista, joka voi toimia samanaikaisesti muiden saikeiden kanssa. Saikeiden kaytto sallii moniajo-ohjelmoinnin, joka voi parantaa ohjelman suorituskykya. Javan Thread -luokkaa kaytetaan saikeiden luomiseen. Kullakin saikeella on oma suorituskaista, joka voi toimia samanaikaisesti muiden saikeiden kanssa.

Esimerkki.

Oheinen koodiesimerkki luo 5 saietta ja jokainen niista tulostaa aloitus- ja lopetusaikansa. Saikeet tallentavat aloitusajan, odottavat satunnaisen ajan ja tallentavat lopetusaikansa. Ohjelma kayttaa Thread-luokan sleep -metodia odottamiseen. Taulukkoon tallennetut saikeet kaynnistetaan for-silmukan avulla. Saikeet kaynnistetaan samanaikaisesti, mutta niiden suoritusjarjestys ei ole ennalta maaratty. Lopuksi odotetaan, etta kaikki saikeet ovat suorittaneet loppuun ennen kuin ohjelma paattyy. Tama tehdaan Thread-luokan join-metodilla, joka pysayttaa nykyisen saikeen suorituksen, kunnes liittyva saie on suorittanut loppuun. Ilman join-metodia ohjelma saattaisi lopettaa liian aikaisin, kun jotkut saikeet viela suorittavat.

import java.util.Date;
import java.text.SimpleDateFormat;

public class Saietesti {
public static void main(String[] args) throws InterruptedException {
Thread[] saikeet = new Thread[5]; // luodaan taulukko saikeita varten
for (int i = 0; i < saikeet.length; i++) {
final int j = i + 1; // saikeiden numerointi
saikeet[i] = new Thread(() -> { // luodaan uusi saie
String aloitettu = new SimpleDateFormat("HH:mm:ss.SSS").format(new Date()); // tallennetaan aloitusaika
System.out.printf("Saie %d aloitettu: %s\n", j, aloitettu); // tulostetaan aloitusaika
try {
int odota = (int) (Math.random() * 9000 + 1000); // arvotaan odotusaika valilta 1-10 sekuntia
Thread.sleep(odota); // nukutetaanaan saietta odotusajan verran
} catch (InterruptedException e) {
e.printStackTrace();
}
String lopetettu = new SimpleDateFormat("HH:mm:ss.SSS").format(new Date()); // tallennetaan lopetusaika
System.out.printf("Saie %d lopetettu: %s\n", j, lopetettu); // tulostetaan lopetusaika
});
saikeet[i].start(); // kaynnistetaan saie
}
for (Thread saie : saikeet) {
saie.join(); // odotetaan, etta kaikki saikeet ovat suorittaneet loppuun ennen kuin ohjelma paattyy
}
}
}
> java Saietesti
Saie 4 aloitettu: 20:38:42.394
Saie 5 aloitettu: 20:38:42.397
Saie 2 aloitettu: 20:38:42.397
Saie 3 aloitettu: 20:38:42.397
Saie 1 aloitettu: 20:38:42.405
Saie 1 lopetettu: 20:38:43.808
Saie 5 lopetettu: 20:38:47.258
Saie 2 lopetettu: 20:38:49.158
Saie 4 lopetettu: 20:38:49.985
Saie 3 lopetettu: 20:38:52.153

Javan kaytto Java-alustan ulkopuolella

[muokkaa | muokkaa wikitekstia]

Android OS on suurelta maarin kirjoitettu C ohjelmointikielella, mutta Android SDK (Androidin ohjelmistokehityspaketti) kayttaa kuitenkin Java kielta sovellusten kehityksen perustana, mutta ei kuitenkaan kayta Javan omia standardeja (GUI, SE, ME) tai muita vakiintuneita Java standardeja. Samalla Android SDK:n tukema tavukoodi ei ole yhteensopiva Javan tavukoodin kanssa seka Android SDK toimii vain omalla virtuaalikoneellaan, joka on suunniteltu alypuhelimille ja tableteille.[58] Android Studio IDE (Integrated Deveplopment Environment) on Android sovellusten virallinen ohjelmointiymparisto, mutta muitakin ohjelmointiymparistoja voidaan kayttaa vapaasti Android sovelluksien kehittamiseen.[59] Android Studiossa kehittaja voi luoda emulaattoreita Android OS:aa kayttavista puhelimista ja testata omia Java-sovelluksiaan naiden emulaattoreiden avulla.

Koko Android OS:n ominaisuusvalikoima on kaytettavissa Java ohjelmointikielella kirjoitettujen ohjelmointirajapintojen (API) kautta kayttajille. Naita rajapintoja voidaan pitaa Android sovelluksien ns. rakennuspalikoina, joilla voidaan rakentaa sovellusten kayttoliittyma ja ohjata sen toimintoja. Kyseisia rajapintoja ovat seuraavat:[60]

  • Tarkastelu jarjestelma (View System), jolla rakennetaan Android sovelluksen kayttoliittyma, kayttaen erilaisia vekottimia (Widgets), kuten esim. nappuloita, listoja, laatikoita ja tekstikenttia seka palkkeja.
  • Tehtavienhallitsija (Resource Manager), jolla voidaan paasta kasiksi paikallisiin teksteihin, grafiikoihin tai asetteluihin.
  • Huomautustenhallitsija (Notification Manager) mahdollistaa sovellusten esitella mukautettuja huomautuksia kayttajille.
  • Toiminnallisuudenhallitsija (Activity Manager), jolla voidaan hallita sovellusten elinkaarta seka mahdollistaa navigoinnin sovelluksen eri tehtavien valilla.
  • Sisallon tarjoaja (Content Provider) mahdollistaa sovellusten datan jakamisen muiden sovellusten valilla, kuten esim. yhteistietojen valittamisen toisesta sovelluksesta toiseen.

Erimielisyys

Oraclen ja Googlen valilla kaytiin oikeudellista kiistaa Javan API:en (sovellusliittymien) ja lahdekoodin tekijanoikeuksista.

Oracle vaati vahingonkorvauksia Googlelta, joka puolestaan perusteli API:en kayton olleen kohtuuden rajoissa. Kaksi piirituomioistuinta paatti asiasta Googlen eduksi mutta vetoomustuomioistuin kumosi molemmat paatokset. Asiaa kaytiin lapi vuodesta 2012 vuoden 2021 kevaaseen asti, jolloin lopullisessa ratkaisussa korkein oikeus paatti API:en kayton olleen Googlen osalta kohtuullista. Vaikka se kumosi aiemman paatoksen, lopullinen ratkaisu jatti huomioimatta API:en suojaamisen tekijanoikeuksilla.

Tapaus toimi kiinnostavana esimerkkina muille alalla toimijoille, silla monissa tietokoneohjelmissa ja ohjelmistoissa (erityisesti avoimen lahteen) on vastaavasti hyodynnetty API:ja muista tuotteista esimerkiksi ohjelmien yhteensopivuuden helpottamiseksi.[61]

Javan kritiikki koskee sen geneerisen ohjelmoinnin toteutusta[62], nopeutta[63], etumerkittomien kokonaislukujen kasittelya[64], liukulukuaritmetiikkaa[65] seka tietoturvahaavoittuvuuksia Java-virtuaalikoneen toteutuksissa (HotSpot).[66]

Etumerkittomat kokonaisluvut

[muokkaa | muokkaa wikitekstia]

Javassa ei ole luontaisia etumerkittomia kokonaislukuja. C-kieliset ohjelmat tuottavat yleensa etumerkitonta dataa, ja taman tyyppisen datan puute estaa suoran tiedon vaihdon Java-kielisten ja C-kielisten ohjelmien valilla. Suuria etumerkittomia lukuja numeeristen kasittely kenttien numeroina, kuten kryptografiassa, mika hankaloittaa Javan kayttamista tallaisissa tehtavissa. Vaikka taman ongelman kiertaminen on mahdollista kayttaen muunnoskoodia ja suurempia tietotyyppeja, se tekee etumerkittoman datan kasittelysta kompeloa Javalla.[67] Vaikka 32-bittiseen etumerkilla varustettuun kokonaislukuun on mahdollista tallentaa 16-bittinen etumerkiton kokonaisluku ilman havioita, ja 64-bittiseen etumerkilla varustettuun kokonaislukuun voi puolestaan tallentaa 32-bittisen etumerkittoman kokonaisluvun, ei ole kuitenkaan olemassa 64-bittisesta suurempaa tyyppia etumerkittoman kokonaisluvun tallentamiseen. Kaikissa edella mainituissa tapauksissa kaytetyn muistin maara voisi kaksinkertaistua, ja kaikki kahden komplementin ylivuotoon turvautuva logiikka pitaisi uudelleen kirjoittaa. Abstrakteissa tapauksissa funktio kutsut olisivat valttamattomia monissa operaatioissa, jotka ovat monissa muissa kielissa luontaisia. Vaihtoehtoisesti on mahdollista kayttaa Javan etumerkilla varustettuja kokonaislukuja jaljittelemaan samankokoisia etumerkittomia kokonaislukuja, mutta tama vaatii yksityiskohtaista tuntemusta bittikohtaisista operaatioista.[68] JDK 8 tarjosi jonkinlaista tukea etumerkittomille kokonaisluvuille, mutta ei etumerkittomille tavuille eika myoskaan tukea Java kielesta.[69]

Yhdistetyt arvotyypit

[muokkaa | muokkaa wikitekstia]

Javassa ei ole yhdistettyja arvotyyppeja, kuten C:n structeja, joissa on tietopaketteja, joita kasitellaan suoraan viittauksien sijaan epasuorasti. Arvotyypit voivat joskus olla nopeampia ja pienempia kuin luokat viittauksilla.[70][71] Esimerkiksi Javan HashMap on toteutettu taulukkona viittauksina HashMap.Entry-olioihin,[16] jotka sisaltavat vuorostaan viittauksia avain- ja arvo-olioihin. Tiedon hakeminen vaatii tehotonta kaksoishakemista. Jos Entry olisi arvotyyppi, taulukko voisi tallentaa avain-arvo-parit suoraan, mika poistaisi ensimmaisen valitystason, lisaisi viittauspaikallisuutta ja vahentaisi muistin kayttoa. Lisaksi, jos Java tukisi geneerisia primitiivisia tyyppeja, avaimet ja arvot voitaisiin tallentaa suoraan taulukkoon, poistamalla molemmat valitystasot.

Perusmuuttujien ja taulukoiden integrointi

[muokkaa | muokkaa wikitekstia]

Taulukot ja perusmuuttujat ovat jossain maarin erityisia ja niita on kasiteltava eri tavoin kuin luokkia. Tata on arvosteltu[72], koska se edellyttaa monia funktiovariaatioita yleiskayttoisten kirjastojen luomisessa.

Serialisaatio

[muokkaa | muokkaa wikitekstia]

Javassa on mekanismi objektin serialisoimiseen, jossa objekti voidaan esittaa tavujonona, joka sisaltaa sen tietokentat yhdessa tietonsa ja kenttiensa tyyppitiedon kanssa. Kun objekti on sarjallistettu, sita voidaan myohemmin desarjallistaa; eli sen tyyppitiedot ja tietonsa esittavat tavut voidaan kayttaa objektin luomiseen muistissa. [73]Tama aiheuttaa erittain vakavia teoreettisia ja todellisia turvallisuusriskeja.[74][75]

Serialisointi prosessi on siita hyodyllinen, etta se on kokonaisuudessaan JVM riippumaton. Tarkoittaen sita, etta objekti voidaan deserialisoida taysin toisella laitteella tai alustalla, kuin se on serialisoitu.


Luokat ObjectInputStream ja ObjectOutputStream ovat korkeantason virtoja, jotka sisaltavat metodit serialisoinnille seka deserialisoinnille.


Java serialisointi voidaan saavuttaa kayttamalla java.io.Serializable rajapintaa. Objektia serialisoidessa tulee luokan maarittelyssa implementoida tama rajapinta, joka mahdollistaa tarvittavan tarkistuksen onko objekti serialisoitava. Kun objekti on serialisoitava, se voidaan kirjoittaa ObjectOutputStreamiin, joka konvertoi taman objektin bittivirraksi.


Java deserialisointi voidaan saavuttaa lukemalla bitit bittivirrasta ja antamalla bitit ObjectInputStreamille. ObjectInputStream voi konvertoida taman jalkeen bitit takaisin objektin muotoon ja palauttaa sen takaisin kaytettavaksi halutussa muodossa.


Yksi tarkea tieto Javan serialisoinnista on se, etta siihen liittyy aina turvallisuusriskinsa, jos sen kanssa ei ole varovainen. Serialisoidut objektit voivat sisaltaa herkkaa informaatiota ja jos serialisoitu data paatyy vaariin kasiin, voidaan dataa kayttaa esimerkiksi systeemisi hyvaksikayttoon. Taman seikan takia on hyva idea kayttaa datan salausta (encryption) seka muita turvallisuuskeinoja tyoskennellessa serialisoinnin kanssa.

Suuret taulukot

[muokkaa | muokkaa wikitekstia]

Javaa on kritisoitu siita, ettei se tue taulukoita, joiden koko on 231 (noin 2,1 miljardia) alkiota tai enemman.[76] Tama rajoittaa Javaa ohjelmointikielena; the Java Language Specification, kohdassa 10.4 sanotaan seuraavaa:


Taulukot on indeksoitava konaisluvuilla... Jos yrittaa kayttaa taulukon arvoa, jonka indeksi on pitka kokonaisluku, seurauksena on kaannosaika-virhe.[77]


Suurten taulukoiden tukeminen vaatisi myos muutoksia Javan virtuaalikoneeseen (JVM).[78] Rajoitus ilmenee osa-alueilla, kuten kokoelmien koon rajoittuminen kahteen miljardiin alkioon[79] ja kyvyttomyys muistikartoittaa jatkuvia tiedostolohkoja, joiden koko on suurempi kuin 2 GB (gigatavua).[80] Javassa ei myoskaan ole moniulotteisia taulukoita (vierekkain varatut yksittaiset muistilohkot, joihin paasee yhdella epasuunnalla), mika rajoittaa tieteellisen ja teknisen tietojenkasittelyn suorituskykya.[70]

Javassa ei ole tehokasta tapaa alustaa taulukoita. Kun taulukko maaritetaan, Javan virtuaalikone (JVM) kaantaa sen tavukoodeiksi ohjeilla, jotka asettavat sen elementit yksitellen ajon aikana. Koska Javan metodit eivat voi olla suurempia kuin 64 KB (kilotavua), jopa vaatimattoman kokoiset taulukot, joiden arvot on asetettu suoraan koodissa, antavat virhe ilmoituksen "Error: code too large" (Virhe: koodi liian isoa) kaannettaessa.[81]

Koska jokainen koodi on tulkittava konekoodiksi, Java on hitaampi muihin kieliin, kuten esimerkiksi C:hen ja C++:aan. Java on huomattavasti hitaampi kuin kielet, jotka tuottavat kaannoskoodia suoraan koneelle, seka se kayttaa paljon muistia.

Javaa on kritisoitu sen nopeudesta sovellusten kaynnistyksessa. Javalla tehdyt sovellukset voivat kaynnistya hitaammin kuin muilla ohjelmointikielilla tuotettuihin sovelluksiin, mika voi tuottaa ongelmia tietynlaisissa sovelluksissa. Javan hitaus sovellusten kaynnistamisessa johtuu siita, etta Java-sovellusten on kaynnistyessaan ladattava suuri maara luokkia ja kirjastoja, mika voi johtaa viiveisiin.

Toinen kritiikin kohde Javan nopeuteen liittyen koskee tapaa, jolla Java kasittelee muistin varausta. Vaikka Javan automaattisesta muistin hallinnasta voi olla hyotya koodaajalle, se voi myos johtaa suorituskyky ongelmiin. Javan kayttama roskakori voi vieda merkittavan maaran prosessorin resursseista, minka seurauksena sovellus voi hidastua. Javan muistin varaus voi johtaa myos muistin sirpaloitumiseen, milla on suora vaikutus suorituskykyyn.

Java-ohjelmien sisaiset ominaisuudet ei vaikuta kielen ajonaikaiseen suorituskykyyn yhta paljon kuin kaantajan tai virtuaalikoneen laatu. Kaannetyn ohjelman ajaminen esimerkiksi virtuaalikoneen avulla on natiivia suoritusta hitaampaa. Virtuaalikoneet voivat tarjota esimerkiksi alustariippumattomuuden ja yksinkertaistetun kehityksen, mutta samalla laskea suorituskykya.

Java-ohjelmistoja jaa myos paljon paivittamatta pelkan tietoisuuden puutteen takia. Yleisin syy talle on se, ettei kayttaja yksinkertaisesti ole vain tietoinen uusista ja parantavista paivityksista, tai toiselta kantilta kayttaja ei ole tietoinen siita, kuinka paivitykset tulisi tehda.[82]

Javan turvallisuutta on kritisoitu paljon. Oraclen toimintaa liittyen siihen, kuinka he informoivat loytyvista turvallisuusbugeista, on erityisesti nostettu esille. On tullut ilmi, ettei Oraclen puolesta kaikista naista ei ole laajalti informoitu kayttajia. Esimerkiksi kun julkaistiin korjaukset monille vioille Java 7:ssa, poisti se Java 6:n kayttajien koneista ja erityisesti tama vaikutti yrityksien sovelluksiin. Oracle oli alun perin vakuuttanut, ettei tama vaikuttaisi niihin ja ne olisivat turvassa paivityksilta. Tama kuitenkin oli vakava turvallisuusriski, silla Java 6 on laajalti kaytossa yrityksien sovelluksissa.[82]

Java-koodiymparisto antaa mahdollisuuden hyodyntaa hiekkalaatikko testausta, ja ajaa ohjelmia, joiden koodi ei ole korkealaatuista. Kayttaja voi siis ajaa ymparistossa koodeja, ja ohjelmia, epaluotettavia tavukoodiohjelmia. Tama voi antaa haittaohjelmille mahdollisuuden hyodyntaa naiden ohjelmien tietoturvaongelmia ja paasta kasiksi esimerkiksi tiedostojarjestelmiin, paasta yhdistamaan yksityisiin verkkoihin tai jopa alkaa suorittaa mielivaltaisia komentoja.[82]

Javan vertailu muihin ohjelmointikieliin

[muokkaa | muokkaa wikitekstia]
  • Horstmann, Cay S. & Cornell, Cary: Inside Java 2, s. 1-730. Suomentanut Veli-Pekka Ketola. Helsinki: Edita, IT Press, 2000. ISBN 951-826-024-9
  • Meyers, Nathan: Java Programming on Linux, s. 1-907. Waite Group Press, 2000. ISBN 1-57169-166-9
  • Hiuttu, Petri & Niemi, Juha: Opeta itsellesi Java ohjelmointi, s. 1-508. Espoo: Suomen ATK-kustannus, 1996. ISBN 951-762-468-9
  • Peltomaki, Juha & Silander, Simo: Java 2. Jyvaskyla: Docendo, 2003. ISBN 951-846-708-0
  • Peltomaki, Juha & Malmirae, Pekka: Java, s. 1-551. Jyvaskyla: Teknolit, 2000. ISBN 951-846-038-8
  1. | Oracle Corporation: Java(tm) SE Development Kit 20 Release Notes 18.1.2022. oracle.com. Viitattu 14.2.2022. (englanniksi)
  2. | Sun opens Java GCN.com. 13. marraskuuta 2006. Arkistoitu 30.9.2007. Viitattu 7.7.2010.
  3. | Real World Applications of jJava softwaretestinghelp.com
  4. | [1] 8 Best Popular Projects on Java] Medium.com
  5. | [2]
  6. | Kieron Murphy: So why did they decide to call it Java? JavaWorld. 4.10.1996. Arkistoitu 15.3.2019. Viitattu 8.11.2018.
  7. | Richard Castagna: What is ECMA--and why Microsoft cares www.zdnet.com. 14.12.2001. Arkistoitu 6.5.2014. Viitattu 6.4.2023. (englanniksi)
  8. | JAVAONE : Sun: The bulk of Java is open sourced grnlight.net. 26.5.2014. Arkistoitu 27.5.2014. Viitattu 6.4.2023. (englanniksi)
  9. | On a New Road nighthacks.com. 9.4.2010. Arkistoitu 5.11.2010. Viitattu 6.4.2023. (englanniksi)
  10. | Jorma Kyppo & Mika Vesterholm: Java-ohjelmointi, s. 24. Talentum, 2010. ISBN 978-952-14-1356-8
  11. | Story Sun.com
  12. | Ron Amadeo: Android N switches to OpenJDK, Google tells Oracle it is protected by the GPL arstechnica.com. 6.1.2016. Viitattu 28.1.2023. (englanniksi)
  13. | Frederic Lardinois: Kotlin is now Google's preferred language for Android app development techcrunch.com. 7.5.2019. Viitattu 19.2.2020. (englanniksi)
  14. | Viestintavirasto suosittaa Java-ohjelmiston poistoa tietokoneelta Yle uutiset 28.8.2012]
  15. | Javan turvaongelmaan tuli korjaus 3t.fi (Arkistoitu - Internet Archive)
  16. | Introducing Java SE 11 25.9.2018, viitattu 18.8.2019 (englanniksi)
  17. | Oracle Makes Developers More Productive with Latest Java Release 19.3.2019, viitattu 18.8.2019 (englanniksi)
  18. | Oracle Keeps Driving Developer Productivity with New Java Release Oracle.com. Viitattu 5.10.2019. (englanniksi)
  19. | Oracle Announces Java 14 17.3.2020. Oracle.com. Viitattu 26.4.2020. (englanniksi)
  20. | openjdk.org 15.9.2020, viitattu 21.2.2023 (englanniksi)
  21. | openjdk.org 16.3.2021, viitattu 21.2.2023 (englanniksi)
  22. | openjdk.org 13.9.2021, viitattu 21.2.2023 (englanniksi)
  23. | openjdk.org 22.3.2022, viitattu 21.2.2023 (englanniksi)
  24. | openjdk.org 20.9.2022, viitattu 21.2.2023 (englanniksi)
  25. | [3] oracle.com/ 24.1.2023, viitattu 21.2.2023 (englanniksi)
  26. | [4] oracle.com/ oracle.com
  27. | Java Support Roadmap oracle.com
  28. | a b c d Oracle JDK 20 Certified System Configurations oracle.com. Viitattu 31.7.2023.
  29. | Oracle JDK 20 Certified System Configurations Virtualization oracle.com. Viitattu 31.7.2023.
  30. | a b Oracle Java SE Documentation oracle.com. Viitattu 27.2.2023.
  31. | JavaFX Tutorial - javatpoint www.javatpoint.com. Viitattu 18.6.2022. (englanniksi)
  32. | a b JavaFX. Wikipedia, 5.10.2022. Artikkelin verkkoversio. (englanniksi)
  33. | Lowe, Doug: JavaFX for Dummies, s. 10. Hoboken, New Jersey : John Wiley & Sons, Inc., 2015.
  34. | Control Flow Statements oracle.com. Viitattu 10.3.2023. (englanniksi)
  35. | The Concept Of Null In Java Logit.io. Viitattu 31.3.2023. (englanniksi)
  36. | Declaring Classes oracle.com. Viitattu 10.3.2023. (englanniksi)
  37. | Defining Methods oracle.com. Viitattu 10.3.2023. (englanniksi)
  38. | Lesson: Exceptions oracle.com.
  39. | Specifying the Exceptions Thrown by a Method oracle.com. Viitattu 11.3.2023. (englanniksi)
  40. | Controlling Access to Members of a Class docs.oracle.com. Viitattu 10.3.2023. (englanniksi)
  41. | The Invention of the Object: Object Orientation and the Philosofical Development of Programming Languages oracle.com. Viitattu 18.7.2023. (englanniksi)
  42. | a b c Mika Vesterholm & Jorma Kyppo: Java-ohjelmointi, s. 80-81. Alma Talent Oy, 2018. ISBN 978-952-14-3556-0
  43. | Generic Types docs.oracle.com. Viitattu 10.3.2023. (englanniksi)
  44. | Java Programming Language docs.oracle.com. Viitattu 10.3.2023. (englanniksi)
  45. | Class ArrayList docs.oracle.com. Viitattu 7.3.2023. (englanniksi)
  46. | Abstract Methods and Classes (The Java(tm) Tutorials > Learning the Java Language > Interfaces and Inheritance) docs.oracle.com. Viitattu 31.3.2023.
  47. | InstantiationError (Java SE 10 & JDK 10 ) docs.oracle.com. Viitattu 31.3.2023.
  48. | Abstract Methods and Classes (The Java(tm) Tutorials > Learning the Java Language > Interfaces and Inheritance) docs.oracle.com. Viitattu 31.3.2023.
  49. | a b Introduction to Garbage Collection - Dev.java Dev.java: The Destination for Java Developers. 14.9.2021. Viitattu 14.3.2023. (englanniksi)
  50. | Garbage Collection in Java - Dev.java Dev.java: The Destination for Java Developers. 12.9.2021. Viitattu 14.3.2023. (englanniksi)
  51. | [5]
  52. | [6]
  53. | [7]
  54. | [8]
  55. | Inner Class in Java GeeksforGeeks. 6.5.2014. Viitattu 6.1.2026. (englanniksi)
  56. | Anonymous Inner Class in Java GeeksforGeeks. 19.12.2016. Viitattu 7.1.2026. (englanniksi)
  57. | Java vs JavaScript - What is the difference between? | SCAND Blog SCAND. Viitattu 29.7.2023. (englanniksi)
  58. | Use outside the Java platform en.wikipedia.org. Viitattu 20.3.2023. (englanniksi)
  59. | Android SDK en.wikipedia.org. Viitattu 20.3.2023. (englanniksi)
  60. | Java API Framework developer.android.com. Viitattu 20.3.2023. (englanniksi)
  61. | Google LLC v. Oracle America, Inc. Wikipedia, 23.3.2023. Artikkelin verkkoversio. (englanniksi)
  62. | Ken Arnold: Generics Considered Harmful 27.6.2005. Arkistoitu Viitattu 10.3.2023. (englanniksi)
  63. | Dejan Jelovic: Why Java Will Always Be Slower than C++ Arkistoitu Viitattu 10.3.2023. (englanniksi)
  64. | Sean R. Owens: Java and unsigned int, unsigned short, unsigned byte, unsigned long, etc. (Or rather, the lack thereof) Arkistoitu Viitattu 10.3.2023. (englanniksi)
  65. | W. Kahan & Joseph D. Darcy: How Java's Floating-Point Hurts Everyone Everywhere (PDF) (ACM 1998 Workshop on Java (Stanford)) 1.3.1998. Arkistoitu Viitattu 10.3.2023. (englanniksi)
  66. | Have you checked the Java? 18.10.2010. Arkistoitu Viitattu 10.3.2023. (englanniksi)
  67. | Bug Database bugs.java.com. Viitattu 29.3.2023.
  68. | Java and unsigned int, unsigned short, unsigned byte, unsigned long, etc. (Or rather, the lack thereof) www.darksleep.com. Viitattu 29.3.2023.
  69. | Darcy Joseph D.: Unsigned Integer Arithmetic API now in JDK 8 Oracle Weblog.
  70. | a b Moreira, J.E.; S. P. Midkiff; M. Gupta; P. V. Artigas; M. Snir; R. D. Lawrence: "Java programming for high-performance numerical computing". IBM Systems Journal., 2000.
  71. | My Digital Neuron benhutchison.wordpress.com.
  72. | Sherman R. Alpert (IBM) (1998). "Primitive Types Considered Harmful". Java Report, November, 1998 (Volume 3, Number 11).
  73. | Serialization and Deserialization in Java with Example GeeksforGeeks. 13.1.2016. Viitattu 23.3.2023. (englanniksi)
  74. | Serialization Must Die - DZone dzone.com. Viitattu 23.3.2023. (englanniksi)
  75. | 1.Bloch, Joshua (2018). Effective Java. Addison-Wesley. pp. 339-345. ISBN 978-0-13-468599-1
  76. | Why does Java's Collection.size() return an int? - Programmers web.archive.org. 26.3.2013. Arkistoitu 26.3.2013. Viitattu 29.3.2023.
  77. | James Gosling; Bill Joy; Guy Steele; Gilad Bracha: Java SE Specifications docs.oracle.com. Viitattu 29.3.2023.
  78. | Lowden James: Proposal: Large arrays (take two) mail.openjdk.org. Tue Mar 24 12:02:22 PDT 2009. Viitattu 29.3.2023.
  79. | Collection (Java Platform SE 7 ) docs.oracle.com. Viitattu 29.3.2023.
  80. | ByteBuffer (Java Platform SE 7 ) docs.oracle.com. Viitattu 29.3.2023.
  81. | David Flanagan. Java in a Nutshell. p. 77.
  82. | a b c Criticism of Java. Wikipedia, 4.4.2023. Artikkelin verkkoversio. (englanniksi)

Aiheesta muualla

[muokkaa | muokkaa wikitekstia]
Wikimedia Commonsissa on kuvia tai muita tiedostoja aiheesta Java.