# Java (programmeertaal)

Java is een objectgeoriënteerde programmeertaal. Java is een platformonafhankelijke taal die qua syntaxis grotendeels gebaseerd is op de (eveneens objectgeoriënteerde) programmeertaal C++. Java beschikt echter over een uitgebreidere klassenbibliotheek dan C++.

## Geschiedenis

Java ontstond begin jaren 90 in een klein dochterbedrijf van Sun Microsystems onder leiding van James Gosling. Dat bedrijfje, First Person (met onder meer Arthur van Hoff en Patrick Naughton), had als opdracht: "make something cool" (vertaald: maak iets cools). In de beginjaren richtte het bedrijfje zich op software voor settopboxen. Toen enkele onderhandelingen op het nippertje mislukten begonnen ze aan Java. De werknaam Oak werd gekozen toen men naar buiten keek bij het zoeken naar een naam en daar een eik (Engels: Oak) zag staan. Er bleek echter al een programmeertaal met die naam te bestaan, dus kozen ze "Java", een verwijzing naar Javaanse koffie. Later bouwden ze voort op deze terminologie en introduceerden ze JavaBeans (bonen) en JAR-archieven (Java ARchive) (een jar is een pot).
Aanvankelijk wilde men Java promoten als programmeertaal voor allerhande elektronische apparaten, zoals televisies, afstandsbedieningen en koelkasten. Maar toen het world wide web meer en meer aan populariteit won, bedacht Sun dat ze hun (toen nog steeds niet al te populaire) taal goed konden gebruiken in een webomgeving. Dankzij de open specificatie en de mogelijkheid om een Javaprogramma als applet in een webpagina in te bedden (ook wel "embedden" genoemd) was de hype al snel gecreëerd.
Het gebruik van Java voor kleine apparaten werd korte tijd later (1997) toch gerealiseerd met het uitbrengen van de Java Card technology, waarmee chipkaarten in Java geprogrammeerd kunnen worden. Deze techniek werd al gauw na de introductie in de mobieletelefoon-wereld geadopteerd voor gebruik in de simkaart. Het bleek aan te slaan en in 2005 werd deze Javatechniek in meer dan 80% van de uitgegeven simkaarten toegepast.
De volgende generatie Java bood vervolgens de mogelijkheid om Javaprogrammatuur op servers zelf uit te voeren (Engels: 'server-side'). Dit gebeurt in de vorm van servlets, Enterprise JavaBeans en JavaServer Pages. Met name op dit gebied heeft Java de afgelopen jaren zijn kracht bewezen en wordt de taal gezien als een belangrijke omgeving voor webapplicaties. Zie ook Java 2 Enterprise Edition.
Sterk in opkomst is de Java-versie die bedoeld en geschikt is voor apparatuur met een beperkte verwerkingscapaciteit, zoals pda's, mobiele telefoons en — eindelijk — de settopbox. Zie hiervoor Java 2 Micro Edition.
Op 13 november 2006 gaf Sun delen van Java vrij als opensourcesoftware, onder de GNU General Public License (GPL). Op 8 mei 2007 gaf Sun de laatste delen van Java vrij onder de GPL, op enkele kleine gedeeltes na waar Sun niet het auteursrecht op heeft.
Toen Google succesvol werd met het besturingssysteem Android, dat in Java geschreven programma's kan uitvoeren, werd Java populairder bij ontwikkelaars. Dit had ten dele te maken met de geoptimaliseerde virtuele machine Dalvik die gebruikt wordt om Java-programma's uit te voeren, waardoor Java-programma's sneller werden.

## Releases

Java heeft de volgende versies gekend:
| Release-nummer | codenaam | Release-datum |
| JDK 1.1.4 | Sparkler | 12 september 1997 |
| JDK 1.1.5 | Pumpkin | 3 december 1997 |
| JDK 1.1.6 | Abigail | 24 april 1998 |
| JDK 1.1.7 | Brutus | 28 september 1998 |
| JDK 1.1.8 | Chelsea | 8 april 1999 |
| J2SE 1.2 | Playground | 4 december 1998 |
| J2SE 1.2.1 | geen | 30 maart 1999 |
| J2SE 1.2.2 | Cricket | 8 juli 1999 |
| J2SE 1.3 | Kestrel | 8 mei 2000 |
| J2SE 1.3.1 | Ladybird | 17 mei 2001 |
| J2SE 1.4.0 | Merlin | 13 februari 2002 |
| J2SE 1.4.1 | Hopper | 16 september 2002 |
| J2SE 1.4.2 | Mantis | 26 juni 2003 |
| J2SE 5.0 | Tiger | 29 september 2004 |
| Java SE 6 | Mustang | 11 december 2006 |
| Java SE 7 | Dolphin | 28 juli 2011 |
| Java SE 8 (LTS) | Spider | 18 maart 2014 |
| Java SE 9 | | 21 september 2017 |
| Java SE 10 | | 20 maart 2018 |
| Java SE 11 (LTS) | | 25 september 2018 |
| Java SE 12 | | 19 maart 2019 |
| Java SE 13 | | 17 september 2019 |
| Java SE 14 | | 17 maart 2020 |
| Java SE 15 | | 15 september 2020 |
| Java SE 16 | | 16 maart 2021 |
| Java SE 17 (LTS) | | 14 september 2021 |
| Java SE 18 | | 22 maart 2022 |
| Java SE 19 | | 20 september 2022 |
| Java SE 20 | | 21 maart 2023 |
| Java SE 21 (LTS) | | 19 september 2023 |
| Java SE 22 | | 19 maart 2024 |
| Java SE 23 | | 17 september 2024 |
Over de nummering van de versies is veel te doen geweest. Na het uitbrengen van versie 1.2 is de 2 vaak vermeld achter Java, wat dan een hele reeks boeken opleverde die "Java 2 behandelden", ook als het om versie 1.3 of 1.4 ging. Vanaf versie 1.5.0 was er een dubbele nummering: had men het over Java 5.0, dan ging het over de JRE of Java Runtime Environment. Het versienummer 1.5.0 verwees heel specifiek naar de JDK of Java Development Kit, met andere woorden de ontwikkelomgeving. SE staat overigens voor "Standard Edition".

## Gebruik

Gedurende de jaren 90 is Java tamelijk populair geworden. In de meeste gevallen leek Java alleen goed voor gebruik in het onderwijs en voor webapplicaties, respectievelijk vanwege de strakke syntaxis en de mogelijkheid "applets" in webpagina's in te bouwen. Door kleine verschillen in Java-versies tussen diverse browsers is het gebruik van applets eigenlijk nooit echt van de grond gekomen, wat geleid heeft tot de introductie van de Java-plug-in: in plaats van een virtuele Javamachine door de browserbouwer in te laten bouwen, kan de gebruiker hem zelf downloaden wanneer dat nodig is. Hiermee wordt incompatibiliteit tussen JVM's van verschillende merken omzeild.
Een ander platform waar Java veel wordt gebruikt is de mobiele telefoon. Veel toestellen bieden de mogelijkheid om Javaprogramma's uit te voeren. Deze programma's moeten dan wel voldoen aan de specificaties die zijn vastgelegd in de Java 2 Micro Edition-standaard.
Het gebruik van Javaprogramma's in servers is meer en meer toegenomen sinds het implementeren van just in time compilatie, dat op het niveau van de Java Virtual Machine een grote versnelling van de uitvoering met zich meebracht, waardoor de eerder trage Javaprogramma's nu ook bruikbaar werden voor serverapplicaties. Daarnaast bevatten de J2EE (Enterprise Edition)-bibliotheken een groot aantal klassen voor het programmeren van (web)serverapplicaties, het communiceren met gegevensbestanden en het gebruik van allerlei generieke diensten. De meeste internet-gebaseerde bankdiensten in Nederland en België bijvoorbeeld draaien inmiddels op Java-technologie. Het opensource-contentmanagementsysteem van Nederlandse bodem MMBase is geheel geschreven in Java.
Java is door de eenvoud en webbased-mogelijkheden ook erg populair als programmeertaal voor computerspellen. Een voorbeeld hiervan is Minecraft. Ook de ontwikkeling van bibliotheken, zoals Java OpenAL (JOAL) en Java OpenGL (JOGL), draagt bij aan het gebruik van Java voor computerspellen. Er worden ook opensourcebibliotheken ontwikkeld, zoals de Lightweight Java Game Library (LWJGL). De jMonkeyEngine is een engine voor het ontwikkelen van 3D-computerspellen in Java.

## Vergelijking met andere talen
### Java versus C++

Java wordt gecompileerd naar bytecode voor een virtuele machine, de Java Virtual Machine (JVM). De JVM is beschikbaar voor allerlei verschillende soorten computers. Hierdoor is de gecompileerde bytecode platformonafhankelijk, dat wil zeggen de code kan op elke willekeurige computer draaien, onafhankelijk van het besturingssysteem (zoals Windows, Unix of Mac OS X). Er is dus maar één (virtueel) platform: de JVM.
C++-broncode (en ook de broncode van C, de niet object-georiënteerde voorloper van C++) wordt meestal direct naar machinetaal gecompileerd, waardoor de uitvoerbare bestanden slechts op één doelplatform draaien. De Javabytecode wordt op het laatst mogelijke moment (just in time, JIT) gecompileerd naar machinetaal. Bij deze JIT-compilatie worden ook de dynamische eigenschappen van een programma meegenomen. Het kan gebeuren dat veelgebruikte bytecode opnieuw wordt gecompileerd omdat in een gebleken situatie met een iets andere compilatie grote snelheidswinsten te boeken zijn.
Hierdoor zal een Javaprogramma in eerste instantie langzamer draaien dan vergelijkbare programma's die direct naar machinetaal gecompileerd zijn. In de begintijd van de programmeertaal Java was het JIT-compileren ook nog niet volledig geïmplementeerd. Hierdoor heeft Java een serieus imagoprobleem opgelopen dat nog steeds voortduurt, hoewel Java tegenwoordig competitief presteert.
Daarnaast wordt van Java ten opzichte van C++ soms als nadeel aangemerkt dat voor de taal C++ onafhankelijke ISO/ANSI-comités bestaan, terwijl Java nog steeds in handen lijkt te zijn van Oracle. Anderen beweren dat daar tegenover staat dat Java nog de mogelijkheid heeft om te groeien, zich aan te passen en nieuwe ontwikkelingen in te bouwen, terwijl C++ door standaardisatie verstard is en dus aan alle kanten door allerlei ontwikkelingen ingehaald wordt.
In Java wordt de programmeur beter tegen zichzelf beschermd dan in C++ en C. Zo is er in Java geen pointermanipulatie. Dit is een voordeel omdat fouten bij het gebruik van pointers moeilijk te traceren zijn en zelfs kunnen uitlopen op het crashen van het besturingssysteem. Nadeel is dan weer dat het de vrijheid van de programmeur beperkt.
Een ander belangrijk verschil tussen Java en C++ is het ontbreken van expliciet geheugenbeheer in Java: Java houdt zelf bij welke objecten met de new-operator zijn aangemaakt en verwijdert deze automatisch zodra er geen referenties meer naar die objecten zijn. Daarnaast is exception handling grondiger en correcter geregeld dan in C++.
Net als C++ ondersteunt Java (sinds 5) ook generiek programmeren. In tegenstelling tot in C++ bestaan in Java geparametriseerde types alleen voor de compiler. In Java worden deze types vervangen door het overeenkomende, minst specifieke niet-generieke type (bv.: List<String> wordt List). Daarnaast wordt gebruikgemaakt van runtime-casting voor het verkrijgen van specifieke types. In C++ worden generieke types juist vervangen door gespecialiseerde types. Hierbij is het niet mogelijk om bijvoorbeeld een bibliotheek te schrijven met geparametriseerde klassen die pas at runtime gekoppeld worden. Een List<T>-klasse die in een bepaalde bibliotheek zit, moet opnieuw worden gecompileerd als deze wordt geparametriseerd voor een type en de parametrisatie daarvan niet in de bibliotheek al is voorgecompileerd. Dat is ook de reden waarom STL, de standaardbibliotheek van C++, vrijwel alleen in header-files gedefinieerd is: de applicatie die STL gebruikt, zal eigen versies van de klassen moeten compileren.
Sommigen vinden Java een iets overzichtelijkere taal dan C++, maar dat is een kwestie van smaak: het schrijven van totaal onbegrijpelijke programma's is met C(++) gemakkelijker dan met Java. Veel C++-programmeurs missen zaken die in Java bewust zijn weggelaten zoals destructors, operator-overloading en pointermanipulatie. Verder klagen ze over het feit dat de garbage-collector de ongebruikte objecten niet snel genoeg vrijgeeft.

### Java en JavaScript

Veel mensen verwarren Java met JavaScript, maar in feite hebben de twee talen weinig met elkaar te maken. Hoewel beide talen op het eerste gezicht qua syntaxis op elkaar lijken, zijn er grote verschillen:
* Uitvoerbaarheid: JavaScript is bedoeld als scriptingtaal en wordt daarom vaak geïnterpreteerd. Java wordt eerst naar bytecode gecompileerd en daarna door een virtuele machine (VM) uitgevoerd.
* Relatie tot browser: Een scripttaal dient meestal als hulpmiddel bij een programma. In het geval van een browser dient JavaScript als middel om statische webpagina's te manipuleren. Java-applets zijn echter afzonderlijke programma's die in principe geen band hebben met de webpagina waarin ze verschijnen: ze draaien in een soort 'zandbak' ('sandbox') waar ze niet uit kunnen. Ondertekende Java-applets hebben deze 'sandbox' echter niet.
* Strong-typed vs. weakly-typed: JavaScript kent geen sterk getypeerde variabelen, wat betekent dat iedere gedeclareerde variabele ieder gegevenstype kan bevatten. In Java moet vooraf worden aangegeven welk gegevenstype een variabele kan bevatten, en als er een verkeerd gegevenstype wordt toegewezen aan een variabele, wordt daar tijdens het compileren melding van gemaakt. Bij het programmeren van kleine, eenvoudige applicaties vermindert het niet hoeven opgeven van datatypen de complexiteit van het coderen, en daarom is JavaScript meer geschikt voor korte, kleine applicaties. In grote applicaties is het belang van strong types veel groter, omdat het de programmeur in staat stelt in een vroeg stadium fouten op te sporen met betrekking tot verkeerd gebruik van gegevenstypen en onnodige conversies daartussen zelf in de hand kan houden.
* Statische typering vs. dynamische typering: JavaScript is dynamisch getypeerd, Java is statisch getypeerd. Dit wil zeggen dat typechecking in Java tijdens compilatie gebeurt, en in JavaScript at runtime.
* Objectmodel: Java kent classes, JavaScript kent alleen objecten. Java heeft dan ook een objectmodel gebaseerd op class inheritance, JavaScript heeft een objectmodel gebaseerd op prototype inheritance. Verder ondersteunt JavaScript duck-typing, dit in tegenstelling tot Java.

### Java vs .NET

Het concept van de virtuele machine (VM) is ouder dan Java zelf. In de jaren 70 was er de P-Code-virtuele machine om Pascalprogramma's platformonafhankelijk mee uit te voeren.
Ook Microsoft creëerde later zijn eigen virtuele machine: de Common Language Runtime of CLR, de basis van .NET. Hét grote verschil tussen de Java VM van Sun en de CLR van Microsoft is echter dat die van Sun op verschillende besturingssystemen kan draaien, terwijl die van Microsoft beperkt is tot de diverse Windows-versies van Microsoft. Al is er inmiddels door de opensourcegemeenschap een aantal succesvolle .NET-runtimes voor Linux uitgebracht, waarvan Mono de bekendste is, waarmee ook .NET-code op andere besturingssystemen kan draaien.

## Java en open source

Vaak wordt Java genoemd in verband met open source en open standaarden en op 13 november 2006 kondigde Sun Microsystems aan Java vrij te geven onder de GNU General Public License.
Al eerder had Sun het beheer van het Javaplatform in handen gelegd van een onafhankelijke organisatie, het Java Community Process (JCP). Dit samenwerkingsverband van Sun met andere bedrijven, instellingen en individuele personen bepaalt welke API's en andere standaarden onderdeel gemaakt worden van het platform. Ook bepaalt de JCP de richting van het kernplatform zelf – welke klassen opgenomen worden in de standaardbibliotheek en welke veranderingen er doorgevoerd worden in de taal zelf. Over veranderingen in het kernplatform heeft Sun echter een veto binnen het JCP.
Sun heeft destijds een Java-ontwikkelomgeving uitgebracht, NetBeans, die later vrijgegeven is in de opensourcegemeenschap en nu door een opensourcegemeenschap verder wordt ontwikkeld en beheerd. Ook zijn in de opensourcewereld veel tools en software te vinden voor Java en/of in Java geschreven, die worden uitgebracht onder een van de vele opensourcelicenties.

## Voorbeeldprogramma

Het bekende "Hello world"-programma in Java kan er zo uitzien: