Mein erstes Programm

Im vorherigen Kapitel haben wir gesehen, wie wir ein neues Java Projekt anlegen, wie wir Quelltext verwalten und wie wir aus Quelltext Bytecode erstellen und diesen dann ausführen.

In diesem Kapitel soll es nun mehr um den Quelltext gehen, den wir im letzten Kapitel verwendet haben. Wir werden erfahren, was genau er bedeutet.

 Java/tutorial/helloworld/HelloWorld.java
package tutorial.helloworld;
 
class HelloWorld
{
  public static void main(String[] args)
  {
    System.out.println("Hello World!");
  }
}

Aufbau innerhalb der Datei

Befassen wir uns zunächst mit dem Aufbau innerhalb des Quelltextes.

package tutorial.helloworld;

Diese Zeile hat etwas mit den in Java üblichen Packages zu tun. Das verrät uns schon das Schlüsselwort „package“. Erinnern wir uns, in welchem Ordner unsere Datei mit dem Quelltext liegt:

 tutorial/helloworld/

(Wie immer ausgehend von unserem Arbeitsverzeichnis)

Nun sind Ordner im Dateisystem für Java nichts anderes als Packages. Allerdings brauchen wir eine Einschränkung, denn solche Pfadangaben sind nicht eindeutig. Das bedeutet, unsere Datei liegt auch unter z.B. Java/tutorial/helloworld, und evtl auch unter Desktop/Java/tutorial/helloworld. Außerdem liegt die Datei natürlich auch unter helloworld/.

Der Angabe, in welchem Package eine Datei liegt, soll allerdings eindeutig sein. Deshalb müssen wir noch eine zusätzliche Information bereitstellen. Genau das tut diese erste Zeile unseres Quelltextes. Mit dieser Angabe legen wir eindeutig fest, dass der Quelltext, der folgt, zu dem Package „tutorial.helloworld“ gehört. Damit legen wir auch unser Arbeitsverzeichnis fest. Denn nur, wenn wir uns im Ordner „Java“ befinden, finden wir unsere Datei auch unter „tutorial/helloworld/“.

Damit hätten wir die erste Zeile komplett betrachtet … Wirklich komplett? Dem aufmerksamen Leser fällt vielleicht auf, wie die Zeile abgeschlossen wird. Das letzte Zeichen ist ein „;“ (Semikolon, oder auch Strichpunkt genannt). Dazu gleich mehr!

Dieser Zeile, die ja eigentlich noch nicht wirklich etwas damit zu tun hat, was unser Programm tut, sondern eher dazu dient, Ordnung in unserem Code zu erhalten, folgt nun der eigentliche Programmcode.

Halten wir also fest: Im Quelltext finden wir zusätzlich zu unserem Code auch noch „Anweisungen“, die uns helfen, unseren Code zu verwalten, allerdings ist das nicht zwingend notwendig. Außer package gibt es noch weitere Schlüsselwörter, die wir hier finden können. Damit werden wir uns aber erst in späteren Kapiteln beschäftigen.

Struktur des Codes

Bevor wir uns genauer damit beschäftigen, welche Schlüsselwörter verwendet werden und was sie im Einzelnen bedeuten, sollten wir uns die Strukturierung einmal gut ansehen. Auffallend sind die geschweiften Klammern. Mit ihrer Hilfe markieren wir zusammenhängende Bereich im Code:

ETWAS
{
  Das hier gehört zu "ETWAS"
  MEHR
  {
    Das hier gehört zu "MEHR", aber auch zu "ETWAS"
  }
}

Ein solcher Block besteht immer aus den folgenden Elementen:

  • Eine Charakterisierung, welche Bedeutung der folgende Block hat, und eventuell auch einen Namen, den wir dem Block geben wollen. Allerdings bedeutet das nicht, dass zwingend etwas vor dem Block stehen muss, denn nichts ist auch eine Charakterisierung.
  • Die öffnende geschweifte Klammer „{“. Mit ihr markieren wir den Beginn des folgenden Blockes.
  • Der Inhalt. Wir können hier auch weitere „Unterblöcke“ vorfinden.
  • Die schließende geschweifte Klammer „}“. Mit ihr markieren wir das Ende unseres Blockes.

Diese Struktur wird uns ab nun an ständig begleiten. Mit ihrer Hilfe können wir Inhalt zusammenfassen und ihn „in Form“ bringen. Das ist ein grundlegendes Konzept der Programmierung und auch der Informatik (inFormat - ik).

Objektorientierung?

Was ist das denn nun?
Kurz: Es ist das grundlegende Konzept hinter der Programmiersprache Java und lässt sich in etwa so verstehen:

 Alles ist ein "Ding"

Überlegen wir uns, was unser Programm eigentlich ist. Im Grunde genommen ist es doch auch nichts anderes, als ein „Ding“. Man kann es nicht anfassen, soviel steht fest, aber dennoch ist es ein (virtuelles) „Ding“. Es hat gewisse Eigenschaften und es tut Gewisses. Es ist „etwas“. Wenn wir uns etwas fachlicher ausdrücken wollen, dann sprechen wir anstatt von Dingen eher von Objekten.

Aber was ist ein Objekt? Stellen wir uns ein paar Autos vor. Es gibt grüne, rote, blaue Autos. Es gibt große, es gibt kleine Autos. Aber egal ob groß, klein, grün oder rot: Es ist trotzdem ein Auto. Wir klassifizieren bestimmte Objekte (z.B. das „rote Auto“ oder das „große Auto“) und fassen sie anhand ihrer Eigenschaften (Ein Auto hat eine Frabe, ein Auto hat außerdem auch eine Größe) und der Fähigkeiten (Ein Auto kann beschleunigen und auch bremsen) zu Klassen zusammen, denen wir dann Namen wie „Auto“ geben.

Die Klasse definiert, welche Eigenschaften ein Objekt haben muss und wozu es fähig sein muss. Wenn ein Objekt zu einer Klasse gehört, dann nennt man es Instanz der Klasse.

Genau das passiert auch beim Programmieren. Wenn wir uns den Code noch einmal ansehen, dann fällt uns als nächstes das Schlüsselwort class auf. Es steht, zusammen mit einem Namen „HelloWorld“ vor einer öffnenden geschweiften Klammer, also vor einem Block. Alles, was innerhalb dieses Blockes steht, gehört also zur Klasse mit dem Namen „HelloWorld“.

Unser Programm, das uns im vorherigen Kapitel den Text ausgegeben hat, ist nichts anderes als eine Instanz dieser Klasse. Es definiert sich selbst dadurch, was es kann, nämlich den Text „Hello World!“ auszugeben.

Bisher können wir also das folgende Konstrukt verstehen:

class HelloWorld
{
 
}

Das ist eine Deklaration (also eine Benennung, wir sagen, dass es eine Klasse gibt, die den Namen „HelloWorld“ trägt, dazu reicht die erste Zeile alleine) und auch gleichzeitig eine Definition der Klasse. Bei einer Definition sagen wir genau, was die Klasse „kann“ und welche Eigenschaften sie hat. Diese Information packen wir in den Block, der zur Deklaration unserer Klasse gehört, also gleich hinter „{“. Wir fassen diese Informationen also als Klasse mit einem bestimmten Namen zusammen.

Eigenschaften einer Klasse nennt man Attribute, die Fähigkeiten bezeichnen wir als Methoden.

Der Code

Wir verstehen nun, wie unser Programm aufgebaut ist und als was wir es zu betrachten haben. Aber wir wissen immer noch nicht, woher der Text kommt, den unser Programm ausgibt. Das wird sich nun ändern!

  public static void main(String[] args)

Das ist die nächste Zeile, die wir uns ansehen wollen. Hier haben wir wieder eine Deklaration, wir vergeben wieder einen Namen. Der Block, der dieser Zeile folgt ist uns ab sofort als „main“ innerhalb der Klasse „HelloWorld“ bekannt. Aber wir geben diesem Block nicht nur einen Namen. Das, was wir hier in dieser Zeile vor uns haben, ist die Deklaration einer Methode, der Methode „main“.

Woran erkennen wir, dass es sich hierbei um die Deklaration einer Methode handelt? Allgemein sieht jede Deklaration einer Methode folgendermaßen aus:

<EIGENSCHAFTEN> DATENTYP NAME (PARAMETER)

Fangen wir beim einfachsten an: Beim Namen. Mit ihm bezeichnen wir unsere Methode, und über diesen Namen haben wir auch Zugriff auf die Fähigkeiten, die uns diese Methode bietet. Der Name muss eindeutig im Geltungsbereich sein. Konkret bedeutet das, dass nichts den gleichen Namen trägt, was sich im selben Block befindet. Java unterscheidet zwischen Groß- und Kleinbuchstaben, ein Name darf außerdem nur die folgenden Zeichen enthalten:

  • A - Z (Alle Großbuchstaben)
  • a - z (Alle Kleinbuchstaben)
  • _ (Unterstriche)
  • 0 - 9 (Alle Ziffern, allerdings nicht als erstes Zeichen)

Vor dem Namen muss die Angabe eines Datentyps stehen. Jede Methode gibt einen Wert, eine Zahl, zurück. Mit dem Datentyp bestimmen wir, wie dieser Wert zu verstehen ist. Er beschreibt, welche Art von Daten die Methode zurückgeben möchte. Vorerst ist für uns nur wichtig, dass eine Methode einen Rückgabe-Datentyp braucht. Wozu und was wir mit dieser Rückgabe anstellen können, das werden wir später noch genauer unter die Lupe nehmen.

void

Bei unserer Methode heißt das, dass wir nichts zurückgeben. Auch das muss der Computer wissen, sonst versucht er noch, irgendwelchen Werten eine Bedeutung zuzuweisen, obwohl wir das gar nicht möchten!

Außer der Angabe des Datentyps und des Namens ist für die Deklaration einer Methode noch die Angabe der Parameter vorgeschrieben.

TODO