cyanic-selkie/wikianc huggingface dataset:
Java
Sovelluskohteet
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, jonka ensimmäinen versio julkaistiin vuonna 2008. JavaFX:n oli alun perin tarkoitus korvata Swing API kokonaan, mutta myöhemmin aikeesta on luovuttu.
Apache-säätiö kehitti Javalle avoimen lähdekoodin työkaluja Jakarta-projektissa. Projektin nimi siirtyi Eclipse-säätiön Java-laajennusten paketin nimeksi samassa yhteydessä kun Eclipse otti kehitettäväkseen Apachen J2EE-sovelluspalvelimen. Useat Apachen Java-projektit on eriytetty omiksi ohjelmapaketeikseen, esim. Apache Ant. Apachen yleiset Java-kirjastot tunnetaan nykyisin nimellä Apache Commons.
Ohjelmointiympäristöt
Javalle on olemassa monia erilaisia ohjelmointiympäristöjä, jotka tarjoavat erilaisia ominaisuuksia ja työkaluja. Ilmaisia ovat esimerkiksi NetBeans ja Eclipse ja BlueJ. Kaupallisia ovat esimerkiksi JetBrainsin IntelliJ IDEA. Googlen Android Studio on virallinen ympäristö Android-kehitykseen ja tukee myös muilla kielillä kehittämistä.
Perusominaisuudet
Java tukee tyypillisiä toistorakenteita ja ehtolauserakenteita.
Javassa osoittimelle voidaan antaa arvoksi null eli tyhjä. Kyseistä erikoisarvoa kutsutaan null-osoittimeksi, joka tarkoittaa, että osoitin ei osoita mihinkään. Null ei ole tyyppi tai olio itsessään, vaan viittaus, joka ei osoita mihinkään. Null on oletusarvo minkä tahansa viitetyypin muuttujalle, jota ei ole alustettu ilmoitushetkellä. Tämä koskee kaikenlaisia ​​muuttujia, instanssimuuttujia tai staattisia muuttujia, paitsi että kääntäjä varoittaa, jos käyttää paikallista muuttujaa alustamatta sitä. Null-arvoa käytetään usein osoittamaan, että viitemuuttujaa ei ole alustettu tai että menetelmä ei palauttanut kelvollista objektiviittausta. On tärkeää huomata, että null-arvo voidaan määrittää vain viitetyypeille, minkä myötä sitä ei voi määrittää primitiivisille muuttujille, kuten int, double, float tai boolean. Java:n instanceof -tyyppivertailuoperaattori kokeilee, onko objekti tietyn tyypin esiintymä. Se myös vertaa ilmentymää tyyppiin ja palauttaa joko true(tosi) tai false(epätosi). Jos instanceof-operaattoria käytetään minkä tahansa muuttujan kanssa, jolla on null-arvo, se palauttaa arvon false.
Olio-ohjelmointi
Java tukee olio-ohjelmointia. Kielessä voidaan käyttää luokkia, joiden jäsenenä olevia aliohjelmia kutsutaan metodeiksi.
Metodien määrittelyssä kerrotaan paluuarvon tyyppi, nimi ja valinnaisia ominaisuuksia (parametrit, näkyvyys ja niin edelleen). Java tukee poikkeuksia.
Muiden luokkien pääsyä voidaan rajoittaa. Päätasolla näkyvyys voi olla julkinen tai pakettikohtainen. Jäsentasolla näkyvyys voi olla,   tai. Jos näkyvyyttä ei määritellä luokalle se näkyy vain sen paketille.
Java rakennettiin lähes yksinomaan oliokieleksi, joten Java-kieliset ohjelmat ovat lähes aina oliopohjaisia ohjelmia. Olio-ohjelmointi onkin nykypäivänä yksi ohjelmointi alan tärkeimmistä työkaluista, jonka avulla voidaan luoda tehokkaampia, joustavampia ja helpommin ylläpidettävissä olevia ohjelmistoja. Java onkin usein käytetty ohjelmointikieli oliopohjaisessa ohjelmoinnissa.
Olio-ohjelmoinnin perusperiaatteisiin kuuluu kapselointi, periytyminen, polymorfismi ja abstraktio. Nämä auttavat ohjelmiston kehittäjiä luomaan modulaarisia ohjelmistoja, joissa eri osat ovat itsenäisiä ja ovat helposti laajennettavissa. Tämän avulla koodia voidaan uudelleenkäyttää ja näin vähentää saman tai samantyylisen koodin toistamista ohjelmistoissa. Olio-ohjelmointi tekee isojen ohjelmien koodista helpommin organisoitavaa. Tämä auttaa ohjelmistojen kehittäjiä työskentelemään tehokkaammin yhdessä ja monimutkaisten ohjelmistojen hallitsemissa. Olio-ohjelmoinnin merkitys tulee tulevaisuudessa vain kasvamaan ohjelmistojen kehittyessä yhä monimutkaisimmiksi.
Kapseloinnilla tarkoitetaan tiedon piilottamista. Eli luokan sisäiset yksityiskohdat voidaan piilottaa ulkopuolisilta.
Periytymisellä tarkoitetaan sitä, että lapsiluokka perii vanhempiensa tiedot ja toiminnallisuudet. Tätä voidaan havainnollistaa esimerkiksi niin, että koira ja kissa ovat kummatkin erilaisia eläimiä, mutta ne molemmat ovat nisäkkäitä. Tällöin he perivät nisäkkään ominaisuudet, mutta niillä on myös omia ominaisuuksia.
Polymorfismilla tarkoitetaan olioiden kykyä ottaa monta muotoa. Esimerkiksi ihminen voi olla jonkun puoliso, lapsi ja työntekijä samaan aikaan, mutta käyttäytyy eri tavalla näissä tilanteissa.
Abstraktio tarkoittaa kokonaisuuksien käsittelyä, jossa tarkennetaan tarvittaessa.
Olio-ohjelmoitaessa pyritään luokilla ja niiden ilmentymillä tyypillisesti mallintamaan jotain todellisen elämän prosessia tai toiminnallisuutta. Olio-ohjelmoinnissa instanssit ovat interaktiivisia ja niiden ominaisuudet, kuten metodit ja muuttujat vastaavat realistista käyttötarkoitusta. Hyvän tyyliohjeen mukaisesti esimerkiksi "Eläin" -luokalla voi olla ainoastaan eri ”eläin” -ilmentymiä, kuten siili tai kissa. Vastaavasti näillä olioilla voi olla vain loogisesti yhteensopivia muuttujia kuten "nimi" tai "ikä", eikä esimerkiksi "teho" tai "polttoainetankin tilavuus".
Javan ja olio-ohjelmoinnin eri ominaisuudet ja perusperiaatteet kuten näkyvyyden rajoittaminen ja periytyminen oikein ja yhdessä käytettynä ohjaavat jäsentelemään koodia siten, että se mallintaisi todellista maailmaa tai vähintäänkin jotain kiinteää systeemiä. Esimerkiksi eläin olion, kuten "kissa", kyky periä kantaluokaltaan kaikille eläimille tyypillisiä piirteitä kuvastaa hyvin olio-ohjelmoinnin reaalimaailman mallintamisen periaatetta. Laadukas oliopohjainen ohjelma näyttää ulospäin ryhmältä olioita, jotka toimivat keskenään omien tarkoitustensa pohjalta ja kommunikoivat niiden toisilleen tarjoamien rajapintojen avulla.
Jokaisella oliolla on oma tehtävä ja tarkoituksensa eikä muiden olioiden tarvitse välttämättä tietää mistä piilotetuista metodeista ja muuttujista olio tarkalleen muodostuu. Esimerkiksi "kuljettaja" -olion ei tarkalleen tarvitse tietää miten "auto" -olio toimii. Sille riittää, että se voi käyttää "auto" -olion toiminnallisuuksia, kuten ”käynnistä moottori”, ”aja” tai "käänny". Tämä 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.
Syntaksi
Toisin kuin C++, Java ei tue operaattorin ylirasitusta tai monimuotoista periytymistä luokille, mutta toisaalta monimuotoinen periytyminen on tuettu käyttöliittymille.
Java käyttää saman tyyppisiä kommentteja kuin C++. On olemassa kolme erilaista tyyliä kommentoida: yhden rivin tyyli merkittynä kahdella kenoviivalla (//), monen linjan tyyli aloitettuna tällä /* ja lopetettuna tällä */, ja Javadoc kommentointi tyyli aloitettuna tällä /** ja lopetettuna tällä */. Javadocin tyyli kommentoida mahdollistaa sen, että käyttäjä voi ajaa Javadoc suoritettavan luodakseen dokumentointia ohjelmalle. Sen dokumentoinnin voi mahdollisesti lukea integroiduilla kehitysympäristöillä (IDE:t), kuten Eclipsellä antaakseen mahdollisuuden kehittäjille päästä dokumentointiin käsiksi IDE:n sisällä.
Tunnistin
Tunnistin on koodissa olevan elementin nimi. On olemassa tiettyjä vakiintuneita nimeämiskäytäntöjä, joita tulee noudattaa elementtien nimien valinnassa. Javassa tunnisteet ovat kirjainkoosta riippuvaisia.
-Minkä tahansa Unicode-merkin, joka on kirjain (mukaan lukien numeroa esittävät kirjaimet, kuten roomalaiset numerot) tai numero.
-Valuuttamerkin (kuten ¥).
-Yhdistävän välimerkin (kuten _).
Tunnistin ei voi:
-Aloittaa numerolla.
-Olla yhtä kuin varattu avainsana, null-arvo tai boolean-literal.
Muuttujat
Muuttujat ovat tunnisteita, jotka liittyvät 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 Useita saman tyyppisiä muuttujia voidaan julistaa ja alustaa yhdessä lausekkeessa käyttäen pilkkua erotinmerkkinä.
Operaattorit
Operaattorit Javassa ovat samankaltaisia kuin C++:ssa. Kuitenkin Javassa ei ole poisto-operaattoria roskien keräysmekanismien vuoksi, eikä osoittimiin liittyviä toimintoja, koska Java ei perustu osoittimiin, sekä Java suorittaa muistinhallinnan automaattisesti, ilman että ohjelmoijan tarvitsee manuaalisesti allokoida muistia. Toinen ero on, että Javassa on merkitsemätön oikeanpuoleinen siirto-operaattori, kun taas C: n oikeanpuoleinen siirto-operaattorin merkki riippuu tyypistä. Javassa operaattoreita ei voi ylikuormittaa.
Tunnukset
Javassa ohjelmoija joutuu antamaan nimen eli tunnuksen monille asioille. Esimerkiksi luokat, muuttujat, attribuutit ja metodit tarvitsevat tunnuksen. Javassa tunnus saa sisältää kirjaimia, numeroita ja alaviivan _. Dollarin merkkiä $ ja plussaa + ei kannata käyttää omien luokkien nimissä, koska näitä Java käyttää nimetessään sisäluokkia ja luetellun tietotyypin vakiarvoja. Välilyöntejä tai muita tyhjätilamerkkejä ei saa sisältyä tunnukseen. Tunnuksella ei ole pituusrajoitusta ja sen pitää alkaa kirjaimella. Hyvin kuvaavia nimiä saa käyttää tunnuksen nimeämisessä. Tunnuksista pitää tehdä kuvaavia ja sopivan pituisia. Tunnukset, jotka ovat liian pitkiä, ennemminkin tekevät koodista epäselvää luettavaa kuin auttavat koodin ymmärtämisessä. Tunnus ei saa olla mikään Javan avainsanoista.
Isot ja pienet kirjaimet tarkoittavat tunnuksissa eri asiaa. Monisanaisten tunnusten sanojen alkukirjaimet kirjoitetaan aina isolla kirjaimella, mikä on vakiintunut tapa Javassa. Luokan nimessä ensimmäisen sanan alkukirjain on tapana kirjoittaa isolla kirjaimella. Muuttujien, attribuuttien ja metodien nimissä pientä alkukirjainta käytetään ensimmäisen sanan alkukirjaimena. Esimerkiksi Raketti, RakettiMoottori, RakettiLaukaisualusta ja Alus ovat nimeämissäännön perusteella luokan nimiä. Nimeämissäännön perusteella muuttujien, attribuuttien ja metodien nimiä ovat esimerkiksi raketti, rakettiMoottori, räjäytäAlus ja ajaa.
Erikoiset merkit voivat aiheuttaa ongelmia tiedostojen nimissä, minkä takia luokkien nimeämisessä kannattaa käyttää vain merkkejä a–z. Esimerkiksi Äiti on huono luokan nimi, koska se sisältää ä-kirjaimen.
Esimerkki
Tyypillinen "Hello, World" -esimerkki:
Java-ohjelmoinnissa kaikki lähdetiedostot tulee nimetä niiden sisältävän julkisen luokan mukaan ja lisäksi siihen on liitettävä jälkiliite .java. Yllä esiintyvässä esimerkkitapauksessa tämä tarkoittaa sitä että tämän public-class ( julkisen luokan ) nimen ollessa HelloWorld, tulee lähdetiedosto tallentaa seuraavalla nimellä (HelloWorld) ja jälkiliitteellä (.java) HelloWorld.java Ensin java-kääntäjän on käännettävä tämä tavukoodiksi ja tuotettava .class päätteinen tiedosto. Esimerkkitapauksessa tätä vastaa HelloWorld.class. Vasta tämän jälkeen tuotos voidaan suorittaa tai käynnistää.
Java-lähdekooditiedosto voi sisältää vain yhden julkisen luokan, mutta siinä voi olla useita luokkia, joilla on ei-julkisen pääsyn määrittävä muuttuja sekä mitä tahansa määrää julkisia sisäluokkia. Kun lähdekooditiedosto sisältää useita luokkia, yhden niistä (joka on määritelty class-avainsanalla) täytyy olla julkinen (jota edeltää public-avainsana) ja lähdekooditiedosto täytyy nimetä kyseisen julkisen luokan nimellä.
Luokka, joka ei ole julkinen, voidaan tallentaa mihin tahansa .java-tiedostoon. Kääntäjä generoi luokkatiedoston jokaiselle lähdekoodissa määritellylle luokalle. Luokkatiedoston nimi on luokan nimi, johon on lisätty .class-pääte.
Metodi nimi  ei ole avainsana Java-ohjelmointikielessä, vaan ns. 'pääohjelmametodi'. Java-ohjelma käynnistetään käynnistämällä luokka, jossa - metodi on. Tätä metodia voidaan käyttää missä tahansa luokassa, joka on osana ohjelmaa. - metodin sisältävällä luokalla voi olla mikä vain nimi, mutta yleensä näitä luokkia kutsutaan vain  nimellä.
Avainsanojen merkitystä esitellään alla seuraavasti:
Avainsana public kertoo, että metodin voi kutsua muista luokista, tai että luokkaa voi käyttää myös luokkahierarkian ulkopuolella olevat luokat. Luokkahierarkia liittyy siihen kansioon, jossa .java-tiedosto sijaitsee, ja tätä kutsutaan pääsyä määrittäväksi muuttujaksi. Muita pääsyä määrittäviä muuttujia ovat private (metodi, johon pääsee vain samassa luokassa) ja protected (joka sallii käyttää koodia samasta paketista). Jos koodi yrittää käyttää yksityisiä tai suojattuja metodeja, JVM antaa SecurityExceptionin. Esimerkki julkisesta ja ei-julkisesta metodista julkisessa luokassa: Avainsana static metodin edessä tarkoittaa, että kyseessä on staattinen metodi, joka on assosioitu vain luokkaan eikä mihinkään tiettyyn luokan instanssiin. Vain staattisia metodeja voi kutsua ilman viittausta olioon. Staattiset metodit eivät voi käyttää luokan jäseniä, jotka eivät ole staattisia. Metodit, joita ei ole määritelty staattisiksi vaativat tietyn luokan esiintymän toimiakseen.
Avainsana Void osoittaa, että päämenetelmä ei palauta käyttäjälle mitään arvoa. Mikäli Java-ohjelman on tarkoitus poistua ohjelmasta virhekoodilla, sen täytyy kutsua nimenomaisesti metodia System.exit.
Avainsanat
Javassa on 53 avainsanaa, jotka on luokiteltu useisiin luokkiin, kuten pääsymuuntimet, ohjauskulku, luokat ja tietotyypit. Esimerkkejä käyttöoikeusmäärityksistä ovat "public," "private," ja "protected", jotka määrittelevät luokan tai menetelmän laajuuden. Ohjauskulun avainsanat, kuten "if", "else", "for" ja "while", antavat ohjelmoijille mahdollisuuden määrittää ehdollisen logiikan ja silmukat. Luokkiin ja tietotyyppeihin liittyviä Java-avainsanoja ovat "class," "interface," "enum," "extends" ja "implements". Näiden avainsanojen avulla ohjelmoijat voivat määrittää luokkia, rajapintoja ja enumeja sekä ilmoittaa ja alustaa eri tietotyyppien muuttujia.
Generics
Javassa on geneerisen ohjelmoinnin tuki sen tyyppijärjestelmässä. Generics on lisätty JDK versiossa 5.
Esimerkiksi ArrayList on listarakenne, joka tukee geneeristä ohjelmointia.
ArrayList on dynaaminen lista, joka toimii huomattavasti tehokkaammin kuin perinteiset taulukot.
Esimerkki ArrayListin käytöstä:
Yllä havainnollistettu "import java.util.Arraylist" on ArrayList:n sijaitsema kirjasto ja sen tuominen java-ohjelmaan mahdollistaa ArrayList:n käytön. Listaa pystytään hyödyntämään kätevästi myös luokkien välillä ja siihen liittyvä toiminta voi tapahtua toisen luokan metodeilla.
Tässä esimerkissä ArrayListin käyttö toimii seuraavalla tavalla:
Määritellään lista "ArrayList", mitä tietotyyppiä listaan syötetään tai alemman esimerkin mukaan, mitä tietoa listaan syötetään "hedelmäSalaatti". Luodaan uusi lista "new Arraylist<>".
Listaan voidaan lisätä tietoja.add menetelmällä, tässä tapauksessa hedelmäSalaatti .add. Listalta voidaan myös poistaa tietoja metodilla .remove. Tässä tilanteessa hedelmäSalaatti.remove. Size metodilla voidaan tulkita listan koko, joka toimii seuraavasti yllä olevaa esimerkkiä hyödyntäen: hedelmäSalaatti.size. Vastaavasti get-metodilla voidaan näyttää tietyllä indeksillä varustettu alkio seuraavasti: hedelmäSalaatti.get(0). Tässä etsimme listan 0:n alkion, mikä vastaa ensimmäistä jäsentä.
Vastaavasti sitä käyttää myös muilla tietotyypeillä:
Kommentit
Java-ohjelmointikielessä kommentit ovat välttämätön osa koodia, jonka avulla kehittäjät voivat dokumentoida ja selittää ohjelmakoodia. Kommentit ovat tärkeitä, koska ne helpottavat ohjelman ymmärtämistä ja ylläpitoa, auttavat välttämään virheitä sekä mahdollistavat koodin nopean päivittämisen ja muokkaamisen. Java tukee kahta erilaista kommentointityyppiä: yksirivisiä ja monirivisiä kommentteja.
Yksiriviset kommentit aloitetaan kahdella etuliitteellä "//" ja ne päättyvät automaattisesti rivin loppuun. Yksirivisiä kommentteja käytetään yleensä lyhyisiin selityksiin, kuten muuttujien tai metodien nimien selittämiseen.
Moniriviset kommentit aloitetaan "/" merkinnällä ja päättyvät "/" merkinnällä. Monirivisiä kommentteja käytetään yleensä laajempiin selityksiin, kuten ohjelman toimintaa selittämiseen tai koodin osien dokumentointiin. Monirivisiä kommentteja voidaan käyttää myös tilanteissa, joissa koodia ei haluta suorittaa, mutta sitä ei haluta poistaa kokonaan koodista. Tämä on hyödyllistä esimerkiksi testauksen yhteydessä, kun halutaan jättää tiettyjä testilohkoja kommentoituna käyttöön myöhempää käyttöä varten.
Kommentit ovat tärkeitä myös siksi, että ne helpottavat koodin ylläpidettävyyttä ja mahdollistavat koodin ymmärrettävyyden muille kehittäjille. Koodin ymmärrettävyys on erityisen tärkeää, kun useampi kehittäjä työskentelee saman projektin parissa tai kun projektin ylläpitoa siirretään toiselle kehittäjälle. Kommentit helpottavat myös ohjelmakoodin testausta ja vähentävät virheiden riskiä.
Periytyminen
Periytyminen (inheritance) on yksi Javan eli olio-ohjelmoinnin perusperiaatteita. Sen avulla voidaan vähentää turhan koodin toistamista. Siinä luokat voivat periä ominaisuusia ylemmiltä luokilta. Tällaista luokkaa, joka perii ylemmän luokan ominaisuuksia, kutsutaan lapsiluokaksi. Vastaavasti luokkaa, jonka ominaisuuksia peritään, kutsutaan lapsiluokan kantajaksi. Lapsiluokan kantaluokassa voidaan määritellä muuttujia ja metodeja, joita lapsiluokka perii ja voi käyttää. Ehtona tälle on kuitenkin se, että lapsiluokan kantaluokassa niiden näkyvyysmääre on määritelty suojattuna eli kyseessä on protected.
Kantaluokan toteutus metodille perityy lapsiluokalle Javassa. Lapsiluokalle on kuitenkin mahdollista kirjoittaa oma toteutuksensa metodille vanhan tilalle. Korvaavan metodin tulisi silti täyttää sama palvelu kuin alkuperäisen eri toteutuksella samaan rajapintaan. Lapsiluokan ilmentymää kutsuessa tulee kutsua kantaluokan rakentajaa. Javassa lapsiluokka kutsuu kantaluokan oletusrakentajaa automaattisesti. Java käyttää avainsanaa super oletuksen muuttamiseen. Oletuksen muuttamiseksi on kantaluokassa määriteltävä parametritön rakentaja lapsiluokan käyttöön. -avainsanalla päästään käsiksi lapsiluokasta kantaluokan rakentajiin.
Rajapintaluokkaa käytetään myös jaetun toiminnallisuuden eristämiseen. Luokan tehtävänä on määrittää rajapinta, jota ohjelmiston luokat voivat ilmoittaa käyttävänsä. Rajapintaluokka sisältää vain staattisia ja julkisisa vakiotietokenttiä, ilman mahdollisuutta käyttää itseään kantaluokkana periytymisessä. Mikä tahansa ohjelmisto voi tämän sijasta ilmoittaa toteuttavansa rajapinnan. Määrittely tehdään vaihtamalla normaalin luokan class -avainsana avainsanaksi interface. Luokasta ei voi luoda ilmentymiä eikä määritellä rakentajaa. Ainoat hyväksytyt tietokentät ovat luokkamuuttujavakioita. Rajapintaluokan kaikki metodit ovat abstrakteja metodeja. Metodien tulee myös olla julkisia. Mikäli näkyvyysmääreitä,   tai   ei olla sisällytetty metodeiden määrittelyyn, ne lisätään määritelmään automaattisesti.
Ajatellaan periytymistä seuraavan esimerkin avulla. Kaikille moottoriajoneuvoille (lapsiluokan kantaluokka) yhteisiä muuttujia voisi olla valmistaja, polttoaine sekä moottorin kapasiteetti. Vastaavasti yhteisiä metodeja kaikille moottoriajoneuvoille voisi olla moottorin sammutus sekä käynnistys. Moottoriajoneuvojen lapsiluokkia voisi olla auto, lentokone ja vene, jotka perivät siis yllä olevat muuttujat sekä metodit itselleen. Näiden lisäksi jokaisella lapsiluokalla voi olla omia muuttujia sekä metodeja. Auton muuttuja voisi olla väri, metodi voisi olla vaihda vaihdetta. Lentokoneen muuttaja voisi olla siipiväli, metodi voisi olla nosta/laske lentokorkeutta. Veneen muuttuja voisi olla veneen pituus, metodi voisi olla ruorin kääntäminen oikealle ja vasemmalle. Jotta homma ei olisi liian yksinkertaista, voi auto toimia lapsiluokan kantaluokkana erilaisille autotyypeille. Esimerkiksi avo-, lava-, henkilö- ja kuorma-auto perivät kaikki auton sekä moottoriajonevon suojatut muuttujat ja metodit. Avoautolla voisi vielä omana muuttujana olla malli sekä metodina voisi olla katon nostaminen auki kuumana kesäpäivänä.
Abstraktit luokat ja metodit
Abstrakti luokka on Javassa eräs tapa lisätä ohjelman enkapselointia tarkistamalla, ettei pääluokasta luoda uutta oliota, mutta pääluokan lapsiluokkien olioiden luominen on sallittu. Abstraktia luokkaa ei voida implementoida, mutta abstraktin luokan lapsiluokka voidaan.
Abstraktin luokan rakenteella tehdään määritelmän avulla muottipohja luokasta periytyville lapsiluokille. Näin varmistetaan, että jokainen periytyvä metodi toteuttaa tietyn toiminnallisuuden ilman että kantaluokkaa suoraan kutsutaan. Sen käyttöä edellyttää yleensä jonkin jaetun toiminnallisuuden tarpeen toteamista abstraktia luokkaa varten. Abstrakti luokka luodaan lisäämällä avainsana    -avainsanan eteen. Ei-abstraktia abstraktin luokan lapsiluokkaa kutsutaan konkreettiseksi luokaksi.
Abstraktin luokan määritys tapahtuu  -avainsanalla. Jos abstraktista luokasta yritetään luoda uusi olio, Java palauttaa virheviestin. Virheen voi saada kiinni ajon aikana  luokan avulla jos ja vain jos luokan määritys on yhteensopimattomasti muuttunut. Abstrakti metodi on metodi, joka on määritelty ilman ohjelmakoodia abstraktissa luokassa. Abstrakteja metodeja ei voida määritellä ei-abstraktissa luokassa.
Abstraktin metodin määritys tapahtuu  -avainsanalla. Abstraktin luokan lapsiluokat voivat käyttää abstrakteja metodeja implementoimalla tai kumoamalla (Override) abstraktin metodin, joka periytynyt pääluokasta. Kun abstrakti luokasta on luotu lapsiluokkia, lapsiluokka välittää implementoinnit kaikkiin abstrakteihin metodeihin sen pääluokassa. Jos näin ei ole, niin lapsiluokka pitää myös määritellä abstraktiksi. Abstrakteissa luokissa ja metodeissa voidaan käyttää avainsanaa
Tiedostonkäsittely Javassa
Olion lisääminen tiedostoon tapahtuu Javassa hieman erilailla, kuin esimerkiksi tavallisen tekstin kanssa toimiessa. Tämä johtuu siitä, että oliot usein sisältävät tietoa, joka ei yksinkertaisesti ole kirjoitettavissa tekstinä, vaan se on tallennettava binäärimuodossa. Javassa ohjelmoija joutuu käyttämään ObjectOutputStream - toimintoa, jos haluaa lisätä sen tiedostoon ja vastaavasti sen voi lukea sieltä ObjectInputStream-luokkien avulla. Tässä on yksinkertainen esimerkki siitä, miten olion tallentaminen tiedostoon tapahtuu.
Muistinhallinta
Javan muistinhallinta on automaattista. Java käyttää automaattista roskienkeräintä (eng. automatic garbage collector) muistinhallintaan. Sen tarkoitus on hallita objektin muistinkäyttöä sen käyttöiän aikana.
Tämä poikkeaa esimerkiksi C- ja C++-kielten käytännöistä, joissa ohjelman muistinhallinta on manuaalista ja siten ohjelmoijan vastuulla. Manuaalisen muistinhallinnan ohjelmointikielissä on mahdollista saada aikaan muistivuotoa, eli tilanteen, jossa ohjelma varaa muistia toimintojaan varten, mutta ei vapauta sitä tarpeen ja ohjelman päättyessä.
Javan roskienkerääjän tarkoitus on ehkäistä muistivuotoa. Vaikka roskienkeräys ei eliminoi muistivuotoja täysin, se vähentää niitä merkittävästi, kuin myös niiden ehkäisemiseen kuluvia resursseja ohjelmistokehittäjiltä.
Roskienkerääjä ajaa jaksollisesti taustalla "roskienkeräyksen" (eng. garbage collection), joka pyrkii tunnistamaan muistissa olevat "kuolleet" objektit, joihin ei tulla enää viittaamaan ohjelmassa, vapauttamaan näiden objektien viemä tila muistista ja uudelleenorganisoida "elävät" objektit muistinkäytön ja tulevien roskienkeräysten optimoimiseksi.
Roskienkerääjätyyppejä on useita erilaisia toteutuksia. Käytettävä roskienkerääjä riippuu käytettävissä olevista laitteiston resursseista sekä suorituskykyvaatimuksista. Roskienkerääjätyypit Javassa :
Tyyppimuunnokset
Java on staattisesti tyypitetty kieli. Välillä saattaa tulla eteen tilanne, jossa on tarve tehdä 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 alkuperäinen tietotyyppi, tekee Java tyyppimuunnoksen automaattisesti. Esimerkiksi ”int”-tyypin muuttuja  voidaan muuttaa ”long”-tyyppiseksi muuttujaksi, sillä ”long”-tietotyypissä on tarvittava määrä muistia ”int”-tyypin muuttujan säilymiseen. Lisäksi Java muuttaa automaattisesti kokonaislukuarvon ”int” liukulukuarvoksi ”float”, kun laskee näiden kahden jakolaskun.
Jos tyyppimuunnoksessa ei voida taata täydellistä datan säilymistä, ei automaattista tyyppimuunnosta voida tehdä. Kun tyyppimuunnos ei tapahdu automaattisesti, voi tyyppimuunnoksen tehdä manuaalisesti käyttämällä tyyppimuunnosoperaattoria. Operaation nimi on pakotettu tyyppimuunnos. Esimerkiksi, jos haluat muuttaa muuttujan, jonka tietotyyppi on ”float” tietotyypiksi ”int”, voisit käyttää tyyppimuunnosoperaattoria seuraavalla tavalla: (int) float-muuttuja. Haluttu tietotyyppimuuttuja siis sijoitetaan sulkeisiin, jonka jälkeen kirjoitetaan alkuperäinen, muutettava muuttuja. Java pyrkii tekemään tyyppimuunnoksen, vaikkei se olisi kyseisessä tilanteessa mahdollista. Tällainen tilanne voi aiheuttaa ongelmia myöhemmässä vaiheessa, viimeistään ohjelman ajovaiheessa.
Tyyppimuunnos auttaa käsittelemään erilaisia tietotyyppejä ja tehostaa ohjelman suorituskykyä. Tyyppimuunnosta on kuitenkin käytettävä tarkkaavaisuutta vaatien, sillä sen väärinkäyttö voi johtaa virheisiin. Tyyppimuunnoksen yhteydessä esiintyviä yleisimpiä virheitä ovat tyyppimuunnoksen tyyppien yhteensopimattomuus sekä muunnoksen aiheuttamat tietojen menetys tai vääristyminen. Tyyppimuunnoksen käytön tarpeellisuutta onkin tarpeen harkita tapauskohtaisesti.
Suorituskyky
Javan ohjelmointikieli nähdään laajalti suorituskyvyltään 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 merkittävään suorituskyvyn menetykseen.
Java kehittää JVM:n suorituskykyä ja optimointia jatkuvasti uusissa versioissa. Vuonna 1997 Java alkoi käyttämään ajonaikaista kääntöä (Just-in-Time compilation, JIT), joka toi merkittävän parannuksen JVM:n suorituskyvyssä.
Java-ohjelman suorituskyky on siis olennaisesti sidottu paitsi itse ohjelman optimointiin myös käytössä olevaan Javan versioon. Uudemmat versiot Javan virtuaalikoneesta käyttävät tietokoneen prosessointikykyä tehokkaammiin ja ohjelman suorittaminen voi nopeutua merkittävästi vanhemmista versioista. Tämän takia Java-ohjelman suorituskykyä testattaessa on olennaista raportoida käytössä olevan JVM:n versio, myyjä, käyttöjärjestelmä sekä laitearkkitehtuuri.
Virheidenkäsittely
Java ohjelmointi kielenä tarjoaa laajan virhekontrolli mekanismin. Yksi päätavoista, jolla tämä saavutetaan on poikkeuksen käsittely systeemi (exception). Kun virhe tapahtuu ohjelman aikana, Java voi implementoida poikkeuksen, jossa objekti kuvastaa virhettä. Tämä systeemi mahdollistaa ohjelman käsittelemään virheet jäsennellysti eikä niin, että ohjelma kaatuisi tai tekisi hankalaksi ohjelman ajamista.
Java tarjoaa myös mekanismin, jossa throw ja catch menetelmät toteutetaan eri tavalla, jossa ohjelmoija määrittelee niiden toimenpiteet. Tämä antaa ohjelmoijille hyvän mahdollisuuden tehdä joustavaa virheiden käsittelyä Javan-ohjelmointi kielen normaalien poikkeuskäsittelyn toimenpiteiden lisäksi.
Javan ohjelmointikielellä on myös toinen tapa käsitellä virheitä ja se perustuu type-safe mekanismiin. Javan ohjelmointkieli on vahvasti ”näppäilty” kieli mikä tarkoittaa sitä, että muuttujien tyyppi on oltava täysin ilmoitettu siinä ajassa, kun sitä määritellään. Tämä helpottaa virheissä kuten tyyppien yhteensopimattomuudessa sekä null-osoittimien poikkeuksissa.
Yleisesti Java-ohjelmointikielen virheidenkäsittely mekaniikat ovat luotettavia ja näiden avulla pystytään ohjelmoimaan vakaata ja helposti käsiteltävää koodia ohjelmistoihin.
Javan tarjoamia kirjastoja
Java tarjoaa laajan skaalan erilaisia kirjastoja helpottamaan ohjelmoijien työtä. Kirjastoista yleisin ja käytetyin on Javan standardikirjasto (eng. Java Standard Library) joka pitää sisällään useita tärkeitä kirjastoja, kuten esimerkiksi java.lang, jo aiemmin mainittu java.util ja java.math. Javan kirjastot saadaan dynaamisesti käyttöön ajon aikana sisällyttämällä kirjastot koodin alkuun komennolla "import" ja kutsumalla kirjastojen sisältämiä komentoja osana koodia. Näin Javassa saadaan käyttöön hyvin laaja skaala komentoja vain parilla lisäsanalla.
Ulkoiset Java kirjastot
Java tarjoaa myös mahdollisuuden käyttää ulkoisia kirjastoja. Kirjastot on luotu helpottamaan sovellusten kehitystä tarjoamalla erilaisia työkaluja ja valmiiksi kirjoitettua koodia. Niitä voidaan lisätä omaan ohjelmaan sen toiminnallisuuden laajentamiseksi tai koodin ongelmakohtien ratkaisemiseksi. Kirjastojen tarkoitus on mahdollistaa ohjelmoijan keskittyminen sovelluksen rakenteeseen matalatasoisen toteutuksen sijasta.
Esimerkkikirjastoja:
Erot muihin kieliin
Ohjelmointikieliä on paljon ja monet niistä jakavatkin samanlaisia ominaisuuksia. C-kieli on rakenteellista ja proseduraalista, kun taas sen jälkeläinen C++ tarjoaa laajemman valikoiman ominaisuuksia ja kielen toiminnallisuus pohjautuu huomattavasti enemmän oliopohjaiseen ohjelmointiin kuten Java. JavaScriptiä taas kuvaillaan enemmän C:n kaltaisena.
Java-ohjelmointi pohjautuu hyvin vahvasti useiden eri luokkien, metodien, olioiden ja niille määritettyjen funktioiden suorittamiseen. Filosofiassaan kieli noudattaa SOLID-periaatetta.
Java ja JavaScript
Vaikka kielet Java ja JavaScript jakavatkin osittain saman nimen, ovat ne hyvin erilaisia ohjelmointikieliä toimivuudeltaan ja ajatusmaailmaltaan. Java kääntyy Java-bittikoodiksi, jonka takia Javaa suoritetaan useimmiten JVM (Java Virtual Machine) sisällä, kun taas JavaScript suoritetaan selaimen puolella. Muuttamalla koodin Java-biteiksi, Javan oma virtuaalikone mahdollistaa paremman turvallisuuden perustasolla ilman ylimääräistä koodia. JavaScriptiä käytetäänkin usein front end-suunnittelussa ja Javaa back end-suunnittelussa.
Java on kieli, joka tarkistaa static-tietotyyppejä ja JavaScript dynaamisia. Javan kirjoitus voi olla hieman työläämpää, koska siinä voi joutua kirjoittamaan enemmän ja pitämään huolta suunnittelun ohella, että tietotyyppi on määritelty oikein. JavaScript on kielenä nopeampi. Sen scripti tarkastetaan sillä hetkellä, kun sitä suoritetaan. JavaScriptin koodia on helpompi ymmärtää, sillä se kirjoitetaan yksinkertaisena tekstinä. Sitä ei ole käännetty kuten Javassa tehdään.
JavaScriptiä käytetään pääosin nettiselainten suunnitteluun ja toteutukseen ja sen päätehtävä on tehdä sivuista vuorovaikutteisempia kuin perinteisesti koodatut yksinkertaiset sivut.
Ylioppilasmiekkailijat
Ylioppilasmiekkailijat ry (YM) on vuonna 1948 perustettu miekkailuseura. Seuralla on vähän yli sata jäsentä. Seura on kooltaan Suomen toiseksi suurin ja se järjestää toiminaa kaikille kolmelle aseelle. Ylioppilasmiekkailijat harjoittelevat Helsingissä Töölön kisahallin miekkailusalilla. Ylioppilasmiekkailijat jatkaa Helsingin Yliopiston ja Turun Akatemian yli kolmesataa vuotta vanhoja ylioppilasmiekkailuperinteitä.
Java
Uuden luokan tekeminen ja käyttäminen. Luokan rakentaja ja metodien yksinkertaista käyttöä.
Luokka, eli olio. Tarkoitus on saada koodi selkeämmin hallittavaan pakettiin, että koodi olisi helpommin muokattavissa ja luettavissa.
Ylioppilasmiekkailijat
Ylioppilasmiekkailijat järjestävät vuosittain säilän Coupe du Nord-maailmancupin satelliittiosakilpailun sekä juhlakilpailun kaikilla kolmella aselajilla, jotka ovat samalla akateemiset suomenmestaruuskilpailut.
Java
Pää tiedosto
Esimerkki. Olioita voidaan luoda tarpeen mukaan.
Luokkatiedosto. Luokan ja metodien tekeminen
Esimerkki. Tuloste: Siilin1 nimi: Heikki Siilin2 ikä: 9 Maija Nimi: Maija ikä: 15 Nimi: Pekka ikä: 9 Metodeita tehdään sen mukaan, että mitä tietoja halutaan saada luokasta ulos, tai luokkaan sisään.
Singleton
Singleton on Javassa käytetty suunnittelumalli, jonka avulla voidaan varmistaa, että singelton-luokassa on vain yksi olio (luokan ilmentymä) kerrallaan. Avaintekijöinä singleton-luokan luomisessa toimii yksityinen luokkamuuttuja, yksityinen rakentaja ja julkinen metodi siihen käsiksi pääsemiseen. Luokan rakentaja määritellään yksityiseksi, jotta uusien olioiden luominen luokan ulkopuolella voidaan estää, ja yksityisellä luokkamuuttujalla (määrittelyllä private static) päästään käsiksi luotuun olioon. Julkisella luokkametodilla (määrittelyllä public static) luodaan pääsy yksityiseksi määriteltyyn olioon. Nimenomaan tämän julkisen luokkametodin sisällä on toiminnallisuus, jolla useampien olioiden luominen luokan ulkopuolella voidaan estää.
Yksinkertainen esimerkki singleton-luokan luomisesta voi olla esimerkiksi seuraavanlainen: Singleton-luokan ongelmana on kuitenkin esimerkiksi sen globaalia muuttujaa muistuttava luonne. Kaikilla luokilla on pääsy muuttujaan julkisen instanssin vuoksi, mutta luokkien välisiä riippuvuuksia on vaikea määrittää, koska singelton-luokan yksityisellä rakentajalla ei ole niitä. Luokilla kuitenkin on riippuvuus, jos toinen luokka käyttää toisen instanssia.
Singleton-luokkaa käytetään usein tietokantoja käsittelevissä ohjelmissa. Käytännön näkökulmasta singelton luokka toimii niin, että koko applikaatio, ohjelma tms. käyttää vain yhtä ja samaa tietokannan ilmentymää sen kaikissa toiminnoissa. Tämä ehkäisee virheiden ja poikkeusten esiintymistä, koska aina luotaessa uusi ilmentymä nämä ovat mahdollisia. Lisäksi saman ilmentymän käyttäminen nopeuttaa tiedonhakua ja sen palauttamista tietokannasta.
Säikeet
Javassa voi käynnistää käyttöjärjestelmän tukemana tavallista ohjelmaprosessia kevyempiä säikeitä. Säikeen käyttämät resurssit kuuluvat säikeen käynnistävälle prosessille. Yksittäinen prosessi voi käynnistää yhden tai suuren määrän säikeitä yhdessä tai useammassa suoritinytimessä käyttöjärjestelmä- ja resurssirajoitteiden puitteissa. Säie on yksi ohjelman suoritusketjuista, joka voi toimia samanaikaisesti muiden säikeiden kanssa. Säikeiden käyttö sallii moniajo-ohjelmoinnin, joka voi parantaa ohjelman suorituskykyä. Javan Thread -luokkaa käytetään säikeiden luomiseen. Kullakin säikeellä on oma suorituskaista, joka voi toimia samanaikaisesti muiden säikeiden kanssa.
Esimerkki.
Oheinen koodiesimerkki luo 5 säiettä ja jokainen niistä tulostaa aloitus- ja lopetusaikansa. Säikeet tallentavat aloitusajan, odottavat satunnaisen ajan ja tallentavat lopetusaikansa. Ohjelma käyttää Thread-luokan sleep -metodia odottamiseen. Taulukkoon tallennetut säikeet käynnistetään for-silmukan avulla. Säikeet käynnistetään samanaikaisesti, mutta niiden suoritusjärjestys ei ole ennalta määrätty. Lopuksi odotetaan, että kaikki säikeet ovat suorittaneet loppuun ennen kuin ohjelma päättyy. Tämä tehdään Thread-luokan join-metodilla, joka pysäyttää nykyisen säikeen suorituksen, kunnes liittyvä säie on suorittanut loppuun. Ilman join-metodia ohjelma saattaisi lopettaa liian aikaisin, kun jotkut säikeet vielä suorittavat.
Android
Koko Android OS:n ominaisuusvalikoima on käytettävissä Java ohjelmointikielellä kirjoitettujen ohjelmointirajapintojen (API) kautta käyttäjille. Näitä rajapintoja voidaan pitää Android sovelluksien ns. rakennuspalikoina, joilla voidaan rakentaa sovellusten käyttöliittymä ja ohjata sen toimintoja. Kyseisiä rajapintoja ovat seuraavat:
Erimielisyys
Oraclen ja Googlen välillä käytiin oikeudellista kiistaa Javan API:en (sovellusliittymien) ja lähdekoodin tekijänoikeuksista.
Oracle vaati vahingonkorvauksia Googlelta, joka puolestaan perusteli API:en käytön olleen kohtuuden rajoissa. Kaksi piirituomioistuinta päätti asiasta Googlen eduksi mutta vetoomustuomioistuin kumosi molemmat päätökset. Asiaa käytiin läpi vuodesta 2012 vuoden 2021 kevääseen asti, jolloin lopullisessa ratkaisussa korkein oikeus päätti API:en käytön olleen Googlen osalta kohtuullista. Vaikka se kumosi aiemman päätöksen, lopullinen ratkaisu jätti huomioimatta API:en suojaamisen tekijänoikeuksilla.
Tapaus toimi kiinnostavana esimerkkinä muille alalla toimijoille, sillä monissa tietokoneohjelmissa ja ohjelmistoissa (erityisesti avoimen lähteen) on vastaavasti hyödynnetty API:ja muista tuotteista esimerkiksi ohjelmien yhteensopivuuden helpottamiseksi.
Kritiikki
Javan kritiikki koskee sen geneerisen ohjelmoinnin toteutusta, nopeutta , etumerkittömien kokonaislukujen käsittelyä , liukulukuaritmetiikkaa sekä tietoturvahaavoittuvuuksia Java-virtuaalikoneen toteutuksissa (HotSpot).
Etumerkittömät kokonaisluvut
Javassa ei ole luontaisia etumerkittömiä kokonaislukuja. C-kieliset ohjelmat tuottavat yleensä etumerkitöntä dataa, ja tämän tyyppisen datan puute estää suoran tiedon vaihdon Java-kielisten ja C-kielisten ohjelmien välillä. Suuria etumerkittömiä lukuja numeeristen käsittely kenttien numeroina, kuten kryptografiassa, mikä hankaloittaa Javan käyttämistä tällaisissa tehtävissä. Vaikka tämän ongelman kiertäminen on mahdollista käyttäen muunnoskoodia ja suurempia tietotyyppejä, se tekee etumerkittömän datan käsittelystä kömpelöä Javalla. Vaikka 32-bittiseen etumerkillä varustettuun kokonaislukuun on mahdollista tallentaa 16-bittinen etumerkitön kokonaisluku ilman häviöitä, ja 64-bittiseen etumerkillä varustettuun kokonaislukuun voi puolestaan tallentaa 32-bittisen etumerkittömän kokonaisluvun, ei ole kuitenkaan olemassa 64-bittisestä suurempaa tyyppiä etumerkittömän kokonaisluvun tallentamiseen. Kaikissa edellä mainituissa tapauksissa käytetyn muistin määrä voisi kaksinkertaistua, ja kaikki kahden komplementin ylivuotoon turvautuva logiikka pitäisi uudelleen kirjoittaa. Abstrakteissa tapauksissa funktio kutsut olisivat välttämättömiä monissa operaatioissa, jotka ovat monissa muissa kielissä luontaisia. Vaihtoehtoisesti on mahdollista käyttää Javan etumerkillä varustettuja kokonaislukuja jäljittelemään samankokoisia etumerkittömiä kokonaislukuja, mutta tämä vaatii yksityiskohtaista tuntemusta bittikohtaisista operaatioista. JDK 8 tarjosi jonkinlaista tukea etumerkittömille kokonaisluvuille, mutta ei etumerkittömille tavuille eikä myöskään tukea Java kielestä.
Yhdistetyt arvotyypit
Javassa ei ole yhdistettyjä arvotyyppejä, kuten C:n structeja, joissa on tietopaketteja, joita käsitellään suoraan viittauksien sijaan epäsuorasti. Arvotyypit voivat joskus olla nopeampia ja pienempiä kuin luokat viittauksilla. Esimerkiksi Javan HashMap on toteutettu taulukkona viittauksina HashMap.Entry-olioihin,[16] jotka sisältävät vuorostaan viittauksia avain- ja arvo-olioihin. Tiedon hakeminen vaatii tehotonta kaksoishakemista. Jos Entry olisi arvotyyppi, taulukko voisi tallentaa avain-arvo-parit suoraan, mikä poistaisi ensimmäisen välitystason, lisäisi viittauspaikallisuutta ja vähentäisi muistin käyttöä. Lisäksi, jos Java tukisi geneerisiä primitiivisiä tyyppejä, avaimet ja arvot voitaisiin tallentaa suoraan taulukkoon, poistamalla molemmat välitystasot.
Perusmuuttujien ja taulukoiden integrointi
Taulukot ja perusmuuttujat ovat jossain määrin erityisiä ja niitä on käsiteltävä eri tavoin kuin luokkia. Tätä on arvosteltu, koska se edellyttää monia funktiovariaatioita yleiskäyttöisten kirjastojen luomisessa.
Serialisaatio
Javassa on mekanismi objektin serialisoimiseen, jossa objekti voidaan esittää tavujonona, joka sisältää sen tietokentät yhdessä tietonsa ja kenttiensä tyyppitiedon kanssa. Kun objekti on sarjallistettu, sitä voidaan myöhemmin desarjallistaa; eli sen tyyppitiedot ja tietonsa esittävät tavut voidaan käyttää objektin luomiseen muistissa. Tämä aiheuttaa erittäin vakavia teoreettisia ja todellisia turvallisuusriskejä.
Serialisointi prosessi on siitä hyödyllinen, että se on kokonaisuudessaan JVM riippumaton. Tarkoittaen sitä, että objekti voidaan deserialisoida täysin toisella laitteella tai alustalla, kuin se on serialisoitu.
Luokat ObjectInputStream ja ObjectOutputStream ovat korkeantason virtoja, jotka sisältävät metodit serialisoinnille sekä deserialisoinnille.
Java serialisointi voidaan saavuttaa käyttämällä java.io.Serializable rajapintaa. Objektia serialisoidessa tulee luokan määrittelyssä implementoida tämä rajapinta, joka mahdollistaa tarvittavan tarkistuksen onko objekti serialisoitava. Kun objekti on serialisoitava, se voidaan kirjoittaa ObjectOutputStreamiin, joka konvertoi tämän objektin bittivirraksi.
Java deserialisointi voidaan saavuttaa lukemalla bitit bittivirrasta ja antamalla bitit ObjectInputStreamille. ObjectInputStream voi konvertoida tämän jälkeen bitit takaisin objektin muotoon ja palauttaa sen takaisin käytettäväksi halutussa muodossa.
Yksi tärkeä tieto Javan serialisoinnista on se, että siihen liittyy aina turvallisuusriskinsä, jos sen kanssa ei ole varovainen. Serialisoidut objektit voivat sisältää herkkää informaatiota ja jos serialisoitu data päätyy vääriin käsiin, voidaan dataa käyttää esimerkiksi systeemisi hyväksikäyttöön. Tämän seikan takia on hyvä idea käyttää datan salausta (encryption) sekä muita turvallisuuskeinoja työskennellessä serialisoinnin kanssa.
Suuret taulukot
Javaa on kritisoitu siitä, ettei se tue taulukoita, joiden koko on 231 (noin 2,1 miljardia) alkiota tai enemmän. Tämä rajoittaa Javaa ohjelmointikielenä; the Java Language Specification, kohdassa 10.4 sanotaan seuraavaa:
Taulukot on indeksoitava konaisluvuilla… Jos yrittää käyttää taulukon arvoa, jonka indeksi on pitkä kokonaisluku, seurauksena on käännösaika-virhe.
Javassa ei ole tehokasta tapaa alustaa taulukoita. Kun taulukko määritetään, Javan virtuaalikone (JVM) kääntää sen tavukoodeiksi ohjeilla, jotka asettavat sen elementit yksitellen ajon aikana. Koska Javan metodit eivät 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) käännettäessä.
Juha Vuori (professori)
Juha Antero Vuori (s. 1976) on suomalainen politiikan tutkija, joka toimii kansainvälisen politiikan professorina Tampereen yliopistossa. Hän väitteli valtiotieteiden tohtoriksi Turun yliopistossa vuonna 2011. Vuosina 2016–2017 hän toimi kansainvälisen politiikan professorin Henri Vogtin sijaisena Turun yliopistossa.
Java
Hitaus
Koska jokainen koodi on tulkittava konekoodiksi, Java on on hitaampi muihin kieliin, kuten esimerkiksi C:hen ja C++:aan. Java on huomattavasti hitaampi kuin kielet, jotka tuottavat käännöskoodia suoraan koneelle, sekä se käyttää paljon muistia.
Juha Vuori (professori)
Vuori kertoo tutkineensa turvallisuuspolitiikkaa, ydinaseita ja populaarikulttuurin politiikkaa. Hän on erikoistunut Kiinan tutkimukseen.
Java
Hitaus
Javaa on kritisoitu sen nopeudesta sovellusten käynnistyksessä. Javalla tehdyt sovellukset voivat käynnistyä hitaammin kuin muilla ohjelmointikielillä tuotettuihin sovelluksiin, mikä voi tuottaa ongelmia tietynlaisissa sovelluksissa. Javan hitaus sovellusten käynnistämisessä johtuu siitä, että Java-sovellusten on käynnistyessään ladattava suuri määrä luokkia ja kirjastoja, mikä voi johtaa viiveisiin.
Toinen kritiikin kohde Javan nopeuteen liittyen koskee tapaa, jolla Java käsittelee muistin varausta. Vaikka Javan automaattisesta muistin hallinnasta voi olla hyötyä koodaajalle, se voi myös johtaa suorituskyky ongelmiin. Javan käyttämä roskakori voi viedä merkittävän määrän prosessorin resursseista, minkä seurauksena sovellus voi hidastua. Javan muistin varaus voi johtaa myös muistin sirpaloitumiseen, millä on suora vaikutus suorituskykyyn.
Java-ohjelmien sisäiset ominaisuudet ei vaikuta kielen ajonaikaiseen suorituskykyyn yhtä paljon kuin kääntäjän tai virtuaalikoneen laatu. Käännetyn ohjelman ajaminen esimerkiksi virtuaalikoneen avulla on natiivia suoritusta hitaampaa. Virtuaalikoneet voivat tarjota esimerkiksi alustariippumattomuuden ja yksinkertaistetun kehityksen, mutta samalla laskea suorituskykyä.
Turvallisuus
Java-ohjelmistoja jää myös paljon päivittämättä pelkän tietoisuuden puutteen takia. Yleisin syy tälle on se, ettei käyttäjä yksinkertaisesti ole vain tietoinen uusista ja parantavista päivityksistä, tai toiselta kantilta käyttäjä ei ole tietoinen siitä, kuinka päivitykset tulisi tehdä.
Javan turvallisuutta on kritisoitu paljon. Oraclen toimintaa liittyen siihen, kuinka he informoivat löytyvistä turvallisuusbugeista, on erityisesti nostettu esille. On tullut ilmi, ettei Oraclen puolesta kaikista näistä ei ole laajalti informoitu käyttäjiä. Esimerkiksi kun julkaistiin korjaukset monille vioille Java 7, poisti se Java 6 käyttäjien koneista ja erityisesti tämä vaikutti yrityksien sovelluksiin. Oracle oli alun perin vakuuttanut, ettei tämä vaikuttaisi niihin ja ne olisivat turvassa päivityksiltä. Tämä kuitenkin oli vakava turvallisuusriski, sillä Java 6 on laajalti käytössä yrityksien sovelluksissa.
Frankit
thumb|Frankkien valtakunnan laajeneminen vuosien 481 ja 814 välillä. Frankit (lat. Franci) olivat alun perin Reinin itäpuolella asunut suuri germaaninen kansa, joka ilmestyi 200-luvulla Gallian koillisrajalle. Heidän nimensä on saattanut merkitä joko "vapaat" tai se on johdettu muinaisgermaanisesta sanasta francho, keihäänkärki. Frankit olivat alun perin muodostuneet useiden germaaniheimojen liittoutuessa yhteen. Näihin heimoihin kuuluivat chamavit, ampsivarit, brukterit, chattuarit ja khattit. Frankit jakautuivat kahteen pääryhmään, saalilaisiin frankkeihin Reinin alajuoksulla ja ripuaarisiin frankkeihin etelämpänä, Reinin yläjuoksun alueella. Nimitys saalilainen tuli suolaa ja ripuaarinen virtaa tarkoittavasta sanasta, mikä viittasi heimojen asuinsijoihin. Khattien heimo on joskus katsottu frankkien kolmanneksi pääryhmäksi.
Frankit tekivät yhdessä alemannien kanssa hyökkäyksiä Reinin yli roomalaisia vastaan 250-luvun lopulla, ja he ryöstivät kaupunkeja aina Hispanian itärannikolla asti. Frankit valtasivat bataavien asuinalueet 200-luvun lopussa.
Saalilaiset frankit tunkeutuivat 300-luvulla nykyiseen Belgiaan ja 400-luvun alussa nykyiseen Ranskaan. Ranska on saanut nimensä saalilaisten frankkien mukaan. Frankit omaksuivat kristinuskon aluksi sen areiolaisessa muodossa. Roomalainen sotapäällikkö Aëtius pakotti heidät Rooman vallan alaisiksi 432, ja frankit olivat Aëtiuksen liittolaisina Katalaunien kenttien taistelussa vuonna 451. Vandaalien heikentämä Rooma menetti kuitenkin valtansa Galliassa, ja vuoteen 480 mennessä frankeilla oli vahva jalansija Gallian koillisosissa.
Juha Vuori
Juha Vuori on seuraavien suomalaisten henkilöiden nimi: