Java

Java entstand aus einem Projekt der Firma Sun, in dem Produkte für den Consumer-Electronics Bereich entwickelt werden sollten. Um die Softwarekomponenten dieser Produkte plattformunabhängig zu halten, wurde zunächst mit einer Erweiterung von C++ gearbeitet. Es stellte sich Mitte 1991 heraus, dass auch ein sehr stark erweitertes C++ nicht den Ansprüchen genügte. Deshalb ging man zu einer neu entworfenen Programmiersprache namens Oak über. Der Name wurde aus markenschutzrechtlichen Gründen später in Java geändert.

Java erlangte weite Verbreitung, als 1995 ein Lizenzvertrag zwischen Sun und Netscape geschlossen wurde. Das hatte zur Folge, dass Java in den Netscape Navigator integriert und so einem breiten Publikum zugänglich gemacht wurde.

Seitdem hat sich die Sprache in mehreren Schritten weiterentwickelt und die Zahl und der Umfang der mitgelieferten oder erhältlichen Bibliotheken (z.B. AWT, JSP, JSTL, JSF, JAXB, JAX-WS, JMX, EJB, JMS, JPA, Velocity, Struts, Tapestry, Hibernate, Spring Framework, Lucene) wächst ständig.

Java ist eine objektorientierte Sprache. Zwar sind nicht alle Datentypen auch Klassen, aber es gibt keine Möglichkeit, Funktionen oder Prozeduren zu schreiben, die nicht Methoden einer Klasse sind. Java verwendet eine C/C++-ähnliche Syntax. Es gibt ähnliche Basisdatentypen wie in C.

In Java gibt es weder Zeiger noch Zeigerarithmetik. Das verringert die Möglichkeit von Programmierfehlern. Außerdem erleichtert bzw. ermöglicht das Fehlen direkter Speichermanipulation die effiziente automatische Speicherverwaltung durch einen Garbage-Collector.

Java-Quelltexte werden vom Java-Compiler normalerweise nicht in Maschinensprache übersetzt (Ausnahme sind modernere Versionen von gcc). Die Übersetzung kann durch Tools wie Ant und XDoclet weitgehend automatisiert werden. Der Übersetzungsprozess hat einen maschinenunabhängigen Zwischencode zum Resultat. Dieser Zwischencode wird von einer plattformspezifischen virtuellen Maschine (siehe Java Virtual Machine) ausgeführt. Durch die Verwendung von Zwischencode sind Java-Programme plattformunabhängig.

Java unterstützt das Erstellen von Programmen mit mehreren Ausführungspfaden (siehe Thread). Zur Synchronisierung von Threads werden Monitore verwendet.

Als objektorientierte Programmiersprache bietet Java das Konzept der Klasse. Java unterstützt jedoch nur die einfache Vererbung. Alle Klassen sind Instanzen einer Metaklasse (java.lang.Class). Alle Klassen sind von einer einzigen Klasse abgeleitet (java.lang.Object).

Um die Einschränkungen der einfachen Vererbung zumindest teilweise zu mildern, gibt es so genannte Interfaces. Ein Interface ist eine spezielle abstrakte Klasse, die keine Instanzvariablen vereinbart und ausschließlich abstrakte Methoden deklariert. Interfaces können von mehreren anderen Interfaces erben. Klassen können beliebig viele Interfaces implementieren. Das bedeutet, dass (wenn es sich bei der Klasse nicht um eine abstrakte Klasse handelt) die Klasse alle in den Interfaces vereinbarten Methoden implementieren muss. Eine Variable, deren Typ ein Interface ist, können Instanzen der Klassen als Wert zugewiesen werden, die das Interface implementieren.

Beliebig viele Klassen und Interfaces können in einem Package gruppiert werden. Innerhalb eines Packages haben Klassen und Interfaces eindeutige Namen. Klassen, Methoden und Klassen- bzw. Instanzvariablen können in ihrer Sichtbarkeit auf das sie enthaltende Package eingeschränkt werden.