Kurzeinstieg Java: Erste Schritte

Aus Wikibooks
Zur Navigation springen Zur Suche springen
Duke (Java mascot) waving.svg

Erste Schritte[Bearbeiten]

Hier kommen wir direkt zu unserem ersten Programm. Wir werden ein Programm schreiben, das auf der Eingabeaufforderung (oder Konsole, wenn Sie Linux verwenden sowie Terminal unter Mac) eine Textmeldung ausgibt und sich danach einfach wieder beendet.

Die Eingabeaufforderung - auch als DOS-Fenster bekannt - erreichen Sie unter Windows indem Sie Start → Ausführen anwählen und dort cmd eingeben (8, 8.1). In Windows 8 und 8.1 drücken sie die Start-Taste um das Metro-Menü aufzurufen und geben einfach cmd ein und drücken Return bzw. wählen Sie das Programm cmd aus den Suchergebnissen aus.

Unter Linux können Sie über das Menü die Konsole auswählen oder mit ALT + Funktionstasten zu einer freien Konsole wechseln.

In Mac OSX (10.5-10.10) finden sie das Programm "Terminal.app" im Finder->Programme->Dienstprogramme.

Hello Java World![Bearbeiten]

Jetzt starten Sie bitte Ihren Editor oder Ihre IDE. Dort geben Sie das folgende Programm ein. Achten Sie dabei genau auf die Groß- und Kleinschreibung! Alternativ können Sie das Programm auch einfach aus dieser Webseite kopieren und in den Editor einfügen, so sind Sie ein paar Sekunden schneller und müssen sich nicht um die Groß-/Kleinschreibung kümmern.

Machen Sie sich jetzt noch keine Gedanken darüber, was die einzelnen Befehle zu bedeuten haben, die Erklärung folgt ein wenig weiter unten.

public class HelloWorld {
      public static void main(String[] args) {
          System.out.println("Hello Java World");
          System.exit(0);
      }
}

Speichern Sie das Programm jetzt in einem Verzeichnis Ihrer Wahl unter dem Namen HelloWorld.java. Beachten Sie bitte genau auch hier die Groß- und Kleinschreibung des Dateinamens und ändern Sie den Namen nicht. Es muss unbedingt der Name sein, den Sie in der Programmzeile public class HelloWorld verwendet haben, ergänzt um die Dateinamensendung .java.

Gehen Sie jetzt in der Eingabeaufforderung in dieses Verzeichnis und übersetzen Sie das Programm mit folgendem Befehl:

javac HelloWorld.java

Ein möglicher Fehler ist error: cannot read: HelloWorld.java. Schreiben Sie dann einfach den Pfad davor (~/meineJavaProgramme/HelloWord.java unter MacOS und Linux, C:\Pfad\HelloWorld.java unter Windows). Ein kurzer Pfad ist empfehlenswert. Wenn die Übersetzung fehlerfrei durchgelaufen ist, können Sie das Programm mit der folgenden Eingabe ausführen:

java HelloWorld

Fallen Ihnen zwei kleine, aber wichtige Unterschiede bei den beiden Befehlen auf? Richtig:

  1. Im ersten Fall (zum Compilieren) wird das Programm javac (mit einem 'c' am Ende) verwendet. Im zweiten Fall (zum Ausführen) aber das Programm java (ohne 'c' am Ende).
  2. Beim Compilieren mit javac mussten Sie die Dateinamensendung .java mitangeben. Bei der Programmausführung mit java dürfen Sie diese Endung nicht mitangeben.

Falls eine Fehlermeldung wie

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld

auftritt, müssen Sie nachschauen, ob der aktuelle Pfad auch im CLASSPATH enthalten ist. Ebenso sollten Sie genau prüfen, ob Sie der Java-Datei wie oben beschrieben den richtigen Namen gegeben haben, und ob Sie versehentlich die Endung des Dateinamens beim Aufruf von java angegeben haben.

Wenn das Programm fehlerfrei durchgelaufen ist, dann müsste auf der Konsole der folgende Text erscheinen:

Hello Java World

Hello Java![Bearbeiten]

An dieser Stelle haben Sie bereits Ihr erstes Java-Programm geschrieben und wollen nun wissen, was denn nun diese einzelnen Befehle und kryptischen Zeichen bedeuten.

Hier ist nochmals das Quelltext unseres Hello-World-Programms:

1 public class HelloWorld {
2     public static void main(String[] args) {
3         System.out.println("Hello Java World");
4         System.exit(0);
5     }
6 }

Wir haben die Zeilen durchnummeriert, um so die Bestandteile des Programms besser erklären zu können.

In der ersten Zeile definieren wir die Klasse HelloWorld. Dabei ist zu beachten, dass die Klasse wie der Dateiname heißen muss, also in unserem Beispiel muss die Datei "HelloWorld.java" heißen. Jeder kann auf unsere Klasse zugreifen, deshalb ist sie auch public. Man kann die Rechte von Klassen auch einschränken, aber dazu kommen wir später.

In Zeile zwei wird die main()-Methode definiert. Diese finden Sie bei jeder Java-Anwendung (Applikationen), nicht jedoch bei Applets, Servlets oder Midlets. Diese ist sozusagen das Herz jeder Java-Anwendung. Von dieser Methode ausgehend können Sie sich die komplette Funktionsweise eines Programms erschließen.

In der Zeile 3 geben wir unsere Meldung, bei uns "Hello Java World", aus, was nicht allzu viel zu sagen hat, aber der Zweck unseres Programms ist. Nebenbei bemerkt ist es ein kultureller Aspekt, in einem Buch zur Programmierung ein "Hello World"-Programm zu zeigen. Man ehrt damit die Erfinder der Sprache C, Brian Kernighan und Dennis Ritchie. Sie finden in fast jedem Buch zu Programmiersprachen ein solches "Hello-World"-Programm.

Die vierte Zeile heißt, dass wir die Anwendung beenden wollen und zwar mit einem Rückgabewert von 0. Dies beendet auch gleichzeitig die Java Virtual Machine (JVM), sodass wir wieder auf der Eingabeaufforderung landen. Auch hierbei gilt, dass nur Java-Anwendungen mit diesem Befehl beendet werden. In der Eingabeaufforderung kann man diesen Wert auch auswerten, so dass man z.B. ein Java-Programm schreiben kann, das durch verschiedene Rückgabewerte den Ablauf eines Batch-Programmes oder Shellskripts steuern kann.

Pakete[Bearbeiten]

Java-Klassen und auch Schnittstellen (Interface) können und werden in so genannte Pakete (Packages) gruppiert. Ein Paket ist dabei einfach eine Sammlung von Klassen. Pakete werden in den geläufigen Betriebssystemen in Form von Verzeichnissen abgebildet. Klassen und Schnittstellen, welche in einem Paket liegen, beginnen dabei mit der package-Anweisung, gefolgt von den Paketnamen und dem Semikolon. Zum Beispiel:

 package org.wikibooks.de.java;

Üblicherweise gruppiert man thematisch verwandte Klassen in einem Paket.

Oft ist der Domainname des Autors Teil des Paketnamens, so dass ein Programmierer schnell die Herkunft des Pakets ermitteln und auf der zugehörigen Webseite weitere Informationen zu dem Paket finden kann. Hierbei wird zudem eine Eindeutigkeit der Pakete und somit der Java Klassen / Schnittstellen erreicht. Beispiel: org.apache.log4j → www.apache.org

Ob man in seine eigenen Quelltexte eine packacke-Anweisung schreibt oder nicht ist abhängig vom Umfang seines Programmes. Schreibt man keine package-Anweisung hinein, dann gehören automatisch alle Klassen zu einem gemeinsamen Paket. Arbeitet man mit anderen Paketen von Drittherstellern, dann kann es zu Namenskollisionen kommen. Hat man beispielsweise eine Klasse Auto geschrieben und importiert nun von einem Hersteller eine Klasse Auto, dann kommt es zu Konflikten. Gruppiert man seine Klassen in Paketen, dann ist immer klar, welche Auto-Klasse gemeint ist. Ein Paket stellt also einen eigenen Namensraum dar.

Klassenbibliothek[Bearbeiten]

Java enthält eine sehr umfangreiche Klassenbibliothek. Es ist dringend zu empfehlen, bei der Installation des SDK auch die zugehörige Klassenbibliotheksdokumentation (API Documentation) herunterzuladen und lokal zu installieren, bzw. in die IDE zu integrieren.

Die beim SDK Standard Edition mitgelieferte Klassenbibliothek ist in Pakete (packages) eingeteilt. Es lohnt sich, sich im Laufe der Zeit zumindest einen Überblick über die vorhandenen Pakete und deren grundsätzliche Bedeutung zu verschaffen. Einige Pakete werden bei jeder Art von Java-Programmierung so häufig gebraucht, dass deren Inhalt früher oder später in Fleisch und Blut übergehen sollte.

Dabei ist es ist nicht unbedingt notwendig, jeden einzelnen Methodenparameter auswendig zu lernen (Ausnahme: Einige gerade im US-amerikanischen Raum beliebte Programmierer-Zertifizierungen fragen solches "Wissen" in ihren Zertifizierungstests ab). Methodenparameter kann man immer schnell in der API-Dokumentation nachschlagen, oder sie werden von modernen IDEs sogar direkt angezeigt. Eine grundsätzliche Vorstellung davon, was wo und wofür in der Klassenbibliothek zu finden ist, sollte man allerdings schon haben, um zügig arbeiten zu können und halbwegs effiziente Programme zu schreiben.

Zu Anfang lohnt es sich einen Blick auf die Dokumentation der Klassen in den folgenden Paketen zu werfen:

  • java.lang, Basis-Klassen wie Object. Quasi das Rückgrat der Sprache (lang meint Language, auf Deutsch also Sprache),
  • java.io, Einfache Ein- und Ausgabeklassen für Text- und Binärdaten, Dateizugriffe und Kodierung und Enkodierung von Daten,
  • java.util, sehr nützliche Hilfsklassen. Insbesondere finden sich hier die sog. Collection classes. Dies ist eine Sammlung von Klassen, die gängige Datenstrukturen zur Verknüpfung von Objekten bereitstellen. Dank dieser Klassen ist es für einen Java-Programmierer in den allermeisten Fällen unnötig z.B. selber Listen, Mengen oder eine Hashtable zu implementieren.

Je nach dem, welche Art von Programmen man entwickeln möchte, sollte ein Blick in folgende Pakete folgen:

  • java.net, Basisklassen für Netzwerkkommunikation,
  • java.awt und javax.swing, Klassen zur Programmierung grafischer Benutzeroberflächen

Der Aufbau von Java-Quelltexten[Bearbeiten]

Java Quelltexte bestehen aus höchstens einer package-Anweisung. Es folgen einige Klassen, den Aufbau von Klassen besprechen wir in einem späteren Kapitel. Jede Klasse besteht aus einer optionalen Menge von Konstanten und Variablen sowie Methoden. Die Buchteile "Grundlagen" und "Objektorientierung" beschäftigen sich mit dem Aufbau von Java-Programmen. Spätere Kapitel beschreiben weniger die Syntax und Semantik von Java, dafür zeigen sie, wie etwas gemacht wird.

Bezeichner[Bearbeiten]

Bezeichner sind alle Worte, die einer Klasse, Methode, Variablen oder Konstanten und so fort einen Namen geben. Hierbei haben sich einige Regeln eingebürgert, die im Rahmen der Java-Coding-Standards definiert sind. Weitere Hinweise dazu im Kapitel Programmierstil. Grundsätzlich dürfen Sie alle Zeichen verwenden. Bezeichner dürfen nur mit Buchstaben, "$" und dem Unterstrich "_" beginnen. Buchstaben dürfen aus der Menge aller Unicode-Letter gebildet werden. Anschließend dürfen Buchstaben, Ziffern, "$" und "_" folgen. Bezeichner dürfen keine reservierten Schlüsselwörter sein. Tiefergehende Details dazu finden Sie unter http://docs.oracle.com/cd/E19798-01/821-1841/bnbuk/index.html.

Um bei der Menge an Regeln zu überprüfen, ob ein Wort ein Java-Bezeichner ist, kann man beispielsweise folgendes Programm benutzen. Das Programm ist für den Einstieg schon sehr lang und benutzt viele Sprachelemente, die erst in späteren Kapiteln besprochen werden. Auf der Kommandozeile können Worte übergeben werden, diese Worte werden dann getestet. Für das erste Zeichen des Wortes gibt es die statische Methode (wir kommen später darauf zu sprechen…) java.lang.Character.isJavaIdentifierStart() und für jedes weitere Zeichen java.lang.Character.isJavaIdentifierPart(). Beide Methoden werden mit einem Zeichen als Argument aufgerufen.

// Das folgende Programm überprüft, ob ein Bezeichner nach den Java-Regeln aufgebaut ist.
class Bezeichner {

  public static void main(String[] args) {

    if(args.length < 1) {
      System.out.println("Aufruf: java Bezeichner \"irgend ein Bezeichner\"");
    }

    boolean istGültigerBezeichner;              // Variable vom Typ boolean

    for(String arg : args) {                    // über alle Elemente im args-Array iterieren
      System.out.println("Teste " + arg);       // Ausgabe
      char[] zeichenArray = arg.toCharArray();  // Aufruf der String-Methode: String in Char-Array umwandeln


      // Teste das erste Zeichen als erlaubtes Anfangszeichen
      istGültigerBezeichner = java.lang.Character.isJavaIdentifierStart(zeichenArray[0]);

      // Teste alle folgenden Zeichen
      for(int i = 1; i < zeichenArray.length; i++) {    // Über alle Zeichen im zeichenArray iterieren
          istGültigerBezeichner &= java.lang.Character.isJavaIdentifierPart(zeichenArray[i]);
      }

      System.out.println("Ergebnis: " + arg + (istGültigerBezeichner ? " ist ein" : " ist kein") + " gültiger Bezeichner." );
    }
  } // Ende von main
}

Der Parameter args der Methode main() ist eine Aneinanderreihung von Parametern, die auf der Kommandozeile übergeben werden. An den eckigen Klammern [] erkennt man, dass es sich um ein so genanntes Feld (engl. Array) handelt. Wenn keine Kommandozeilenparameter angegben werden, dann ist args.length Null. In diesem Fall wird mit System.out.println() erklärender Text ausgegeben. Die erste for iteriert über alle Kommandozeilenparameter, die Zweite über alle Zeichen eines Wortes. Ob das betreffende Wort ein gültiger Java-Bezeichner ist, wird in der Variablen istGültigerBezeichner festgehalten. Dabei ist istGültigerBezeichner true, wenn jede Prüfung eines Zeichens im Wort true ergibt. Dafür sorgt der Operator &=.

Variablen[Bearbeiten]

Variablen sind benannte Speicherorte. Variablen haben in Java grundsätzlich einen Typ, der vom Programmierer festgelegt wird. Die Gültigkeit einer Variable hängt davon ab, wo sie deklariert wurde. Variablen, die in Klassen außerhalb von Methoden deklariert wurden sind allen Methoden der Klasse bekannt. Variablen, die innerhalb von Methoden deklariert wurden, sind innerhalb der Methode bekannt. Methodenparameter sind in der gesamten Methode bekannt. Innerhalb eines Gültigkeitsbereiches darf es keine zwei Variablen mit demselben Namen geben. Als Merkregel reicht zumeist aus: "Die Gültigkeit einer Variablen reicht von "{" bis "}" der gleichen Tiefe.". Auf Besonderheiten weisen wir an passender Stelle hin.

Probieren Sie es aus:

public class Testklasse {

  public static void main(String[] args) {

    int v = 33;
  
    {     // neuer Block
        int v = 99;
        System.out.println(v);
    }
    System.out.println(v);
  }  
     
}

Hier wird die Variable "v" in einem neuen Block, bestehend aus einem geschweiften Klammerpaar, neu deklariert. Ist das erlaubt? Finden Sie es heraus.