Einführung Java

Im Gegen­satz zu bekann­ten Pro­gram­mier­spra­chen wie C++ wird Java-Code zunächst in Byte­code com­pi­liert, der dann über die spe­zi­el­le vir­tu­el­le Maschi­ne (Java Vir­tu­al Machi­ne, JVM) des Betriebs­sys­tems aus­ge­führt wird. Über die­sen Umweg reicht es also, wenn der Byte­code (Datei­endung .class) wei­ter­ge­ge­ben wird. Die­ser kann auf allen mög­li­chen Platt­for­men, z.B. Win­dows oder MacOS, aus­ge­führt wer­den. Hier­zu wird dann das Java Run­time Envi­ron­ment benö­tigt.

Bei C++ sieht es ganz anders aus. Ein Win­dows-Pro­gramm kann nicht ohne Wei­te­res auf einem Mac gestar­tet wer­den und ande­res her­um genau so wenig.

Vom Quellcode zum fertigen Programm bei Java und bei anderen Programmiersprachen wie C++ und Objective-C.
Vom Quell­code zum fer­ti­gen Pro­gramm bei Java und bei ande­ren Pro­gram­mier­spra­chen wie C++ und Objec­ti­ve-C.

Hallo Welt

Der Quell­code eines Java-Pro­gramms ist eine ganz nor­ma­le Text­da­tei, kann also mit einem nor­ma­len Edi­tor erzeugt und bear­bei­tet wer­den. Es ist jedoch beque­mer, gleich eine Soft­ware wie Net­be­ans zu ver­wen­den. Hier­bei han­delt es sich um eine frei erhält­li­che Ent­wick­lungs­um­ge­bung, die in Java geschrie­ben wor­den ist und mit der man u.a. auch Java-Pro­gram­me ent­wi­ckeln kann.

public class helloworld {
  public static void main(String[] args) {
    System.out.print("Hallo Welt!");
  }
}

Die Klas­se hel­lo­world ist hier­bei die Haupt­klas­se und main die Haupt­me­tho­de. Funk­tio­nen wer­den als Metho­den bezeich­net. Die Metho­de main hat die Eigen­schaf­ten public, sta­tic und void; public heißt öffent­lich und meint für alle ver­füg­bar, sta­tic hei­ßen Metho­den, die nicht ver­än­dert wer­den kön­nen und void meint, dass die Funk­ti­on kei­nen Wert zurück­gibt. In der Klam­mer hin­ter dem Metho­den­be­zeich­ner main fin­den wir String[] args, also kön­nen Argu­men­te vom Typ String an die Metho­de über­ge­ben wer­den.

Das klingt alles kom­pli­zier­ter als es ist. Für den Anfang mer­ken wir uns ein­fach den grund­sätz­li­chen Auf­bau des Soft­ware­ge­rüsts.

Wenn der Java Deve­lo­p­ment Kit (JDK) instal­liert ist, kann man als den Quell­code für hel­lo­world ein­fach wie er ist in eine Text­da­tei ein­fü­gen und anschlie­ßend als hel​lo​world​.java abspei­chern. Es ist wich­tig, dass sich der Name der Klas­se im Datei­na­men wie­der­fin­det. Anschlie­ßend kann auf der Kom­man­do­zei­len­ebe­ne (Win­dows cmd.exe, Mac Ter­mi­nal) das Pro­gramm mit dem Java-Com­pi­ler mit­tels

javac helloworld.java

com­pi­liert wer­den und zwar in die Datei helloworld.class. Die­se Datei wird dann mit

java helloworld

aus­ge­führt und es wir Hal­lo Welt! aus­ge­ge­ben. Leich­ter lässt sich der Vor­gang selbst­re­dend in einer Ent­wick­lungs­um­ge­bung wie Net­be­ans bewerk­stel­li­gen.

Rechnen mit Integerzahlen und mit Gleitkommazahlen

Das fol­gen­de Pro­gramm zeigt die Anwen­dung der Grund­re­chen­ar­ten auf den Daten­typ Inte­ger, 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
      */
  }
}

Varia­blen vom Typ Inte­ger sind ganz­zah­lig und wer­den mit int dekla­riert. Die meis­ten Berech­nun­gen ver­lau­fen erwar­tungs­ge­mäß. Ledig­lich bei der Divi­si­on gibt es Pro­ble­me, doch wir dür­fen nicht ver­ges­sen, dass wir nur mit Ganz­zah­len arbei­ten.

Was pas­siert, wenn wir statt­des­sen mit Gleit­kom­ma­zah­len arbei­ten? In Java gibt es hier­für zwei Daten­ty­pen, näm­lich float und das genaue­re dou­ble.

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 kom­men wir auch bei der Divi­si­on auf das erwar­te­te Ergeb­nis. Übri­gens ist das Dezi­mal­trenn­zei­chen in Java wie­der der Punkt.

Arbeiten mit Zeichenketten (Strings)

Zei­chen­ket­ten wer­den mit dem Daten­typ String beschrie­ben. Mit Ihnen kön­nen ganz unter­schied­li­che Mani­pu­la­tio­nen durch­ge­führt wer­den, von denen wir uns eini­ge anschau­en wol­len.

So kann die Län­ge des Strings mit length() bestimmt wer­den. Mit cha­rAt kann man fest­stel­len, wel­ches Zei­chen an einer bestimm­ten Stel­le zu fin­den ist. Hier wird wie­der ein­mal mit 0 begon­nen. Mit indexOf kann in einem String gesucht wer­den. Die­se Funk­ti­on nutzt man häu­fig, wenn man mit sub­string einen bestimm­ten Teil der Zei­chen­ket­te kopie­ren will.

Manch­mal möch­te man mit toUp­per einen String in Groß­buch­sta­ben umwan­deln und mit toLower in Klein­buch­sta­ben. Des Wei­te­ren kön­nen Teil­strings durch ande­re Teil­strings ersetzt wer­den, was sich mit replace rea­li­sie­ren 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ön­nen Wer­te vom glei­chen Typ, wie z.B. dou­ble, int oder String gespei­chert wer­den. Eine Mög­lich­keit, ein Array zu initia­li­sie­ren, ist das Ein­fü­gen in einer geschweif­ten Klam­mer. Danach kann man über das Anspre­chen des Array­ele­ments über eine ecki­ge Klam­mer auf die ein­zel­nen Wer­te zugrei­fen. Hier geschieht das über eine for-Schlei­fe, wie wir sie aus Java­script ken­nen.

Des Wei­te­ren haben wir hier eine Metho­de, also eine Funk­ti­on, vor­ge­se­hen, die die Wer­te der Arrays aus­ge­ben soll. Sie ist wie­der ein­mal vom Typ void, gibt also kei­nen Wert zurück. Ala Para­me­ter wer­den die Wer­te des Arrays bzw. das Array selbst über­ge­ben.

Ver­wun­dern könn­te die Tat­sa­che, dass die Funk­ti­on Aus­ga­be mehr­fach vor­han­den ist. In Java ist es mög­lich. Die Metho­den unter­schei­den sich hier aller­dings im Para­me­ter, einer­seits ist es ein int-Array und ande­rer­seits ein Array aus Strings. Bei der Aus­ga­be wird eine for-Schlei­fe durch­lau­fen bis das Ende des Arrays erreicht wird. Die lau­fen­de Num­mer und das Array­ele­ment selbst wer­den durch einen Tabu­la­tor \t getrennt.

Zum Sor­tie­ren der Arrays kann sort genutzt wer­den. Hier­zu muss dass Paket java.util.Arrays impor­tiert wer­den. Das Sor­tier­er­geb­nis unter­schei­det sich hier­bei je nach Art der zu sor­tie­ren­den Wer­te. Zah­len wer­den nach den Zah­len­wer­ten sor­tiert [2, 3, 5, 7, 11, 13] und String alpha­be­tisch [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 Aus­ga­be in Java-Pro­gram­men lässt sich beson­ders ein­fach über System.out.println rea­li­sie­ren. Für die Ein­ga­be von der Kon­so­le muss java.util.Scanner impor­tiert wer­den.

Das soll an einem Bei­spiel zur BMI-Berech­nung demons­triert wer­den. Hier­zu wer­den wir Varia­blen ver­schie­de­ner Daten­ty­pen ver­wen­den. Zunächst muss name vom Typ String ein­ge­ge­ben wer­den. Zuvor jedoch wur­de für die Ein­ga­ben gene­rell die varia­ble Scan­ner vom Typ Scan­ner dekla­riert. Der String kann jetzt mit Scanner.nextLine() Ein­gel­sen wer­den.

Die Mas­se m besitzt den Typ dou­ble und wird über Scanner.nextDouble() ein­ge­ge­ben. Ähn­lich ver­hältst es sich mit der Grö­ße l in cm, die als Ganz­zahl mit scanner.nextInt() ein­zu­ge­ben ist.

Für die Berech­nung des BMI-Werts steht die Funk­ti­on berech­ne zur Ver­fü­gung, die einen Wert vom Typ dou­ble zurück­gibt und die Para­me­ter m und l hat. Für die Berech­nung des BMI dient die For­mel $BMI = \frac{m}{l^2}$, wobei die Mas­se in Kilo­gramm und die Grö­ße in Metern anzu­ge­ben ist. Da wir die Grö­ße in Zen­ti­me­ter ein­le­sen, müs­sen wir noch durch 100·100 rech­nen.

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 wol­len an die­ser Stel­le einen Ein­stieg in die objekt­ori­en­tier­te Pro­gram­mie­rung (OOP) wagen. Das hört sich zuge­ge­be­ner­ma­ßen zunächst ein­mal sehr kom­pli­ziert an, ist es aber gar nicht.

Als Bei­spiel wol­len wir uns die an einer Schu­le han­deln­den Per­so­nen vor­neh­men, wozu ja bekann­ter­ma­ßen Schü­ler, Leh­rer, Sekre­tä­rin­nen, Haus­meis­ter usw. gehö­ren. Dazu wol­len wir eine Klas­se Per­son pro­gram­mie­ren. Eine Per­son hat bei uns die Eigen­schaf­ten Vor­na­me, Nach­na­me, Roll in der der Schu­le und einen Spruch.

Des Wei­te­ren haben wir die Metho­den print() und print­Spruch() vor­ge­se­hen. Mit­tels print() wer­den die wich­tigs­ten Daten der Per­son aus­ge­ge­ben und mit print­Spruch() ledig­lich das Zitat.

Klasse
Person
Eigenschaften (Instanzvariablen):
Vorname
Nachname
Rolle (z.B. Lehrer)
Spruch (ein Zitat)
Methoden:
print()
printSpruch()
Klas­sen­dia­gramm der Klas­se Per­son.

Der fol­gen­de Quell­text zeigt die Klas­se als Java-Code. Zunächst ein­mal wird die Klas­se in der 1. Zei­le defi­niert. Es fol­gen die Varia­blen­ver­ein­ba­run­gen für die Eigen­schaf­ten. Dies sol­len hier alle vom Typ String sein. Die Varia­ble Spruch wird auch gleich mit einem String initia­li­siert. Dabei han­delt es sich übri­gens um eine iri­sche Volks­weis­heit, die mir sehr sym­pa­thisch ist.

Die Metho­den sind bei­de vom Typ void, es wird also kei­ne Rück­ga­be erwar­tet. Die Varia­blen inner­halb einer Klas­se wer­den über das Schlüs­sel­wort this ange­spro­chen. So kann man mit this.geschlecht auf das Geschlecht der Per­son zugrei­fen.

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 wei­te­ren Klas­se Schu­le kön­nen wir dann mit der Klas­se Per­son arbei­ten. Dazu dekla­rie­ren wir zunächst eine Varia­ble vom Typ Per­son, die wir schlicht p nen­nen. Hier ist p ein Objekt der Klas­se per­son.

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