Dit artikel is ook beschikbaar als audiobestand.

Java (programmeertaal)

Van Wikipedia, de gratis encyclopedie
Spring naar navigatie Spring naar zoeken
Java
logo
Basis data
paradigma's : Objectgeoriënteerde programmeertaal
Jaar van uitgave: 1995
Ontwerper: James Gosling , Sun Microsystems
Ontwikkelaar: Sun Microsystems , Oracle
Huidige versie Java SE 16.0.2[1] (20 juli 2021)
Typen : sterk , statisch
Beïnvloed door: C ++ , C , Ada , Simula 67, Smalltalk , Objective-C , Object Pascal , Oberon , Eiffel , Modula-3 , Mesa , Simula , C # , UCSD Pascal , objecttype, variadische functie , annotatie (Java) , Niklaus Wirth , Patrick Naughton, voor elke loop
Aangedaan: Groovy , Clojure , C # , Scala , Vala , ActionScript , Seed7 , Kotlin , JavaScript
Besturingssysteem : platformonafhankelijk
Licentie : GNU General Public License
www.oracle.com/java/

Java is een objectgeoriënteerde programmeertaal en een geregistreerd handelsmerk van Sun Microsystems , dat in 2010 door Oracle werd overgenomen. De programmeertaal is een onderdeel van Java-technologie - het bestaat in feite uit de Java- ontwikkeltool ( JDK ) voor het maken van Java-programma's en de Java-runtime-omgeving (JRE) om ze uit te voeren. De runtime-omgeving zelf bestaat uit de virtuele machine ( JVM ) en de meegeleverde bibliotheken . Java als programmeertaal moet niet worden gelijkgesteld met Java-technologie; Java runtime-omgevingen voeren bytecode uit die kan worden gecompileerd vanuit zowel de programmeertaal Java als andere programmeertalen zoals Groovy , Kotlin en Scala . In principe kan elke programmeertaal worden gebruikt als basis voor Java-bytecode, maar in de meeste gevallen zijn er geen bijbehorende bytecode- compilers .

De programmeertaal Java wordt voornamelijk gebruikt binnen de Java-technologie om programma's te formuleren. Deze zijn in eerste instantie beschikbaar als pure, voor mensen begrijpelijke tekst , de zogenaamde broncode . Deze broncode is niet direct uitvoerbaar; Alleen de Java-compiler, die deel uitmaakt van de ontwikkelingstool, vertaalt het in voor de machine begrijpelijke Java-bytecode. De machine die deze bytecode uitvoert, is echter typisch virtueel - dat wil zeggen, de code wordt meestal niet rechtstreeks uitgevoerd door hardware (zoals een microprocessor ), maar door geschikte software op het doelplatform.

Het doel van deze virtualisatie is platformonafhankelijkheid : het programma zou zonder verdere wijzigingen op elke computerarchitectuur moeten kunnen draaien als daar een geschikte runtime-omgeving is geïnstalleerd . Oracle biedt zelf runtime-omgevingen aan voor de besturingssystemen Linux , macOS , Solaris en Windows . Andere fabrikanten hebben hun eigen Java runtime-omgevingen gecertificeerd voor hun platform. Java wordt ook gebruikt in auto's, hifi-systemen en andere elektronische apparaten.

Om de uitvoeringssnelheid te verhogen wordt gebruik gemaakt van concepten als just-in-time compilatie en hotspot-optimalisatie . In relatie tot het daadwerkelijke uitvoeringsproces kan de JVM de bytecode interpreteren , maar indien nodig ook compileren en optimaliseren .

Java is een van de meest populaire programmeertalen. In de sinds 2001 gepubliceerde TIOBE-index stond Java altijd op de eerste of tweede plaats in de ranglijst, concurrerend met C. [2] [3] Volgens de RedMonk programmeertaalindex 2019 staan ​​Java en Python op de tweede plaats na JavaScript . [4] [5]

Basisconcepten

Het ontwerp van de Java-programmeertaal had vijf hoofddoelen: [6]

eenvoud
Vergeleken met andere objectgeoriënteerde programmeertalen zoals C++ of C# , is Java eenvoudig omdat het een beperkt taalbereik heeft en bijvoorbeeld geen overbelasting door operators en meervoudige overerving ondersteunt.
Objectoriëntatie
Java is een van de objectgeoriënteerde programmeertalen .
Gedistribueerd
Een aantal eenvoudige opties voor netwerkcommunicatie, van TCP/IP- protocollen tot het aanroepen van methoden op afstand tot webservices , worden voornamelijk aangeboden via Java's klassenbibliotheek ; de Java-taal zelf biedt geen directe ondersteuning voor gedistribueerde uitvoering.
bekendheid
Vanwege de syntactische nabijheid van C++, de oorspronkelijke gelijkenis van de klassenbibliotheek met Smalltalk- klassenbibliotheken en het gebruik van ontwerppatronen in de klassenbibliotheek, vertoont Java geen onverwachte effecten voor de ervaren programmeur.
robuustheid
Veel van de ontwerpkeuzes die zijn gemaakt bij het definiëren van Java verminderen de kans op ongewenste systeemfouten; te noemen zijn de sterke typering, garbage collection, exception handling en de afwezigheid van pointer rekenkunde.
veiligheid
Concepten zoals de class loader, die de veilige toevoer van klasse-informatie naar de Java virtual machine regelt, en security managers, die ervoor zorgen dat alleen toegang tot programma-objecten waarvoor de juiste rechten beschikbaar zijn, beschikbaar zijn.
Architecturale neutraliteit
Java is zo ontwikkeld dat dezelfde versie van een programma in principe op elke computerhardware draait, ongeacht de processor of andere hardwarecomponenten.
draagbaarheid
Java is niet alleen architectuurneutraal, maar ook draagbaar. Dit betekent dat primitieve gegevenstypen zijn gestandaardiseerd in hun grootte en interne representatie, evenals in hun rekenkundig gedrag. Een float altijd een IEEE 754 float met een lengte van 32 bits. Hetzelfde geldt bijvoorbeeld voor de klassenbibliotheek, waarmee een GUI kan worden gemaakt die onafhankelijk is van het besturingssysteem.
efficiëntie
Door de optimalisatiemogelijkheid tijdens runtime heeft Java het potentieel om betere prestaties te behalen dan talen die beperkt zijn tot compile-time optimalisaties (C++ etc.). Dit wordt tegengegaan door de overhead die wordt veroorzaakt door de Java runtime-omgeving , waardoor de prestaties van bijvoorbeeld C++-programma's in sommige contexten worden overschreden [7] [8] maar in andere niet worden bereikt. [9]
Interpretabiliteit
Java is gecompileerd in machine-onafhankelijke bytecode , die op zijn beurt kan worden geïnterpreteerd op het doelplatform. Oracle's Java Virtual Machine interpreteert Java-bytecode voordat deze wordt gecompileerd en optimaliseert deze om prestatieredenen.
Parallelliseerbaarheid
Java ondersteunt multithreading , d.w.z. de parallelle uitvoering van onafhankelijke programmadelen. Bovendien biedt de taal zelf de sleutelwoorden synchronized en volatile constructies die het "Monitor & Condition Variable Paradigm" van CAR Hoare [10] ondersteunen . De klassenbibliotheek bevat extra ondersteuning voor parallel programmeren met threads. Moderne JVM's wijzen een Java- thread toe aan threads van het besturingssysteem en profiteren dus van processors met meerdere rekenkernen .
Dynamisch
Java is zo gestructureerd dat het kan worden aangepast aan dynamisch veranderende randvoorwaarden. Omdat de modules alleen tijdens runtime worden gekoppeld, kunnen delen van de software (bijvoorbeeld bibliotheken) bijvoorbeeld opnieuw worden geleverd zonder de resterende programmadelen aan te passen. Interfaces kunnen worden gebruikt als basis voor communicatie tussen twee modules; de daadwerkelijke implementatie kan echter dynamisch worden gewijzigd en bijvoorbeeld ook tijdens runtime.

Objectoriëntatie

Afhankelijkheidsgrafiek van de Java-kernklassen (gemaakt met jdeps en Gephi ). In het midden van het diagram zie je de meest gebruikte klassen Object en String.

Het basisidee van objectgeoriënteerd programmeren is om gegevens en bijbehorende functies zo goed mogelijk samen te vatten in een zogenaamd object en deze van buitenaf in te kapselen ( abstractie ). De bedoeling hierachter is om grote softwareprojecten beter beheersbaar te maken en de kwaliteit van de software te verhogen. Een ander doel van objectoriëntatie is een hoge mate van herbruikbaarheid van softwaremodules.

Een nieuw aspect van Java ten opzichte van de objectgeoriënteerde programmeertalen C++ en Smalltalk is het expliciete onderscheid tussen interfaces en klassen , wat tot uiting komt in de daarbij behorende trefwoorden interface en class . Java ondersteunt niet het erven van meerdere onafhankelijke basisklassen (de zogenaamde "meervoudige overerving" zoals in C ++ of Eiffel ), maar het ondersteunt wel de implementatie van een willekeurig aantal interfaces, die ook veel van de bijbehorende problemen kunnen oplossen. Methodehandtekeningen en standaardimplementaties van methoden worden doorgegeven aan de afgeleide klassen, maar geen attributen .

Java is niet volledig objectgeoriënteerd omdat de basisgegevenstypen ( int , boolean etc.) geen objecten zijn (zie ook Java-syntaxis ). Vanaf Java 5 worden ze echter automatisch omgezet in de corresponderende objecttypes en vice versa met autoboxing die transparant is voor de programmeur. [11]

voorbeeld

Broncode
 / **
* Deze les is een algemene les voor elk dier en aanbiedingen
* Inclusief methoden die alle dieren gemeen hebben.
* /
openbare klasse dier {
	/ **
* Met deze methode kan het dier communiceren. De subklassen hiervan
* Klasse kan deze methode negeren en een geschikte vinden
* Aanbieding implementatie voor het betreffende dier.
* /
	openbare leegte communiceren () {
	    // Gebruikt door alle subklassen die deze methode niet overschrijven.
	    Systeem . uit . println ( "Dier zegt niets." );
	}
}

/ **
* Verklaart de klasse "hond" als een subklasse van de klasse "dier".
* De klasse "hond" erft de velden en methoden van de klasse "dier".
* /
openbare klasse hond verlengt dier {
	/ **
* Deze methode is geïmplementeerd in de hogere klasse "Tier". zij zal
* Overschreven in deze klasse en aangepast voor de diersoort "hond".
* /
	@Override
	openbare leegte communiceren () {
		// Roept de implementatie van deze methode aan in de superklasse "Tier".
		geweldig . communiceren ();
		// Voert een tekst uit in de console.
		Systeem . uit . println ( "Hond zegt: 'Wuf Wuf'" );
	}
}

/ **
* Verklaart de klasse "kat" als een subklasse van de klasse "dier".
* De klasse "cat" erft de velden en methoden van de klasse "animal".
* /
openbare klasse kat verlengt dier {
	/ **
* Deze methode is geïmplementeerd in de hogere klasse "Tier". zij zal
* Overschreven in deze klasse en aangepast voor de diersoort "kat".
* /
	@Override
	openbare leegte communiceren () {
		// Roept de implementatie van deze methode aan in de superklasse "Tier".
		geweldig . communiceren ();
		// Voert een tekst uit op de console.
		Systeem . uit . println ( "kat zegt: 'miauw'" );
	}
}

openbare klas Hoofd {
	/ **
* Methode die wordt aangeroepen wanneer het programma wordt gestart.
* /
	public static void main ( String [] args ) {
		// declareert een variabele voor instanties van de klassen "dog" en "cat"
		Dierlijk dier ;

		// Maakt een instantie van de klasse "dog" en slaat de instantie op in
		// de variabele "tier"
		dier = nieuwe hond ();
		// Roept de dog.communicate () methode aan
		dier . communiceren ();

		// Maakt een instantie van de klasse "cat" en slaat de instantie op in
		// de variabele "tier"
		dier = nieuwe kat ();
		// Roept de cat.communicate () methode aan
		dier . communiceren ();
	}
}
Console-uitgang
Dier zegt niets.
Hond zegt: 'woef inslag'
Dier zegt niets.
Kat zegt: 'miauw'

Reflectie

Java biedt een Reflection API als onderdeel van de runtime-omgeving . Dit maakt het mogelijk om tijdens runtime toegang te krijgen tot klassen en methoden waarvan het bestaan ​​of de exacte vorm niet bekend was op het moment dat het programma werd gemaakt. Deze techniek wordt vaak gebruikt in combinatie met de fabrieksmethode ontwerp patroon .

annotaties

Met Java 5 heeft Sun annotaties toegevoegd aan de programmeertaal. Annotaties maken de notatie van metadata mogelijk en maken tot op zekere hoogte door de gebruiker gedefinieerde taalextensies mogelijk. Het doel van de annotaties is onder andere het automatisch genereren van code en andere belangrijke documenten in softwareontwikkeling voor terugkerende patronen op basis van zo kort mogelijke verwijzingen in de brontekst. Tot nu toe werden alleen Javadoc- opmerkingen met speciale JavaDoc-tags in Java gebruikt, die werden geëvalueerd door doclets zoals de XDoclet .

Annotaties kunnen ook worden opgenomen in de gecompileerde klassenbestanden. De broncode is dus niet vereist voor het gebruik ervan. Met name de annotaties zijn ook toegankelijk via de Reflection API. Ze kunnen bijvoorbeeld worden gebruikt om het bonenconcept uit te breiden.

Modulaire uitvoering op externe computers

Java biedt de mogelijkheid om klassen te schrijven die in verschillende uitvoeringsomgevingen draaien. Applets kunnen bijvoorbeeld worden uitgevoerd in webbrowsers die Java ondersteunen. Het Java-beveiligingsconcept kan worden gebruikt om ervoor te zorgen dat onbekende klassen geen schade kunnen veroorzaken, wat vooral belangrijk is bij applets (zie ook sandbox ). Voorbeelden van Java-modules die kunnen worden uitgevoerd in overeenkomstige uitvoeringsomgevingen zijn applets , servlets , portlets , MIDlets , Xlets , translets en Enterprise JavaBeans .

Kenmerken

Duke, de Java-mascotte

Objecttoegang in Java wordt intern in de VM geïmplementeerd met behulp van referenties die vergelijkbaar zijn met pointers die bekend zijn uit C of C++. [12] De taaldefinitie (Java Language Specification) noemt ze "Referentiewaarden" om duidelijk te maken dat ze worden overgedragen in de broncode van het betreffende programma als call by value . [13] Om veiligheidsredenen kunnen deze het eigenlijke geheugenadres niet herkennen of wijzigen. Zogenaamde pointer rekenkunde is daarom uitgesloten in Java. Door het ontwerp kan een veelvoorkomend type fout dat in andere programmeertalen voorkomt, vanaf het begin worden uitgesloten.

Correlatieklassen worden gecombineerd (Engelse pakketten) in pakketten. Deze pakketten maken het mogelijk om de zichtbaarheid van klassen te beperken, grotere projecten te structureren en de naamruimte voor verschillende ontwikkelaars te scheiden. De pakketnamen zijn hiërarchisch gestructureerd en beginnen meestal met de (omgekeerde) internetdomeinnaam van de ontwikkelaar, bijvoorbeeld com.google in het geval van klassenbibliotheken die door Google worden geleverd . Klassenamen hoeven alleen uniek te zijn binnen een pakket. Dit maakt het mogelijk om klassen van verschillende ontwikkelaars te combineren zonder naamconflicten te veroorzaken. De hiërarchie van de pakketnamen heeft echter geen semantische betekenis. In termen van zichtbaarheid tussen de klassen van twee pakketten, maakt het niet uit waar de pakketten zich in de naamhiërarchie bevinden. Klassen zijn ofwel alleen zichtbaar voor klassen in hun eigen pakket of voor alle pakketten.

Verder ondersteunt de taal threads ( gelijktijdig draaiende programmaonderdelen) en uitzonderingen (Engelse uitzondering). Java bevat ook een automatische garbage collector , die objecten verwijdert waarnaar niet langer wordt verwezen uit het geheugen.

Java maakt een expliciet onderscheid tussen interfaces en klassen . Een klasse kan een willekeurig aantal interfaces implementeren, maar heeft altijd precies één basisklasse . Java ondersteunt geen directe overerving van verschillende klassen (" meervoudige overerving "), maar overerving over verschillende hiërarchieniveaus (klasse- kind erft van klasse- vader , die op zijn beurt overerft van klasse- grootvader , enz.). Afhankelijk van de zichtbaarheid ( public , protected , default / package-private , private ) erft de klasse methoden en attributen (ook wel velden genoemd) van zijn klassevoorouders. Alle klassen zijn - direct of indirect - afgeleid van de rootklasse Object .

Een uitgebreide klassenbibliotheek maakt deel uit van Java. De programmeur krijgt zo een uniforme interface (application programming interface, API) aangeboden die onafhankelijk is van het onderliggende besturingssysteem.

Met Java 2 zijn de Java Foundation Classes (JFC) geïntroduceerd, die onder meer zorgen voor Swing , dat wordt gebruikt om platformonafhankelijke grafische gebruikersinterfaces (GUI) te genereren en is gebaseerd op de Abstract Window Toolkit .

syntaxis

Java- syntaxis / grammatica en semantiek zijn gedocumenteerd in de Java Language Specification van Sun Microsystems . Het volgende voorbeeldprogramma geeft het bericht "Hallo wereld!" weer, wat klassiek is onder programmeurs, gevolgd door een regeleinde op het uitvoermedium.

 openbare klas HalloWelt {
     public static void main ( String [] args ) {
         Systeem . uit . println ( "Hallo wereld!" );
     }
 }

Creatie en verdere ontwikkeling

Verschijning

De oorsprong en ontwikkeling van de Java-programmeertaal en aanverwante technologie worden beschreven in het artikel Java-technologie , evenals wanneer welke versie is gepubliceerd.

Oracle en JCP

Naast Oracle zorgen een groot aantal particulieren, kleine en grote bedrijven zoals Apple , IBM , Hewlett-Packard en Siemens voor de verdere ontwikkeling van de Java-taalspecificatie in het Java Community Process (JCP). De JCP werd in 1998 gelanceerd door Sun Microsystems.

Java als gratis software

Sun had beloofd zijn JDK te publiceren onder de GNU General Public License ; met de overname door Oracle werd ook open licenties overgenomen. Op 13 november 2006 werden de eerste delen van de javac-compiler en de virtuele machine-hotspot als open source gepubliceerd . Daarnaast is met OpenJDK een communitypagina geopend, met behulp waarvan de ontwikkeling gecoördineerd moet worden. [14] Op 8 mei 2007 volgden grote delen van de "Java SE"-broncode voor het maken van een JDK. De uitzondering hierop was code waarvoor Sun niet de benodigde rechten had om deze vrij te geven. Deze is daarom alleen in gecompileerde vorm beschikbaar. [15] Sun heeft ook aangekondigd dat ontwikkelingen op basis van de OpenJDK het "Java Compatible"-logo mogen dragen als ze zijn gecertificeerd volgens de "Java Compatibility Kit" (JCK).

Voorheen werd onder meer de Java-broncode bij elke JDK meegeleverd en was het daardoor mogelijk om deze te inspecteren, maar deze mocht niet naar believen worden gewijzigd. Daarom zijn er naast het officiële JCP ook verschillende onafhankelijke verenigingen die zich tot doel hebben gesteld Java onder een gratis open source licentie beschikbaar te stellen. De bekendste van deze projecten waren Apache Harmony , Kaffe en het GNU Classpath-project . Er is momenteel een andere belangrijke implementatie naast OpenJDK die de huidige Java-releases publiceert, Eclipse OpenJ9. Deze JVM-implementatie is door IBM aan de Eclipse Foundation gegeven. [16] OpenJ9 is gelicentieerd onder EPL 2.0 , Apache 2.0 en GNU 2.0 met Classpath Exception . [17]

Verschillen met vergelijkbare talen

Daarnaast biedt Java de mogelijkheid om verschillende scripttalen uit te voeren vanuit Java-code. Er zijn ook een aantal programmeertalen die zijn gecompileerd volgens Java bytecode. Dit betekent dat programmaonderdelen ook in andere programmeertalen kunnen worden geïmplementeerd. Met JDK versie 7, die werd uitgebracht op 28 juli 2011, [18] is ook de ondersteuning voor dynamische "vreemde talen" door de virtuele machine verbeterd. [19]

JavaScript

Java moet niet worden verward met de scripttaal JavaScript . JavaScript is ontwikkeld door Netscape Communications , heette voorheen LiveScript en werd omgedoopt tot JavaScript als onderdeel van een samenwerking tussen Netscape en Sun Microsystems. [20]

JavaScript is een dynamisch getypte , objectgebaseerde, maar tot ECMAScript 2015 klasseloze scripttaal met een syntaxis die vergelijkbaar is met C, Perl of Java, maar verschilt in veel opzichten van Java. Ondanks de gelijkenis van de namen van de twee programmeertalen, verschilt Java meer van JavaScript dan bijvoorbeeld van C++ of C#. JavaScript wordt voornamelijk gebruikt in HTML- pagina's voor embedded programmering om interactieve webapplicaties mogelijk te maken.

Koetjes en kalfjes

Smalltalk is een van de oudste objectgeoriënteerde programmeertalen. Java erft van Smalltalk het basisconcept van een klassenboom waaraan alle klassen zijn gekoppeld. Alle klassen zijn direct of indirect afgeleid van de klasse java.lang.Object . Bovendien zijn de concepten automatisch afval (vuilnisophaler) en de virtuele machine , evenals een aantal andere functies van de taal Smalltalk.

Smalltalk heeft echter geen primitieve gegevenstypen zoals int - zelfs een eenvoudig getal is een object. Dit concept is niet overgenomen door Java, maar vanaf Java 5 worden primitieve datatypes geconverteerd naar de corresponderende objecttypes met autoboxing en vice versa. [11]

C ++

Java is gebaseerd op de syntaxis van de programmeertaal C++ . In tegenstelling tot C++ werd er echter geen gebruik gemaakt van meervoudige overerving of pointer-rekenkunde . Klassen kunnen slechts één superklasse hebben (enkele overerving), maar ze kunnen een willekeurig aantal interfaces implementeren. Interfaces komen overeen met abstracte klassen in C++ die geen attributen of concrete methoden hebben, maar conceptueel anders worden gebruikt dan de abstracte klassen die ook in Java mogelijk zijn. Het interne geheugenbeheer is grotendeels uit handen genomen van de Java-ontwikkelaar; dit wordt gedaan door automatische garbagecollection . Dit mechanisme garandeert echter ook niet de volledige uitsluiting van geheugenlekken . Uiteindelijk moet de programmeur ervoor zorgen dat objecten die niet meer worden gebruikt niet langer worden verwezen door een lopende thread. Onderling verwijzende objecten die door geen enkele thread meer via referenties kunnen worden benaderd, worden ook vrijgegeven, waarbij het aan de Garbage Collector (GC) is wanneer en of deze objecten überhaupt worden vrijgegeven. Elke objectklasse heeft ook een methode genaamd finalize() , die door de vuilnisman kan worden aangeroepen om extra "opruimingswerk" uit te voeren. Er is echter geen garantie wanneer en of dit zal gebeuren. Het is dus niet te vergelijken met een destructor uit C++.

Naast meervoudige overerving en geheugenberekeningen, werden andere C++-taalconstructies opzettelijk weggelaten bij de ontwikkeling van Java:

In tegenstelling tot C ++ is het in Java niet mogelijk om operators (bijvoorbeeld rekenkundige operatoren zoals + en - , logische operatoren zoals && en || of de indexoperator [] ) te zwaar te wegen , dat wil zeggen in een bepaalde context met een nieuwe betekenis te geven. Enerzijds vereenvoudigt dit de taal zelf en voorkomt het dat broncodes onleesbaar worden gemaakt met operators die worden overladen met moeilijk te begrijpen semantiek. Aan de andere kant zouden door de gebruiker gedefinieerde typen met overbelaste operators meer lijken op ingebouwde typen in C ++ - met name numerieke code zou op die manier gemakkelijker te begrijpen zijn. De taaldefinitie van Java definieert echter typeafhankelijk gedrag van de operators + (toevoeging voor rekenkundige operanden, anders voor aaneenschakeling van tekenreeksen "stringaaneenschakeling") en & , | en ^ (logisch voor boolean en bitsgewijze voor rekenkundige operanden). Hierdoor lijken deze operators op zijn minst op gedeeltelijk overbelaste operators.

De C++-constructie van de sjablonen , waarmee algoritmen of zelfs hele klassen onafhankelijk van de daarin gebruikte gegevenstypen kunnen worden gedefinieerd, werd in Java niet overgenomen. Vanaf versie 5 ondersteunt Java zogenaamde generieke middelen , die geen metaprogrammering toestaan, maar vergelijkbaar met C++-sjablonen typeveilige containers en dergelijke toestaan.

Het const sleutelwoord is gereserveerd in Java, maar heeft geen functie. Het alternatief voor const (en preprocessor-richtlijnen) is final . In tegenstelling tot const wordt final niet overgenomen in een methodehandtekening en is daarom alleen geldig in de huidige scope. De final modifier kan een klasse zijn (die hier niet meer van kan worden afgeleid), een attribuut (waarvan de waarde maar één keer kan worden ingesteld) of een methode (die niet kan worden overschreven).

C # (.NET)

Het .NET- platform van Microsoft kan worden gezien als een concurrent van Java. Met de specificatie van C# probeerde Microsoft, als onderdeel van zijn .NET-strategie, de balans te vinden tussen het creëren van een nieuwe taal en de gemakkelijke integratie van bestaande componenten.

Conceptuele verschillen met Java bestaan ​​met name bij de implementatie van callback-mechanismen. In .NET heeft deze ondersteuning gedelegeerde (Engelse afgevaardigden) een concept geïmplementeerd dat vergelijkbaar is met functiewijzers. In Java kan dit worden bereikt door middel van verwijzingen naar methoden of lambda-expressies.

Verdere ondersteuning van .NET-talen genaamd attributen (attributen) waarmee de functionaliteit van de taalmetadata in de code kan worden uitgebreid (vergelijkbare functionaliteit is overgenomen in de vorm van annotatie die hierboven is beschreven in Java 5.0). C # bevat ook elementen van de taal Visual Basic , bijvoorbeeld kenmerken (eigenschappen), evenals concepten van C ++.

In .NET is het, net als in Java, mogelijk om uitzonderingen op een methode te declareren. In Java kunnen uitzonderingen zo worden gedeclareerd dat ze ook moeten worden verwerkt ( aangevinkte uitzondering ).

Windows-systeemopdrachten (Win- ABI- aanroepen) kunnen in .NET worden aangeroepen via platformaanroep of met C++ / CLI. Dit is niet mogelijk in Java, maar met de Java Native Interface is er de mogelijkheid om rechtstreeks via DLL naar C- en C++-code te verwijzen en deze buiten de Java Virtual Machine uit te voeren .

Scala

Scala is een programmeertaal die objectgeoriënteerde en functionele paradigma's combineert en, net als Java, kan worden uitgevoerd op de Java Virtual Machine .

In tegenstelling tot Java, en vergelijkbaar met C #, is het typesysteem verenigd en omvat het referentie- en waardetypen. Benutzer können weitere Typen definieren – in Java sind die verfügbaren Werttypen auf die fest vordefinierten primitiven Typen ( int , long , …) beschränkt.

Scala verwendet statt Schnittstellen ( interface ) sogenannte Traits ( traits ), die wiederverwendbare Methodenimplementierungen enthalten können. Weitere Funktionalität, die nicht in Java enthalten ist, umfasst unter anderem Typen und Funktionen höherer Ordnung , Pattern Matching und frei wählbare Methoden- und Klassennamen.

Wie in C# gibt es keine checked exceptions . Allerdings können Methoden mit einer @throws -Annotation versehen werden. Scala entfernt unter anderem das Konzept statischer Methoden und Klassen (ersetzt durch companion objects ), Raw Types , die Notwendigkeit von Getter- und Settermethoden und die unsichere Varianz von Arrays.

Die Varianz generischer Typen muss nicht wie in Java bei der Nutzung erfolgen ( use-site variance ), sondern kann direkt bei der Deklaration angegeben werden ( declaration-site variance ).

Kotlin

Kotlin ist eine plattformübergreifende , statisch typisierte Programmiersprache , die in Bytecode für die Java Virtual Machine (JVM) übersetzt wird, aber auch in JavaScript - Quellcode oder (mittels LLVM ) in Maschinencode umgewandelt werden kann.

Anders als in Java wird bei Kotlin der Datentyp einer Variable nicht vor dem Variablennamen, sondern danach, abgetrennt durch einen Doppelpunkt, notiert. Allerdings unterstützt Kotlin auch Typinferenz , sodass der Typ oft auch weggelassen werden kann, wenn er aus dem Zusammenhang klar ist. Als Anweisungsende genügt der Zeilenumbruch, optional kann jedoch auch ein Semikolon verwendet werden. [21] Zusätzlich zu Klassen und Methoden (in Kotlin: member functions ) aus der objektorientierten Programmierung unterstützt Kotlin prozedurale Programmierung unter Verwendung von Funktionen sowie bestimmte Aspekte der funktionalen Programmierung . [22] Als Einstiegspunkt dient wie bei C u. ä. eine main-Funktion .

Kotlin lässt sich außerdem zur Entwicklung von Android-Apps verwenden und wird dafür seit 2017 offiziell von Google unterstützt. [23] Seit Mai 2019 ist Kotlin die von Google bevorzugte Sprache für Android-Appentwicklung. [24]

Anwendungsarten

Mit Java können zahlreiche verschiedene Arten von Anwendungen erstellt werden.

Java-Webanwendungen

Java-Webanwendungen sind Java-Programme, die auf einem Webserver geladen und gestartet werden und beim Benutzer in einem Webbrowser ablaufen bzw. dargestellt werden. Üblicherweise läuft ein Teil der Webanwendung auf dem Server (die Geschäftslogik und Persistenz ) und ein anderer Teil am Webbrowser (die Logik der grafischen Benutzeroberfläche ). Der Serverteil wird üblicherweise vollständig in Java geschrieben, der Browserteil üblicherweise in HTML und JavaScript. Es ist jedoch auch möglich, Java-Webanwendungen inklusive GUI-Logik vollständig in Java zu schreiben (siehe z. B. Google Web Toolkit oder die Remote Application Platform ). Bekannte Beispiele für Java-Webanwendungen sind Twitter , [25] Jira , Jenkins oder Gmail (das nicht vollständig, aber zu großen Teilen in Java geschrieben ist).

Java-Desktop-Anwendungen

Unter Desktop-Anwendungen oder Applikationen werden normale Desktop-Programme zusammengefasst. Sowohl Internet-Kommunikationsprogramme als auch Spiele oder Office-Anwendungen, die auf einem normalen PC laufen, werden so genannt. Bekannte Beispiele für Java-Desktop-Anwendungen sind die integrierte Entwicklungsumgebung Eclipse , das Filesharing -Programm Vuze oder das Computerspiel Minecraft .

Java-Applets

Java-Applets sind Java-Anwendungen, die normalerweise in einem Webbrowser ausgeführt werden. Sie sind üblicherweise auf einen durch ein spezielles HTML -Tag definierten Bereich einer Webseite beschränkt. Voraussetzung für die Ausführung von Java-Applets ist ein Java-fähiger Browser. Diese Anwendungsform wird seit Java 11 nicht mehr unterstützt, nachdem sie bereits in Java 9 als „veraltet“ gekennzeichnet wurde. [26] [27] [28] [29]

Apps

Apps sind kleinere Applikationen für mobile Geräte wie Handys, Smartphones, PDAs oder Tablets. Sie laufen üblicherweise auf speziellen, für die Ausführung von Java-Anwendungen auf mobilen Geräten optimierten Java-Plattformen wie Java ME .

Apps für das Android Betriebssystem von Google werden in der hier beschriebenen Sprache Java programmiert, basieren aber auf einer abweichenden Klassenbibliotheks - API .

Entwicklungsumgebungen

Es gibt eine große Vielfalt von Entwicklungsumgebungen für Java, sowohl proprietäre als auch freie ( Open Source ). Die meisten Entwicklungsumgebungen für Java sind selbst ebenfalls in Java geschrieben.

Die bekanntesten Open-Source-Umgebungen sind das von der Eclipse Foundation bereitgestellte Eclipse und das von Sun entwickelte NetBeans .

Unter den kommerziellen Entwicklungsumgebungen sind IntelliJ IDEA von JetBrains (welches in der Community Edition [30] jedoch Freie Software ist), JBuilder von Borland sowie JCreator und das auf NetBeans basierende Sun ONE Studio von Sun, am verbreitetsten. Außerdem gibt es noch eine um einige hundert Plugins erweiterte Version von Eclipse, die von IBM unter dem Namen WebSphere Studio Application Developer („WSAD“) vertrieben wurde und ab Version 6.0 Rational Application Developer („RAD“) heißt.

Apple liefert mit macOS ab Version 10.3 die Entwicklungsumgebung Xcode aus, die verschiedene Programmiersprachen unterstützt, allerdings einen Schwerpunkt auf C, C++, Objective-C und Swift setzt. [31] [32] Für das Programmieren von Android-Apps mit Java empfiehlt sich Android Studio .

Für Einsteiger und Ausbildungszwecke konzipiert ist die IDE BlueJ , wo unter anderem die Beziehungen zwischen den verschiedenen Klassen graphisch in Form von Klassendiagrammen dargestellt werden.

Sehr viele Texteditoren bieten Unterstützung für Java, darunter Emacs , jEdit , Atom , Visual Studio Code , Vim , Geany , Jed , Notepad++ und TextPad .

Compiler

Ein Java- Compiler übersetzt Java- Quellcode (Dateiendung „.java“) in einen ausführbaren Code. Grundsätzlich unterscheidet man zwischen Bytecode- und Nativecode -Compilern. Einige Java-Laufzeitumgebungen verwenden einen JIT-Compiler , um zur Laufzeit den Bytecode häufig genutzter Programmteile in nativen Maschinencode zu übersetzen.

Bytecode-Compiler

Im Normalfall übersetzt der Java-Compiler die Programme in einen nicht direkt ausführbaren Bytecode (Dateiendung „.class“), den die Java Runtime Environment (JRE) später ausführt. Die aktuelle HotSpot -Technologie kompiliert den Bytecode zur Laufzeit in nativen Prozessorcode und optimiert diesen abhängig von der verwendeten Plattform. Diese Optimierung findet dabei nach und nach statt, sodass der Effekt auftritt, dass Programmteile nach mehrmaliger Abarbeitung schneller werden. Andererseits führt diese Technik, die ein Nachfolger der Just-in-time-Kompilierung ist, dazu, dass Java-Bytecode theoretisch genau so schnell wie native, kompilierte Programme ausgeführt werden könnte.

Die HotSpot-Technik ist seit der JRE Version 1.3 verfügbar und wurde seitdem stetig weiter verbessert.

Beispiele für Bytecode-Compiler sind javac (Teil des JDK ) und war Jikes (eingestellt, Funktionsumfang bis Java SE 5) von IBM .

Native Compiler

Es existieren auch Compiler für Java, die Java-Quelltexte oder Java-Bytecode in „normalen“ Maschinencode übersetzen können, sogenannte Ahead-of-time-Compiler . Nativ kompilierte Programme haben den Vorteil, keine JavaVM mehr zu benötigen, aber auch den Nachteil, nicht mehr plattformunabhängig zu sein.

Beispiele für native Java Compiler waren Excelsior JET (eingestellt, bis Java SE 7), sowie GNU Compiler for Java (GCJ, eingestellt, bis J2SE 5.0) wie MinGW , Cygwin oder JavaNativeCompiler (JNC).

Wrapper

Als weitere Möglichkeit kann das Java-Programm in ein anderes Programm „eingepackt“ (englisch to wrap ) werden; diese äußere Hülle dient dann als Ersatz für ein Java-Archiv . Sie sucht selbständig nach einer installierten Java-Laufzeitumgebung , um das eigentliche Programm zu starten, und informiert den Benutzer darüber, wo er eine Laufzeitumgebung herunterladen kann, sofern noch keine installiert ist. Es ist also immer noch eine Laufzeitumgebung nötig, um das Programm starten zu können, aber der Anwender erhält eine verständliche Fehlermeldung, die ihm weiterhilft.

Java Web Start ist ein etwas eleganterer und standardisierter Ansatz für diese Lösung – er ermöglicht die einfache Aktivierung von Anwendungen mit einem einzigen Mausklick und garantiert, dass immer die neueste Version der Anwendung ausgeführt wird. Dadurch werden komplizierte Installations- oder Aktualisierungsprozeduren automatisiert.

Beispiele für Java-Wrapper sind JSmooth oder Launch4J . JBuilder von Borland und NSIS sind ebenfalls in der Lage, einen Wrapper für Windows zu erstellen.

Siehe auch

Literatur

Weblinks

Commons : Java (programming language) – Sammlung von Bildern, Videos und Audiodateien

Einzelnachweise

  1. Consolidated JDK 16 Release Notes . 20. Juli 2021 (abgerufen am 27. Juli 2021).
  2. Robert McMillan: Is Java Losing Its Mojo? wired.com , 1. August 2013, abgerufen am 29. September 2018 (englisch): „Java is on the wane, at least according to one outfit that keeps on eye on the ever-changing world of computer programming languages. For more than a decade, it has dominated the Tiobe Programming Community Index – a snapshot of software developer enthusiasm that looks at things like internet search results to measure how much buzz different languages have. But lately, Java has been slipping.“
  3. TIOBE Programming Community Index. tiobe.com, 2015, abgerufen am 3. April 2015 (englisch).
  4. Stephen O'Grady: The RedMonk Programming Language Rankings: January 2020. In: tecosystems. RedMonk, 28. Februar 2020, abgerufen am 5. März 2020 (amerikanisches Englisch).
  5. Silke Hahn: Python schreibt Geschichte: Platz 2 im Programmiersprachen-Ranking. heise online, 3. März 2020, abgerufen am 5. März 2020 .
  6. The Java Language: An Overview. 1995 Sun Whitepaper
  7. Hajo Schulz: Daniel Düsentrieb, C#, Java, C++ und Delphi im Effizienztest . Teil 1. In: c't . Nr.   19 . Heise Zeitschriften Verlag, Hannover 2003, S.   204–207 ( heise.de [abgerufen am 21. Oktober 2010]).
    Hajo Schulz: Daniel Düsentrieb, C#, Java, C++ und Delphi im Effizienztest . Teil 2. In: c't . Nr.   21 . Heise Zeitschriften Verlag, Hannover 2003, S.   222–227 ( heise.de [abgerufen am 21. Oktober 2010]).
  8. JPLewis, Ulrich Neumann: Java pulling ahead? Performance of Java versus C++. Computer Graphics and Immersive Technology Lab, University of Southern California, Januar 2003, abgerufen am 21. Oktober 2010 (englisch): „This article surveys a number of benchmarks and finds that Java performance on numerical code is comparable to that of C++, with hints that Java's relative performance is continuing to improve.“
  9. Robert Hundt: Loop Recognition in C++/Java/Go/Scala . Hrsg.: Scala Days 2011. Stanford CA 27. April 2011 (englisch, scala-lang.org [PDF; 318   kB ; abgerufen am 17. November 2012]): We find that in regards to performance, C++ wins out by a large margin. […] The Java version was probably the simplest to implement, but the hardest to analyze for performance. Specifically the effects around garbage collection were complicated and very hard to tune
  10. CAR Hoare: Monitors: an operating system structuring concept . (PDF) In: Communications of the ACM , 17, Nr. 10, 1974, S. 549–557 doi:10.1145/355620.361161
  11. a b Autoboxing in Java (englisch)
  12. Scott Stanchfield: Java is Pass-by-Value, Dammit! (Nicht mehr online verfügbar.) JavaDude.com, archiviert vom Original am 15. Mai 2008 ; abgerufen am 5. November 2010 (englisch).
  13. 4.1. The Kinds of Types and Values. In: Java Language Specification. Oracle Inc., abgerufen am 24. September 2016 (englisch).
  14. Community-Seite zur Entwicklung des Open-Source-JDKs von Sun
  15. Sun Microsystems Presseankündigung vom 8. Mai 2007 ( Memento vom 11. Mai 2008 im Internet Archive ) (englisch)
  16. Java: IBM überträgt die JVM J9 an die Eclipse Foundation. In: heise online. Abgerufen am 24. September 2019 .
  17. eclipse openj9 license. Eclipse Foundation, 1. August 2018, abgerufen am 24. September 2019 .
  18. Roadmap JDK 7 (englisch)
  19. JDK 7 Features – JSR 292: VM support for non-Java languages (InvokeDynamic) (englisch)
  20. Brendan Eich: JavaScript at Ten Years ( Memento vom 28. Mai 2007 im Internet Archive ) ( MS PowerPoint ; 576 kB).
  21. Semicolons . jetbrains.com. Abgerufen am 8. Februar 2014.
  22. functions . jetbrains.com. Abgerufen am 8. Februar 2014.
  23. Maxim Shafirov: Kotlin on Android. Now official. In: Kotlin Blog. 17. Mai 2017, abgerufen am 18. Juni 2019 (amerikanisches Englisch).
  24. Google I/O: Googles Bekenntnis zu Kotlin. In: heise online. Abgerufen am 18. Juni 2019 .
  25. developer.ibm.com
  26. Deprecated APIs, Features, and Options. Abgerufen am 14. September 2019 .
  27. JEP 289: Deprecate the Applet API. Abgerufen am 14. September 2019 .
  28. Dalibor Topic: Moving to a Plugin-Free Web. Abgerufen am 14. September 2019 .
  29. Aurelio Garcia-Ribeyro: Further Updates to 'Moving to a Plugin-Free Web'. Abgerufen am 14. September 2019 .
  30. JetBrains Community Edition auf GitHub
  31. Apple Xcode Features
  32. Swift for XCode