Java

Java on Sun Microsystemsin kehittämä teknologiaperhe ja ohjelmistoalusta, johon kuuluu muun muassa laitteistoriippumaton oliopohjainen ohjelmointikieli sekä ajoaikainen ympäristö virtuaalikoneineen ja luokkakirjastoineen. Alun perin kaupallisesti lisensoitu Java on vuodesta 2007 alkaen ollut vapaan GNU GPL -lisenssin alainen. Java-alusta on käytössä noin 3,8 miljardissa laitteessa matkapuhelimista supertietokoneisiin.

Nimi
Java nimettiin tammikuussa 1995 Yhdysvalloissa Javaksi kutsutun kahvilaadun mukaan, jota tuotetaan Jaavalla Indonesiassa. Ennen nimenmuutosta kehittäjät olivat käyttäneet uudesta kielestään nimeä Oak ja sitä ennen nimeä Greentalk. Nimeä Oak ei kuitenkaan voinut enää käyttää, koska Oak Technologies -yhtiöllä oli siihen oikeudet. Uusi nimi valittiin palaverissa kymmenen ehdotuksen joukosta, joista äänestysvaiheeseen pääsivät myös nimet DNA ja Silk. Nimen Java ehdottajasta on nykyisin erilaisia käsityksiä.

Ohjelmointikieli JavaScript nimettiin myöhemmin Javan mukaan, mutta sitä yhdistää Javaan lähinnä vain syntaksi.

Yleistä
Java-ohjelmointikielen kehittivät Bill Joy ja James Gosling kollegoineen Sun Microsystemsillä 1990-luvun alussa. JDK 1.0 (Java Development kit) ilmestyi syksyllä 1995. Se soveltui www-sivulle luotavien applettien tekemiseen, mikä nosti Javan nopeasti ohjelmointimaailman kuumimmaksi puheenaiheeksi. Keväällä 1997 julkaistiin JDK 1.1, jossa oli muuttunut erityisesti käyttöliittymän ohjelmointi oliomaisempaan suuntaan. JDK 1.2 julkaistiin loppuvuonna 1998, ja se sisälsi uuden JFC-luokkakirjaston (Java Foundation Classes), jossa mukaan tuli mm. Swing käyttöliittymien luominen ja monipuolisia tietorakenneluokkia.

Java-kielen 1990-luvun lopulla saavuttaman suuren suosion takana ovat laitteistoriippumattomuuden lisäksi kielen C++-kieltä läheisesti muistuttava, mutta helpommin omaksuttavaksi suunniteltu kielioppi, oliopohjaisuus ja virtuaalikoneen mukana tuleva, erittäin kattava standardikirjasto. Myös muistinhallintaa on helpotettu ottamalla käyttöön roskienkeräin (engl. garbage collector), joka vapauttaa muistia kun sitä ei enää tarvita. Java kuuluu ohjelmointikieliin, joissa on käytössä ns. vahva tyypitys. Tämä tarkoittaa sitä, että jokaisella muuttujalla on tyyppi ja muuttujat voivat saada ainoastaan tyyppinsä mukaisia arvoja.

Toisin kuin tavanomaisen kielet, Javan lähdekoodia ei käännetä suoraan konekielelle, vaan tavukoodiksi, joka suoritetaan virtuaalikoneessa. Koska Java-ohjelmat ajetaan virtuaalikoneessa, ne eivät normaalisti pysty vaikuttamaan suoraan muihin prosesseihin, eivätkä pääse virtuaalikoneelle määrätyn hiekkalaatikon ulkopuolelle vaan esimerkiksi tiedostoja käsitellessä käskyt kulkevat virtuaalikoneen läpi, joka varmistaa että käsky on turvallisuusasetusten mukainen. Java-ohjelmat ovat mm. näiden rajoitusten vuoksi tavanomaisia konekieliohjelmia turvallisempia, mutta samalla hieman hitaampia.

Muihin ohjelmointikieliin, kuten C tai C++ verrattuna, Java sisältää runsaasti ominaisuuksia, kuten graafisen käyttöliittymäkirjaston, rinnakkaisuuden hallinnan, verkko-ominaisuudet ja rikkaat rajapinnat, jotka toisissa kielissä ovat käyttöjärjestelmäriippuvaisia tai kolmansien osapuolten kirjastojen varassa.

Javaa markkinoitiin alun perin Web-käyttöön, selaimen sisällä ajettavia sovelmia varten. Se löi kuitenkin varsinaisesti läpi palvelinkäytössä, dynaamisia www-sivuja luotaessa (JSF, JSP, servlet), raskaissa palvelinsovelluksissa (Java EE) ja kännyköissä ja taskutietokoneissa (Java ME). Yleisyytensä ja ilmaisuutensa ansiosta se on myös suosittu opetuskieli.

Java-alustan käyttöä ei ole rajattu Java-ohjelmointikieleen, vaan mm. Python-, Ruby- ja Scheme-kielille on olemassa kääntäjä, joka tuottaa Java-tavukoodia. Sun Microsystemsin lisäksi ainakin IBM ja GNU ovat kehittäneet omat Java-kääntäjänsä ja IBM, Novell, BEA Systems ja Apache omat virtuaalikoneensa lukuisten avoimen lähdekoodin toteutusten (kuten Kaffe, SableVM, JamVM, CACAO, Jikes RVM, VMkit) lisäksi. GNU:n kääntäjäympäristöön GCC:hen kuuluva GCJ osaa kääntää Javaa konekielelle.
GNU ryhtyi myös kehittämään korvaavaa, vapaata luokkakirjastoa GNU Classpath -projektissa.

Sun ilmoitti 13. marraskuuta 2006 julkaisevansa Javan GNU GPL-lisenssillä.

Apachen virtuaalikone Harmonysta on kehitetty Googlen Androidissa käytetty Dalvik-virtuaalikone. Harmony ei ole virallisesti sertifioitu Java-toteutus.

Sunin kehitysympäristö
Javaan kuuluu ohjelmointikieli, josta on julkaistu eri versioita kehitysympäristön (Java Development Kit; JDK) kehittymisen myötä. Kehitysympäristöön kuuluu kääntäjä (javac) ja muut kehitystyökalut (jar, javadoc, jdb). Kehitysympäristö sisältää myös täydellisen ajoympäristön (Java Runtime Environment; JRE), joka tarvitaan käännettyjen ohjelmien ajamiseen. Ajoympäristö sisältää virtuaalikoneen (Java Virtual Machine; JVM), joka on JRE:n versiosta 1.2 (joulukuu 1998) lähtien sisältänyt ajonaikaisen käännöksen konekielelle (just-in-time compiler; JIT). Ajoympäristöön kuuluvat myös luokkakirjastot, jotka ovat nekin saaneet lisää ominaisuuksia Javan kehittymisen myötä. Java 1.2 brändättiin suurten muutosten vuoksi nimellä Java 2. Java 2 -nimeä ei kuitenkaan käytetty markkinoinnissakaan kovin kauan, sillä jo Java 1.5 brändättiin Java 5:ksi.

Ajoympäristö on nykyisin jaettu kolmeen osaan.
Java Standard Edition (Java SE) sisältää yleiset ominaisuudet, graafiset käyttöliittymät, tietokanta- (Java Database Connectivity; JDBC) ja perus-XML-rajapinnat.
Java Enterprise Edition (Java EE) on tarkoitettu palvelinsovellusten kehittämiseen ja ajamiseen ja sisältää mm. nimeämis- ja hakemistopalvelut (Java Naming and Directory Interface; JNDI), komponenttirajapinnan (Enterprise Java Beans; EJB), servlet- ja portlet-määrittelyt, 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 merkittävästi muista ympäristöistä ja käyttää rajoitetumpaa virtuaalikonetta (K Virtual Machine; KVM) ja jättää toteuttamatta joitain kielen ominaisuuksia (kuten liukuluvut ja luokkien purkajat). Java ME on edelleen jaettu konfiguraatioihin ja profiileihin laitteiden ominaisuuksien mukaan.

Versioita 
 Java SE 6 esiteltiin 11. joulukuuta 2006.
 Java SE 7 esiteltiin 28. heinäkuuta 2011. Viestintävirasto ilmoitti elokuussa 2012, että Java 7 aiheuttaa Windows-ympäristössä vakavan tietoturva-aukon ja kehottaa poistamaan version. Tietoturva-aukkoon tuli korjaava päivitys 30. elokuuta 2012. 
 Java SE 8 esiteltiin 18. maaliskuuta 2014. 
 Java SE 9 esiteltiin 9. syyskuuta 2017. 
 Java SE 10 esiteltiin 20. maaliskuuta 2018.
 Java SE 11 esiteltiin 25. syyskuuta 2018.
 Java SE 12 esiteltiin 19. maaliskuuta 2019.
 Java SE 13 esiteltiin 16. syyskuuta 2019.
 Java SE 14 esiteltiin 17. maaliskuuta 2020.

Sovelluskohteet
Javan ensimmäinen kohdeympäristö oli web-selaimet, joissa Java-sovelmia (applet) voitiin ajaa turvallisesti. Appletit olivat osa jo ensimmäistä Java-julkaisua 1995. Tekniikan otti omakseen erityisesti Netscape selainsodissa Microsoftia vastaan. Myös Microsoft kehitti oman virtuaalikoneensa MSJVM:n, jonka toteutuksesta se joutui oikeusjutun kohteeksi Sunin taholta. Microsoft luopui Javan kehityksestä 2001 ja nyttemmin luonut oman lähes samanlaisen kilpailevan tekniikkansa (.NET ja C#). Applettien suosio on jäänyt vähäiseksi ja muut tekniikat, kuten Flash ovat ottaneet paikan yksinkertaisten selainsovellusten luonnissa. Myöskään Java-pohjaiset verkkotietokoneet (JavaStation, JavaOs), joita useat valmistajat esittelivät, eivät yleistyneet.

Verkon yli ladattavien sovellusten luontiin Oraclella on Java Web Start -tekniikka, joka mahdollistaa täydellisten sovellusten suorittamisen verkon yli. Java Web Start esiteltiin maaliskuussa 2001 ja Java versiosta 1.4 lähtien se on ollut osana JRE:tä.

Java Servlet API on dynaamisten websivujen kehittämiseen tarkoitettu rajapinta. Se on osa Java EE -pakettia. Servlet-rajapinnan toteuttaa servlet container (joskus käännetty suomeksi termillä kontti). Container tarjoaa web-palvelimen, jonka toiminnallisuutta voi laajentaa omilla komponenteilla hyödyntäen Javan rajapintoja. Container tarjoaa suoraan joitain palveluja, kuten istunnonhallinnan. JavaServer Pages (JSP) on Servlet API:a käyttävä tekniikka, joka käyttää yksinkertaista merkkauskieltä HTML:n seassa hyödyntämään palvelimella olevien komponenttien toiminnallisuutta tai sisältää suoraan Java-koodia. JSP muistuttaa lähinnä CGI- tai PHP-skriptausta.

Enterprise JavaBeans (EJB) on Servlet API:n kaltainen tekniikka, mutta on tarkoitettu etupäässä tietokantakäyttöön. EJB-komponentit (pavut) ajetaan sovelluspalvelimessa, joka tukee hajauttamista, transaktioita ja rinnakkaisuuden hallintaa. Sunin määrittelemää rajapintaa hyödyntävien servlet- ja EJB-tekniikoiden hyötynä on se, että periaatteessa sama sovellus on ajettavissa kaikissa rajapinnan toteuttavissa sovelluspalvelimissa. Näitä ovat esim. JBoss, IBM WebSphere Application Server, Oracle GlassFish ja Oracle WebLogic. 

Javaan on saatavilla JavaFX-ohjelmointialusta.

Esimerkki 

Tyypillinen "Hello, World" -esimerkki:

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

Silmukat

For-silmukka

For-silmukassa toistetaan kaarisulkeiden sisältämää koodia niin kauan, kunnes ehto on epätosi. Alla olevassa esimerkissä, olio luodaan alustus-kohdassa. Jos ehto on tosi, kasvatetaan lukua niin paljon, kuin kasvu-kohta määrää, ja siirrytään koodia-kohtaan. Tätä jatkuu niin kauan, että ehto on epätosi.

 for (''alustus''; ''ehto''; ''kasvu'') {
     ''koodia''
 }

Esimerkki Java-luokasta, joka tulostaa komentoriville luvut 1–10, jokaisen omalle rivilleen.

public class Silmukka {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            // Tulostetaan luku
            System.out.println(i);
        }
    }
}

J2SE 5.0:ssa tuli käyttöön uudistettu for-silmukka, joka käy läpi kaikki vaihtoehdot ilman silmukkamuuttujan kasvatusta.

public class Silmukka {
    public static void main(String[] args) {
        for (String s : args) {
            // Tulostetaan komentorivin parametrit
            System.out.println(s);
        }
    }
}

While-silmukka
While-silmukka ajetaan jos ehto on tosi ja toistetaan niin kauan kuin ehto on tosi.

Esim.

public class Silmukka {
    public static void main(String[] args) {
        int a = 1;
        String s = "While-silmukka";
        while (a < 10) {
            a++; 
            System.out.println(s);
        }
    }
}

Lähteet

Viitteet

Aiheesta muualla 

 Sunin Java-sivut 
 Javadoc J2SE 1.6 
 Ohjelmoinnin perusteita Java-kielellä
 Aloittelijan Java-opas
 Sopimuspohjainen olio-ohjelmointi Java-kielellä
 Java-kehitysympäristön pystyttäminen ja HelloWorld-ohjelman luominen
 Full Java Tutorial 
 NetBeans, Avoimeen lähdekoodiin perustuva Java-kehitysympäristö

Seulonnan keskeiset artikkelit