Im Gegensatz zu bekannten Programmiersprachen wie C++ wird Java-Code zunächst in Bytecode compiliert, der dann über die spezielle virtuelle Maschine (Java Virtual Machine, JVM) des Betriebssystems ausgeführt wird. Über diesen Umweg reicht es also, wenn der Bytecode (Dateiendung .class) weitergegeben wird. Dieser kann auf allen möglichen Plattformen, z.B. Windows oder MacOS, ausgeführt werden. Hierzu wird dann das Java Runtime Environment benötigt.
Bei C++ sieht es ganz anders aus. Ein Windows-Programm kann nicht ohne Weiteres auf einem Mac gestartet werden und anderes herum genau so wenig.
Hallo Welt
Der Quellcode eines Java-Programms ist eine ganz normale Textdatei, kann also mit einem normalen Editor erzeugt und bearbeitet werden. Es ist jedoch bequemer, gleich eine Software wie Netbeans zu verwenden. Hierbei handelt es sich um eine frei erhältliche Entwicklungsumgebung, die in Java geschrieben worden ist und mit der man u.a. auch Java-Programme entwickeln kann.
public class helloworld {
public static void main(String[] args) {
System.out.print("Hallo Welt!");
}
}
Die Klasse helloworld ist hierbei die Hauptklasse und main die Hauptmethode. Funktionen werden als Methoden bezeichnet. Die Methode main hat die Eigenschaften public, static und void; public heißt öffentlich und meint für alle verfügbar, static heißen Methoden, die nicht verändert werden können und void meint, dass die Funktion keinen Wert zurückgibt. In der Klammer hinter dem Methodenbezeichner main finden wir String[] args, also können Argumente vom Typ String an die Methode übergeben werden.
Das klingt alles komplizierter als es ist. Für den Anfang merken wir uns einfach den grundsätzlichen Aufbau des Softwaregerüsts.
Wenn der Java Development Kit (JDK) installiert ist, kann man als den Quellcode für helloworld einfach wie er ist in eine Textdatei einfügen und anschließend als helloworld.java abspeichern. Es ist wichtig, dass sich der Name der Klasse im Dateinamen wiederfindet. Anschließend kann auf der Kommandozeilenebene (Windows cmd.exe, Mac Terminal) das Programm mit dem Java-Compiler mittels
javac helloworld.java
compiliert werden und zwar in die Datei helloworld.class. Diese Datei wird dann mit
java helloworld
ausgeführt und es wir Hallo Welt! ausgegeben. Leichter lässt sich der Vorgang selbstredend in einer Entwicklungsumgebung wie Netbeans bewerkstelligen.
Rechnen mit Integerzahlen und mit Gleitkommazahlen
Das folgende Programm zeigt die Anwendung der Grundrechenarten auf den Datentyp Integer, der in Java int heißt.
public class Integertest {
public static void main(String [] arguments) {
int a=3;
int b=4;
System.out.println(a + " + " + b + " = " + (a+b));
System.out.println(a + " - " + b + " = " + (a-b));
System.out.println(a + " * " + b + " = " + (a*b));
System.out.println(a + " / " + b + " = " + (a/b));
System.out.println(8 + " / " + b + " = " + (8/b));
/*
Ausgabe:
3 + 4 = 7
3 - 4 = -1
3 * 4 = 12
3 / 4 = 0
8 / 4 = 2
*/
}
}
Variablen vom Typ Integer sind ganzzahlig und werden mit int deklariert. Die meisten Berechnungen verlaufen erwartungsgemäß. Lediglich bei der Division gibt es Probleme, doch wir dürfen nicht vergessen, dass wir nur mit Ganzzahlen arbeiten.
Was passiert, wenn wir stattdessen mit Gleitkommazahlen arbeiten? In Java gibt es hierfür zwei Datentypen, nämlich float und das genauere double.
public class Gleitkommatest {
public static void main(String [] arguments) {
float a=3;
float b=4;
System.out.println(a + " + " + b + " = " + (a+b));
System.out.println(a + " - " + b + " = " + (a-b));
System.out.println(a + " * " + b + " = " + (a*b));
System.out.println(a + " / " + b + " = " + (a/b));
System.out.println(8 + " / " + b + " = " + (8/b));
/*
Ausgabe:
3.0 + 4.0 = 7.0
3.0 - 4.0 = -1.0
3.0 * 4.0 = 12.0
3.0 / 4.0 = 0.75
8 / 4.0 = 2.0
*/
}
}
Jetzt kommen wir auch bei der Division auf das erwartete Ergebnis. Übrigens ist das Dezimaltrennzeichen in Java wieder der Punkt.
Arbeiten mit Zeichenketten (Strings)
Zeichenketten werden mit dem Datentyp String beschrieben. Mit Ihnen können ganz unterschiedliche Manipulationen durchgeführt werden, von denen wir uns einige anschauen wollen.
So kann die Länge des Strings mit length() bestimmt werden. Mit charAt kann man feststellen, welches Zeichen an einer bestimmten Stelle zu finden ist. Hier wird wieder einmal mit 0 begonnen. Mit indexOf kann in einem String gesucht werden. Diese Funktion nutzt man häufig, wenn man mit substring einen bestimmten Teil der Zeichenkette kopieren will.
Manchmal möchte man mit toUpper einen String in Großbuchstaben umwandeln und mit toLower in Kleinbuchstaben. Des Weiteren können Teilstrings durch andere Teilstrings ersetzt werden, was sich mit replace realisieren lässt.
public class Zeichenketten {
public static void main(String [] arguments) {
String s = "Java macht Spaß!";
System.out.println(s);
System.out.println("Länge: " + s.length());
System.out.println("Ausgabe des 7. Zeichens: " + s.charAt(7));
System.out.println("Wir suchen ein t: " + s.indexOf("t"));
System.out.println("Teilstring 5. bis 9. Zeichen: " + s.substring(5,9));
System.out.println("In Großbuchstaben: " + s.toUpperCase());
System.out.println("Ersetzen a mit ie: " + s.replace("a","ie"));
/*
Ausgabe:
Java macht Spaß!
Länge: 16
Ausgabe des 7. Zeichens: c
Wir suchen ein t: 9
Teilstring 5. bis 9. Zeichen: mach
In Großbuchstaben: JAVA MACHT SPASS!
Ersetzen: Jievie miecht Spieß!
*/
}
}
Datenfelder (Arrays)
In Arrays können Werte vom gleichen Typ, wie z.B. double, int oder String gespeichert werden. Eine Möglichkeit, ein Array zu initialisieren, ist das Einfügen in einer geschweiften Klammer. Danach kann man über das Ansprechen des Arrayelements über eine eckige Klammer auf die einzelnen Werte zugreifen. Hier geschieht das über eine for-Schleife, wie wir sie aus Javascript kennen.
Des Weiteren haben wir hier eine Methode, also eine Funktion, vorgesehen, die die Werte der Arrays ausgeben soll. Sie ist wieder einmal vom Typ void, gibt also keinen Wert zurück. Ala Parameter werden die Werte des Arrays bzw. das Array selbst übergeben.
Verwundern könnte die Tatsache, dass die Funktion Ausgabe mehrfach vorhanden ist. In Java ist es möglich. Die Methoden unterscheiden sich hier allerdings im Parameter, einerseits ist es ein int-Array und andererseits ein Array aus Strings. Bei der Ausgabe wird eine for-Schleife durchlaufen bis das Ende des Arrays erreicht wird. Die laufende Nummer und das Arrayelement selbst werden durch einen Tabulator \t getrennt.
Zum Sortieren der Arrays kann sort genutzt werden. Hierzu muss dass Paket java.util.Arrays importiert werden. Das Sortierergebnis unterscheidet sich hierbei je nach Art der zu sortierenden Werte. Zahlen werden nach den Zahlenwerten sortiert [2, 3, 5, 7, 11, 13] und String alphabetisch [11, 13, 2, 3, 5, 7].
import java.util.Arrays;
public class Datenfelder {
private static void ausgabe(int[] arr) {
System.out.println("Nr.\tZahl");
for (int i = 0; i < arr.length; i++) {
System.out.println((i + 1) + "\t" + arr[i]);
}
System.out.println();
}
private static void ausgabe(String[] arr) {
System.out.println("Nr.\tZahl");
for (int i = 0; i < arr.length; i++) {
System.out.println((i + 1) + "\t" + arr[i]);
}
System.out.println();
}
public static void main(String[] args) {
int primzahlen[] = {13, 7, 2, 3, 11, 5};
ausgabe(primzahlen);
Arrays.sort(primzahlen);
ausgabe(primzahlen);
String primzahlen2[] = {"13", "7", "2", "3", "11", "5"};
ausgabe(primzahlen2);
Arrays.sort(primzahlen2);
ausgabe(primzahlen2);
}
}
Eingabe und Ausgabe
Die Ausgabe in Java-Programmen lässt sich besonders einfach über System.out.println realisieren. Für die Eingabe von der Konsole muss java.util.Scanner importiert werden.
Das soll an einem Beispiel zur BMI-Berechnung demonstriert werden. Hierzu werden wir Variablen verschiedener Datentypen verwenden. Zunächst muss name vom Typ String eingegeben werden. Zuvor jedoch wurde für die Eingaben generell die variable Scanner vom Typ Scanner deklariert. Der String kann jetzt mit Scanner.nextLine() Eingelsen werden.
Die Masse m besitzt den Typ double und wird über Scanner.nextDouble() eingegeben. Ähnlich verhältst es sich mit der Größe l in cm, die als Ganzzahl mit scanner.nextInt() einzugeben ist.
Für die Berechnung des BMI-Werts steht die Funktion berechne zur Verfügung, die einen Wert vom Typ double zurückgibt und die Parameter m und l hat. Für die Berechnung des BMI dient die Formel $BMI = \frac{m}{l^2}$, wobei die Masse in Kilogramm und die Größe in Metern anzugeben ist. Da wir die Größe in Zentimeter einlesen, müssen wir noch durch 100·100 rechnen.
import java.util.Scanner;
public class Eingabetest {
static double berechne(double m, int l) {
return m/(l*l/10000);
}
public static void main(String[] args) {
double m, bmi;
int l;
String name;
Scanner scanner = new Scanner(System.in);
System.out.println("Wie ist Ihr Name?: ");
name = scanner.nextLine();
System.out.println("Hallo " + name);
System.out.println("Geben Sie Ihre Masse in kg ein: ");
m = scanner.nextDouble();
System.out.println("Geben Sie Ihre Größe in cm ein: ");
l = scanner.nextInt();
bmi = berechne(m,l);
System.out.println("Ihr BMI ist: " + bmi);
}
}
Lehrer als Objekte
Wir wollen an dieser Stelle einen Einstieg in die objektorientierte Programmierung (OOP) wagen. Das hört sich zugegebenermaßen zunächst einmal sehr kompliziert an, ist es aber gar nicht.
Als Beispiel wollen wir uns die an einer Schule handelnden Personen vornehmen, wozu ja bekanntermaßen Schüler, Lehrer, Sekretärinnen, Hausmeister usw. gehören. Dazu wollen wir eine Klasse Person programmieren. Eine Person hat bei uns die Eigenschaften Vorname, Nachname, Roll in der der Schule und einen Spruch.
Des Weiteren haben wir die Methoden print() und printSpruch() vorgesehen. Mittels print() werden die wichtigsten Daten der Person ausgegeben und mit printSpruch() lediglich das Zitat.
Klasse: Person |
Eigenschaften (Instanzvariablen): Vorname Nachname Rolle (z.B. Lehrer) Spruch (ein Zitat) |
Methoden: print() printSpruch() |
Der folgende Quelltext zeigt die Klasse als Java-Code. Zunächst einmal wird die Klasse in der 1. Zeile definiert. Es folgen die Variablenvereinbarungen für die Eigenschaften. Dies sollen hier alle vom Typ String sein. Die Variable Spruch wird auch gleich mit einem String initialisiert. Dabei handelt es sich übrigens um eine irische Volksweisheit, die mir sehr sympathisch ist.
Die Methoden sind beide vom Typ void, es wird also keine Rückgabe erwartet. Die Variablen innerhalb einer Klasse werden über das Schlüsselwort this angesprochen. So kann man mit this.geschlecht auf das Geschlecht der Person zugreifen.
public class person {
String vorname, nachname;
// männlich/weiblich/divers
String geschlecht;
// Lehrer/Schueler/Sekretaerin/Hausmeister
String rolle;
// Zitat
String spruch = "Wer flucht, singt wenigstens nicht!";
public person(String vorname, String nachname) {
this.vorname = vorname;
this.nachname = nachname;
}
public void print() {
System.out.println(this.rolle);
System.out.print("\t" + this.vorname + " " + this.nachname);
System.out.println(" (" + this.geschlecht + ")");
this.printSpruch();
}
public void printSpruch() {
System.out.println("\t" + this.spruch);
}
}
In einer weiteren Klasse Schule können wir dann mit der Klasse Person arbeiten. Dazu deklarieren wir zunächst eine Variable vom Typ Person, die wir schlicht p nennen. Hier ist p ein Objekt der Klasse person.
public class Schule {
public static void main(String[] args) {
person p;
p = new person("Kay-Uwe", "Jagemann");
p.geschlecht = "männlich";
p.rolle = "Lehrer";
p.print();
}
}
mmmmm
Lehrer
Kay-Uwe Jagemann (männlich)
Wer flucht, singt wenigstens nicht!
mmmm
public class lehrer extends person {
//Name der Klasse
String klassenlehrer;
public lehrer(String vorname, String nachname, String klassenlehrer) {
// Java ruft hier den Konstruktor der Oberklasse auf
super(vorname, nachname);
this.rolle = "Lehrer";
this.klassenlehrer = klassenlehrer;
}
public void print() {
super.print();
System.out.println("\tKlassenlehrer: " + this.klassenlehrer);
}
}
mmmm
public class schueler extends person {
String klasse;
public schueler(String vorname, String nachname, String klasse) {
// Java ruft hier den Konstruktor der Oberklasse auf
super(vorname, nachname);
this.rolle = "Schüler";
this.klasse = klasse;
}
public void print() {
super.print();
System.out.println("\tKlasse: " + this.klasse);
}
}
mmmmmm
public class Schule {
public static void main(String[] args) {
person p;
schueler s;
lehrer l;
p = new person("Kay-Uwe", "Jagemann");
p.geschlecht = "männlich";
p.rolle = "Lehrer";
p.print();
s = new schueler("Max", "Mustermann", "6a");
s.geschlecht = "männlich";
s.spruch = "Ein gutes Pferd springt nur so hoch, wie es muss!";
s.print();
l = new lehrer("Cameron", "Diaz", "8a");
l.geschlecht = "weiblich";
l.spruch = "I don’t need a blackboard or a classroom to set an example.";
l.print();
}
}
mmmmmm
Lehrer
Kay-Uwe Jagemann (männlich)
Wer flucht, singt wenigstens nicht!
Schüler
Max Mustermann (männlich)
Ein gutes Pferd springt nur so hoch, wie es muss!
Klasse: 6a
Lehrer
Cameron Diaz (weiblich)
I don’t need a blackboard or a classroom to set an example.
Klassenlehrer: 8a