Logo Wissenstransfer Gerhard at CichnaDotCom

>> Wissensdatenbank / Objektorientiertes Programmieren

Programmieren von Klassen in Java

Einführung in die Programmiersprache Java

Ganz grundsätzlich werden bei der Programmierung (auch: Implementierung) drei verschiedene Aktivitäten durchgeführt:

  1. Programmieren, d.h. Produzieren von Programmcode (auch: Quellcode, Sourcecode, Quelltext, Programmtext),
  2. Kompilieren, d.h. automatisches Übersetzen des produzierten Programmcodes in eine Form, die von einem Rechner ausgeführt werden kann, sowie
  3. Ausführen des Programms, d.h. Starten und Ausführen des erzeugten und kompilierten Programmcodes, um zu sehen, ob sich das System wie erwartet verhält.

Kann das Schreiben des Programmcodes noch mithilfe eines ganz einfachen Texteditors geschehen, so wird spätestens beim Kompilieren eine Software benötigt, die den vom Entwickler geschriebenen Programmtext in ausführbaren Maschinencode übersetzt (auch: kompiliert). Diese Übersetzungssoftware heißt "Compiler". Es gibt Compiler für jede Progammiersprache. Nachdem der Programmtext durch den Compiler kompiliert wurde, kann er in einer Ausführungsumgebung (auch: Runtime) gestartet und ausgeführt werden. Für viele Programmiersprachen stellt das Betriebssystem eines PCs (z.B. Windows, Linux, MacOS) die Ausführungsumgebung bereit. Da sich die Funktionen und Eigenschaften von Betriebssystemen unterscheiden, müssen Programme für jedes Betriebssystem neu programmiert beziehungsweise kompiliert werden.

Die Abbildung zeigt exemplarisch alle benötigten Elemente für die Entwicklung mit der Programmiersprache C:
Entwicklung mit C

Bei der Programmiersprache Java handelt es sich um eine plattform-unabhängige Programmiersprache. Ein in Java geschriebenes Programm muss nicht für jedes Betriebssystem neu angepasst werden. Von anderen Programmiersprachen unterscheidet sich Java dadurch, dass auf den Geräten, auf denen ein Java-Programm ausgeführt werden soll, vorher eine "Java-Laufzeitumgebung" (auch: Java Runtime Environment, kurz: JRE) installiert werden muss. Der Java-Compiler übersetzt den programmierten Quelltext in einen sogenannten "Bytecode". Dieser Bytecode wird dann von der Java-Laufzeitumgebung geladen, gestartet und ausgeführt. Weil für nahezu jedes Betriebssystem eine entsprechende Java-Laufzeitumgebung verfügbar ist, kann ein Java-Programm sowohl auf einem Linux-, Windows- oder Mac-Rechner ausgeführt werden.
Entwicklung mit Java

Um als Nutzer ein Java-Programm ausführen zu können, wird die Java-Runtime (JRE) benötigt. Die Java-Runtime besteht aus der Java Virtual Machine (kurz: JVM) und der Java-Klassenbibliothek. Die JVM ist die Software, die den Bytecode interpretiert sowie im eingesetzten Betriebssystem startet und ausführt. Die Java-Klassenbibliothek stellt bereits in der Programmiersprache Java vorhandene Funktionen zur Verfügung, sodass häufig eingesetzte Datenstrukturen (z.B. Listen oder Zeichenketten) vom Programmierer zwar wiederverwendet werden können, jedoch nicht jedes Mal neu implementiert werden müssen.

Um als Software-Entwickler in der Programmiersprache Java Software zu entwickeln, wird ein Java Software Development Kit (kurz: Java SDK) benötigt. Das Java SDK besteht aus einem Java-Compiler, einer Java Virtual Machine, der Java-Klassenbibliothek sowie weiteren Hilfsprogrammen.

Für die Entwicklung werden sogenannte Entwicklungsumgebungen (auch: Integrated Development Environment, kurz: IDE) eingesetzt, beispielsweise Eclipse, IntelliJ oder NetBeans.

Grundelemente einer Klasse in Java

Eine Klasse in der Programmiersprache Java hat einen eindeutigen Namen und kann Attribute und Methoden enthalten. Der Programmcode einer Klasse wird in Java in einer Textdatei mit der Dateiendung *.java gespeichert. Für jede Klasse wird eine eigene Datei angelegt. Der Java-Compiler legt für jede Klasse eine Datei mit der Endung *.class an, in welcher der kompilierte Bytecode einer Klasse gespeichert wird.

Die untenstehende Abbildung zeigt das Grundgerüst der Java-Klasse "Kunde" ohne Attribute. Um eine Klasse zu erstellen, werden mindestens die folgenden vier dargestellten Elemente benötigt: der Sichtbarkeitsmodifikator, das Schlüsselwort class, der Name der Klasse und ein Paar geschweifte Klammern.
Gerüst der Klasse 'Kunde'

Überblick über die Elemente des Grundgerüsts:

Element einer Klasse Beschreibung Beispiel
Sichtbarkeitsmodifikator Legt die Sichtbarkeit der Klasse für andere Klassen fest. public
Schlüsselwort für die
Klassendeklaration
Zeigt dem Java-Compiler an, dass im Folgenden eine Java-Klasse
programmiert ist.
class
Klassenname Legt den Namen für die Klasse in Java fest und wird als
Dateiname verwendet. Die Klasse "Kunde" wird in einer Textdatei
"Kunde.java" programmiert.
Kunde
Geschweifte Klammern Markieren den Inhalt einer Klasse (Attribute und Methoden); alles
was innerhalb der Klammern steht, gehört zu einer Klasse.
{ ... }

Für den Namen der Klasse müssen dabei folgende Vorgaben eingehalten werden:

Attribute in Java

Ein Attribut in Java wird mindestens mit folgenden Elementen beschrieben: dem Sichtbarkeitsmodifikator, dem Datentyp und dem Attributnamen. Der in der folgenden Abbildung verwendete Datentyp String wird für Zeichenketten verwendet.
Klasse 'Kunde' mit Attributen

Darüber hinaus können bereits bei der Programmierung Werte für Attribute festgelegt werden (auch: Defaultwerte). Folgendes Beispiel zeigt zwei Attribute für die im Quellcode jeweils ein Defaultwert festgelegt wurde:
private boolean istPremiumKunde = false;
private int anzahlDerEinkaeufe = 0;

Element eines Attributs Beschreibung Beispiel
Sichtbarkeitsmodifikator Legt die Sichtbarkeit des Attributs für andere Klassen fest. private
Datentyp des Attributs Legt den Datentyp des Attributs fest und bestimmt damit Anzahl und
Art der Werte, die in dem Attribut gespeichert werden können.
Ein Datentyp ist entweder ein primitiver Datentyp oder eine Klasse,
ein sogenannter Referenzdatentyp (z.B. String oder Kunde).
String
Kunde
Attributname Legt den Namen für das Attribut der Klasse fest; jeder Name darf
innerhalb einer Klasse nur 1x vergeben werden.
name
vorname
geschlecht
Defaultwert Legt den initialen Wert des Attributs fest; dieser Wert wird dem
Attribut bei der Erzeugung eines Objekts der Klasse zugewiesen.
= 0
= 1
= false
Semikolon Markiert das Ende der Attributdeklaration. ;

Für den Namen eines Attributs einer Klasse müssen folgende Vorgaben eingehalten werden:

Methoden in Java

Mit den Attributen von Klassen können bereits Daten in Form von Attributwerten in Objekten gespeichert werden. Als nächstes sollen nun Methoden implementiert werden, die als dynamische Elemente von Klassen die Werte von Attributen erstellen, berechnen, verändern und löschen können.

Der Zugriff auf Attribute eines Objekts durch andere Objekte erfolgt nur über Methoden, aber niemals über einen direkten Zugriff auf Attribute einer anderen Klasse (Prinzip der Datenkapselung). Daher werden Methoden auch benötigt, um Werte von Attributen auszulesen und sie anderen Klassen zur Verfügung zu stellen.

Klasse 'Kunde' mit Attributen und Methoden

Grundelemente einer Methode in Java:

Element einer Methode Beschreibung Beispiel
Sichtbarkeitsmodifikator Legt die Sichtbarkeit der Methode für andere Klassen fest. public
Rückgabe-Datentyp der
Methode
Angabe des Datentyps des Objektes, in dem das Ergebnis der Methode
nach Abarbeitung des Methodenrumpfes ausgegeben wird. Dabei werden ein
primitiver Datentyp oder eine Klasse angegeben. Für den Fall, dass
die Methode kein Ergebnis ausgibt, wird void als Rückgabe-Datentyp
festgelegt.
String
Kunde
void
Methodenname Legt den Namen für die Methode fest; ein Methodenname darf
innerhalb einer Klasse nur dann mehrfach vergeben werden, wenn sich
Anzahl bzw. Datentyp der Parameter unterscheiden.
getName()
getVorname()
Parameterliste Liste benötigter Objekte und deren Datentypen, die zur Abarbeitung
der Methode erforderlich sind; werden keine Parameter angegeben, bleibt
die Liste leer.
(Date geburtsdatum)
(String name, String vorname)
(Integer zahl1, Integer zahl2)
()
Methodenrumpf Enthält die konkreten Anweisungen, was beim Aufruf der Methode
in welcher Reihenfolge getan wird.
Jede Anweisung wird mit einem Semikolon ";" beendet, daher ist in
Methodenrümpfen das ";" oft das letzte Zeichen einer Programm-
zeile. Die Anweisungen innerhalb eines Methodenrumpfes werden der
Reihe nach von oben nach unten abgearbeitet. Wird für die Methode
ein Rückgabe-Datentyp angegeben, beginnt die letzte Anweisung des
Methodenrumpfes mit dem Schlüsselwort return.
ergebnis = zahl1 + zahl2;
return name;

Für den Namen der Methode müssen folgende Vorgaben eingehalten werden:

Ein weiteres Konzept für Methoden in Java ist die Signatur. Anhand ihrer Signatur können Methoden eindeutig identifiziert werden. Die Signatur einer Methode besteht aus dem Namen der Methode und der Parameterliste. Der Rückgabe-Datentyp ist nicht Teil der Signatur. Jede Signatur darf innerhalb einer Klasse nur einmal vorkommen, denn nur so kann die JRE zur Laufzeit des Programmes feststellen, welche Methode aufgerufen und abgearbeitet werden soll. Anders ausgedrückt: Der Name der Methode kann innerhalb einer Klasse mehrfach vergeben werden, solange die Parameterliste sich unterscheidet.

Codebeispiel 1: Hier unterscheiden sich die Namen und damit auch die Signaturen:
public void anmelden() { ... }
public void abmelden() { ... }

Codebeispiel 2: Hier unterscheiden sich die Parameterlisten und damit auch die Signaturen:
public int zumWarenkorbHinzufuegen(Artikel artikel) { ... }
public int zumWarenkorbHinzufuegen(Artikel artikel, int anzahl) { ... }

Codebeispiel 3: Hier unterscheiden sich nur die Rückgabe-Datentypen, jedoch weder die Methodennamen noch die Parameterlisten. Damit sind die Signaturen identisch:
public boolean bezahlen(boolean pruefung) { ... }
public void bezahlen(boolean pruefung) { ... }

Um auf Attribute einer Klasse zuzugreifen, können beliebige Methodennamen vergeben werden. Ganz grundsätzlich sollten die Namen jedoch so gewählt werden, dass leicht zu erkennen ist, was die Methode tatsächlich tut. Für das Schreiben und Auslesen von Attributen werden sogenannte Getter- und Setter-Methoden eingesetzt. Eine Getter-Methode ("get" = "holen") liefert den Wert eines Attributs zurück. Eine Setter-Methode ("set" = "setzen") ändert den Wert eines Attributs auf den Wert, der als Parameter der Setter-Methode übergeben wird.
Hinweis: Die Getter-Methoden für Attribute vom Typ boolean beginnen statt mit "get" mit "is".

Wird der Parameter einer Setter-Methode genauso benannt wie das private Attribut der Klasse, dient das Schlüsselwort this dazu, die beiden unterscheiden zu können. Mit this kann auf das Objekt selbst und damit auf das Klassenattribut Bezug genommen werden (z.B. this.name).

Klasse mit Getter- und Setter-Methoden:
Klasse 'Kunde' mit Getter- und Setter-Methoden

Methoden können aus anderen Methodenrümpfen derselben Klasse heraus oder aus Methodenrümpfen einer anderen Klasse aufgerufen werden. Der Aufruf einer Methode erfolgt durch den Namen.

Codebeispiel 1: Aufruf der Methode getName() innerhalb der Klasse "Kunde":
String id1 = getName();

Codebeispiel 2: Aufruf der Methode setName() innerhalb der Klasse "Kunde":
setName("Lange");

Codebeispiel 3: Aufruf der Methode getName() der Klasse "Kunde" aus einer anderen Klasse heraus:
String id2 = kunde1.getName();
Das Objekt, das die Methode getName() in Kunde aufrufen will, hat ein Objekt der Klasse "Kunde" unter dem Variablennamen kunde1 gespeichert. Mit dem Aufruf kunde1.getName() kann gezielt die Methode getName() in dem Objekt kunde1 aufgerufen werden. Der Wert von kunde1.getName() wird in der aufrufenden Klasse in der Variable id2 gespeichert.

Codebeispiel 4: Aufruf der Methode setName() der Klasse "Kunde" aus einer anderen Klasse heraus:
kunde1.setName("Lange");
Das Objekt, das die Methode setName() in Kunde aufrufen will, hat ein Objekt der Klasse "Kunde" unter dem Variablennamen kunde1 gespeichert. Mit dem Aufruf kunde1.setName("Lange") kann gezielt die Methode setName(String name) in dem Objekt kunde1 aufgerufen werden. Über diesen Methodenaufruf kann aus einem anderen Objekt heraus der Wert "Lange" als Attribut in das Objekt kunde1 gespeichert werden.

Gibt es in einer Klasse Methoden mit selbem Namen, so spricht man vom Überladen von Methoden. Mit dem Überladen, also dem mehrfachen Zurverfügungstellen einer Methode mit identischem Namen, erhält man als Entwickler die Möglichkeit unterschiedliches Methodenverhalten in Abhängigkeit von den gegebenen Parametern zu definieren (siehe Signaturen Codebeispiel 2).

main-Methode: Startpunkt eines Java-Programms

Für jedes Java-Programm gibt es einen festgelegten Startpunkt, das heißt, eine ganz bstimmte Methode wird immer als Erstes aufgerufen, wenn das Programm startet: die sogenannte main-Methode. Die Erzeugung aller von dem Programm benötigter Objekte startet innerhalb dieser Methode.
Die main-Methode

Folgende Elemente der main-Methode sollten ohne Änderung übernommen werden:

In welcher Klasse des Programms die main-Methode implementiert wird, kann der Entwickler frei entscheiden. Um Verwechslungen zu vermeiden, sollte es jedoch nur eine Klasse mit einer main-Methode geben.

Instanzierung einer Klasse in der main-Methode

Das Programm "Online-Shop" startet mit der main-Methode der Klasse "OnlineShop". Ausgehend von dieser main-Methode wird ein konkreter Kunde angelegt, das heißt ein Objekt vom Typ Kunde erzeugt und als Variable kunde1 für die weitere Verwendung abgelegt.