Objektorientierung in Java
Zu Teil 2: Kernelemente von Java
Zu Teil 3: Ablaufsteuerung in Java
Teil 4: Überblick Objektorientierung in Java
Für den Zugriff auf die Kapitel 5 - 20 müssen Sie sich zunächst registrieren.
Das wichtigste Konzept in Java ist die Objektorientierung, diese ist dort allgegenwärtig. Objektorientierung bedeutet, dass man versucht, ein Programm als Reihe von interagierenden Objekten zu modellieren, wie in der realen Welt. Dadurch schafft man es, die Komplexität eines Programms zu verringern, da man beim Programmieren erst einmal jedes Objekt einzeln betrachten kann.
Doch was bedeutet das nun konkret in Java? Nun, in Java gibt es Klassen. Klassen fassen gleichartige oder ähnliche Objekte zusammen. Z.B. wäre Mensch eine mögliche Klasse und Tante Erna und Ernst Müller wären konkrete Objekte vom Typ Mensch. Man spricht dann auch davon, dass Tanta Erna und Ernst Müller Instanzen von Mensch sind.
Charakteristisch für Klassen ist, dass alle Instanzen einer bestimmten Klasse dieselben Eigenschaften haben und dieselben Aktionen ausführen können. Die Werte der Eigenschaften können sich aber von Instanz zu Instanz unterscheiden. Um beim Beispiel Mensch zu bleiben: Alle Menschen haben eine bestimmte Größe und ein Gewicht, das unterscheidet sich aber von Mensch zu Mensch. Allen gemein ist aber, dass sie dieselben Aktionen ausführen können, z.B. gehen oder laufen oder schwimmen.
In der Java-Terminologie nennt man die Eigenschaften von Klassen Attribute und die Aktionen Methoden. Eine Klasse besteht also im Wesentlichen aus Attributen und Methoden. Attribute sind dabei einfach Variablen: also z.B. int
-Werte, wie wir sie zuvor schon kennen gelernt haben. Aber ein Attribut kann auch eine Instanz einer Klasse sei. Die Klasse Mensch könnte beispielsweise ein Attribut Bester Freund haben. Wenn der beste Freund von Tante Erna dann Ernst Müller wäre, würde das Attribut Bester Freund bei der Instanz Tante Erna auf die Instanz Ernst Müller verweisen.
Methoden stellen die Funktionalität bzw. die Aktionen, die ein Objekt ausführen kann, zur Verfügung. Man kann dies dafür nutzen, um Codezeilen, die man mehrmals ausführen möchte, in einer Methode zusammenzufassen. Wenn man die Codezeilen dann ausführen möchte, ruft man einfach nur die entsprechende Methode auf und der Code der Methode wird automatisch ausgeführt. Eine Methode kann auch Parameter besitzen: Parameter sind Variablen, die vom Code der Methode verwendet werden, aber erst bei der späteren Ausführung der Methode festgelegt werden müssen. Zudem kann eine Methode einen sogenannten Rückgabewert besitzen. Einen Rückgabewert kann man sich vorstellen wie ein Endergebnis einer Methode. Wenn eine Methode ausgeführt wurde, wird der Rückgabewert an der Stelle im Code abgeliefert, von der aus die Methode aufgerufen wurde.
Methoden
Soviel Theorie lockern wir jetzt mit einem einfachen Beispiel auf: wir schreiben eine Funktion/Methode, die die Summe der ersten n Zahlen berechnet, wobei n variabel ist. Diese Funktion sieht dann folgendermaßen aus:
public int berechneSumme(int n)
{
int sum = 0;
for (int i = 0; i <= n; ++i)
{
sum = sum + i;
}
return sum;
}
Zur Syntax: public
bedeutet, dass die Methode (als Teil einer Klasse) öffentlich ist. Auf dieses Öffentlichkeits-Konzept werden wir gleich noch näher zu sprechen kommen, können es zunächst aber mal ignorieren.
int
gibt den Rückgabetyp an, wir wollen also am Ende einen int
-Wert zurück geben. Es gibt auch Methoden, die keinen Wert zurück geben, dann wird der Rückgabetyp mit void
angegeben.
berechneSumme
ist der von uns frei gewählte Name der Methode. Danach folgt dann die Parameterliste, diese besteht hier nur aus einem Parameter: bei einem Aufruf wird der Funktion nur ein int
-Wert übergeben. Wir können den Namen für den Parameter beliebig wählen (hier n
), der Name wird benutzt um innerhalb des Funktionsrumpfes auf den Parameter zuzugreifen. Wenn wir eine Funktion mit mehreren Parametern schreiben wollten, müssten die einzelnen Parameter in der Parameterliste durch Komma voneinander getrennt werden.
Der Funktionsrumpf besteht wiederum aus dem Code, den wir schon aus dem Beispiel mit der for
-Schleife kennen: es wird die Summe der ersten n
Zahlen berechnet. Neu ist am Ende die return
-Anweisung: diese gibt die Summe an die Stelle zurück, an der die Funktion aufgerufen wurde. Der Aufruf der Funktion ist dann sehr einfach:
int summe1 = berechneSumme(10);
int summe2 = berechneSumme(20);
summe1 hat also dann den Wert 55, während summe2 den Wert 210 hat.
Programmieren mit Java - Einige unserer Empfehlungen
Klassendefinition
Nun kennen wir grundsätzlich die wichtigsten Bestandteile einer Klasse und wollen uns jetzt einmal ansehen, wie eine Klasse konkret aussieht. Bleiben wir bei der bereits zuvor besprochenen Klasse Mensch
.
public class Mensch
{
private int groesse;
private int gewicht;
private int position;
private int energieReserven;
public Mensch(int _groesse, int _gewicht)
{
groesse = _groesse;
gewicht = _gewicht;
position = 0;
energieReserven = 100;
}
public int getGroesse()
{
return groesse;
}
public int getGewicht()
{
return gewicht;
}
public int getPosition() {
return position;
}
public void bewegung(int strecke)
{
if (energieReserven >= strecke)
{
position = position + strecke;
energieReserven =
energieReserven - strecke;
}
}
public void nehmeEineErfrischung()
{
energieReserven = energieReserven + 50;
}
}
Die Definition einer Klasse ist denkbar einfach, dem Schlüsselwort public
(was auch hier wieder bedeutet, dass die Klasse öffentlich ist) folgt das Schlüsselwort class
und danach der frei wählbare Name der Klasse. Danach folgt ein von geschweiften Klammern (Zeilen 2 und 43) begrenzter Codeblock, in dem die eigentliche Klasse definiert wird.
Zunächst werden die Attribute der Klasse, also die Eigenschaften angelegt: groesse
und gewicht
erklären sich wohl von allein, lediglich bei position
und energieReserven
müssen wir ein paar Worte sagen. Später wollen wir von dieser Klasse konkrete Instanzen erstellen, also Objekte. Wenn wir uns das jetzt wie in der realen Welt vorstellen: dann hat jeder Mensch zu jedem Zeitpunkt eine exakt definierte Position (die man zum Beispiel über Koordinaten angeben könnte). Wir vereinfachen das hier extrem, indem wir als Position einfach einen int
-Wert nehmen, also einen ganzzahligen Wert.
energieReserven
soll (wiederum sehr vereinfacht) angeben, wieviel Energie ein Objekt vom Typ Mensch noch besitzt. Der Sinn dahinter ist, dass ein Mensch bestimmte Aktionen nur ausführen kann, wenn noch genug Energie vorhanden ist (um wieder eine Analogie zur realen Welt herzustellen: wenn Sie abends müde und erschöpft von der Arbeit heimkommen, haben Sie vermutlich nicht mehr die Energie, um noch einen Marathon zu laufen …).
Programmieren mit Java - Einige unserer Empfehlungen
Nun aber zu den Schlüsselwörtern private
und public
, die bei der Deklaration der Attribute schon wieder auftauchen: private
bedeutet, dass ein Attribut privat ist, d.h. es kann darauf nicht von außen zugegriffen werden. groesse
, gewicht
, position
und energieReserven
können nicht von außen geändert werden, sondern nur innerhalb der Klasse selbst (d.h. nur Code der sich innerhalb der Klasse Mensch befindet, kann auf diese Attribute zugreifen).
public
ist das Gegenteil, auf solche Attribute kann auch von außerhalb der Klasse zugegriffen werden. public
und private
funktionieren ebenso bei Methoden: private
-Methoden können nur innerhalb der Klasse selbst aufgerufen werden, public
-Methoden von überall.
Schauen wir uns die Klasse nun weiter an: nach der Deklaration der Attribute finden wir mit
public Mensch(int _groesse, int _gewicht)
...
einen Codeblock, der ein bisschen wie eine Methode/Funktion aussieht. Tatsächlich handelt es sich hier um einen Sonderfall: das ist der Konstruktor. Der Konstruktor wird automatisch aufgerufen, wenn ein Objekt neu angelegt wird. Daher wird der Konstruktor in der Regel dazu genutzt, die Attribute zu initialisieren, d.h. mit sinnvollen Werten vorzubelegen. Wie bei einer Methode auch kann man einem Konstruktor Parameter übergeben. Die allgemeine Syntax für die Erstellung eines Konstruktors ist:
public <Klassenname>(<Parameterliste>) { Anweisung 1; Anweisung 2; ... }
Der Konstruktor wird also gewissermaßen definiert wie eine Methode, deren Methodennamen gleich dem Klassennamen ist und für die kein Rückgabetyp angegeben wird. Wichtig ist daher auch, dass innerhalb des Konstruktors die return
-Anweisung zur Rückgabe eines Wertes oder eines Objektes nicht verwendet werden darf.
Konkret initialisiert unser Konstruktor also die Werte für groesse
und gewicht
mit den Werten, die dem Konstruktor als Parameter übergeben werden. Zudem wird die Position auf 0 gesetzt und die Energiereserven auf 100.
Als nächstes finden wir in der Klasse einige Methoden, die alle mit “get” beginnen. Solche Methoden nennt man getter. Diese werden verwendet, um der Außenwelt Zugriff auf private Attribute zu geben. Es wird daher nichts weiteres getan, als jeweils den entsprechenden Wert zurück zu geben, sodass dieser dann auch von außerhalb der Klasse gelesen werden kann.
Doch warum dann dieser umständliche Umweg? Warum die Attribute nicht gleich public
machen? Nun, das ist in diesem Fall recht einfach. Über diesen Mechanismus gibt man so nach außen nur einen Lese-Zugriff, d.h. die Werte können von außen nicht geändert werden. Und das ist ja auch sinnvoll, denn warum sollte schon jemand von außen das Gewicht oder die Größe eines Menschen ändern?
Die Methode bewegung
soll eine Aktion durchführen, nämlich eine einfache Bewegung über eine angegebene Strecke. Dazu wird zunächst geprüft, ob noch genügend Energiereserven vorhanden sind: Pro Meter, der zurückgelegt werden soll, wird auch 1 Energiereserve benötigt. Sind nicht mehr genug Reserven vorhanden, kann die Bewegung nicht ausgeführt werden (und der Mensch verbleibt auf seiner aktuellen Position). Sind dagegen noch genügend Reserven vorhanden, wird die Position des Menschen entsprechend geändert und die Energiereserven gemäß der zurückgelegten Strecke verringert. Nachdem die Aktion abgeschlossen ist hat sich also die Position verändert und die Energiereserven sind verringert.
Damit der Mensch nicht irgendwann irgendwo strandet, d.h. sich nicht mehr bewegen kann, weil keine Energiereserven mehr vorhanden sind, muss es auch irgend eine Methode geben, mit der die Reserven wieder aufgeladen werden können. Wir haben in dieser Beispiel-Klasse dafür eine einfache Methode nehmeEineErfrischung
. Diese bewirkt einfach, dass die Reserven wieder um 50 Punkte vergrößert werden.
Programmieren mit Java - Einige unserer Empfehlungen
Verwendung von Klassen / Objekten
Nachdem wir die Definition der Klasse nun durchgegangen sind, schauen wir uns jetzt noch an, wie sie konkret verwendet wird. Dabei lernen wir auch noch einen weiteren Bestandteil der Programmiersprache Java kennen, nämlich die Kommentare: jede Zeile, die mit einem Doppelslash (//) beginnt, wird vom Compiler einfach ignoriert. Daher nutzt man das, um in natürlicher Sprache an schwierigen Stellen dem Code Erläuterungen und Erklärungen hinzuzufügen, die für den Compiler nicht von Bedeutung sind, aber anderen menschlichen Lesern des Codes weiterhelfen, um den Code zu verstehen.
// Instanz tanteErna wird angelegt
Mensch tanteErna = new Mensch(160, 55);
// Größe wird ausgelesen,
// Wert der Variable groesse ist nun 160
int groesse = tanteErna.getGroesse();
// Position wird ausgelesen,
// Wert der Variablen position ist nun 0
int position = tanteErna.getPosition();
// tanteErna bewegt sich um 40 Meter,
// d.h. Position ist danach 40
// und energieReserven 60
tanteErna.bewegung(40);
// position hat nun den Wert 40
position = tanteErna.getPosition();
// tanteErna hat nicht mehr genug Energiereserven,
// um noch 70 Meter zurück zu legen
// Daher werden an dieser Stelle weder die Reserven
// noch die Position geändert
tanteErna.bewegung(70);
// position hat immer noch den Wert 40
position = tanteErna.getPosition();
// tanteErna wird wieder "aufgetankt",
// d.h. die Energiereserven von 60 auf 110 erhöht
tanteErna.nehmeEineErfrischung();
// Da nun genügend Reserven vorhanden sind,
// kann sich tanteErna weitere 70 Meter bewegen.
// Die Reserven sinken von 110 auf 40
tanteErna.bewegung(70);
// position hat nun den Wert 110
position = tanteErna.getPosition();
Dieser Programmablauf sollte sich größtenteils von selbst erklären mit den gegebenen Erläuterungen. An dieser Stelle wollen wir noch zwei Hinweise hinzufügen: wie bereits zu Beginn kurz angerissen, lautet die Syntax für den Aufruf einer Methode
OBJEKT.METHODENNAME();
Objektname ist also immer tanteErna
und die Parameterliste kann auch leer sein, eben wenn eine Methode keine Parameter besitzt.
Der Aufruf des Konstruktors unterscheidet sich dabei etwas, dieser erfolgt über das Schlüsselwort new
.
Der Aufruf von
Mensch tanteErna = new Mensch(160, 55);
bewirkt also, dass der von uns definierte Konstruktor der Klasse Mensch ausgeführt wird und diesem die Parameter 160 und 55 zur Initialisierung der Attribute übergeben werden. Das neu erstelle Objekt wird dann automatisch zurückgegeben (d.h. ohne dass im Konstruktor eine return
-Anweisung vorkommt) und kann dann fortan unter dem Namen tanteErna
im Programm verwendet werden.
Damit beenden wir diesen Teil des Java-Tutorials. Wir haben hier einige wichtige Konzepte der Programmiersprache Java vorgestellt. Wenn Sie sich auf unserer Seite registrieren, erhalten Sie darüberhinaus Zugriff auf 14 weitere Kapitel dieses Tutorials, in denen wir weitere Konzepte von Java etwas genauer vorstellen. Wir geben darin auch eine kurze Einführung in fortgeschrittene Themen wie die Netzwerkprogrammierung, Nebenläufigkeit und die Erstellung von grafischen Oberflächen.
Zu Teil 2: Kernelemente von Java
Zu Teil 3: Ablaufsteuerung in Java
Teil 4: Überblick Objektorientierung in Java
Für den Zugriff auf die Kapitel 5 - 20 müssen Sie sich zunächst registrieren.
Im nächsten Kapitel werden wir die Primitiven Datentypen einmal genauer unter die Lupe nehmen.
Eine ausführliche Liste unserer Buchempfehlungen für Java finden Sie hier.
Java-Tutorial Kapitel:
1. Grundlagen: Compiler und Entwicklungsumgebung2. Kernelemente: Variablen und Ausdrücke
3. Ablaufsteuerung in Java
4. Überblick Objektorientierung
5. Primitive Datentypen
6. Ausdrücke und Operatoren
7. Arrays in Java
8. Zeichenketten
9. Klassen und Objekte
10. Referenzen und Parameter
11. Vererbung in Java
12. Exceptions
13. Generics
14. Collections
15. Dateiverarbeitung in Java
16. Nebenläufigkeit
17. Netzwerkprogrammierung
18. Grafische Oberflächen (GUIs)
19. Java-Webtipps
20. Code-Download und Übungen
Für den Zugriff auf die Kapitel 5 - 20 ist eine Registrierung notwendig.
Einloggen
Wenn Sie noch kein Benutzerkonto bei programmierenlernen24.de haben, müssen Sie sich zunächst registrieren, um vollen Zugriff auf unser Java-Tutorial zu bekommen.
Passwort vergessen? Lassen Sie sich hier ein neues zusenden.
Unsere Buchempfehlungen
Oder sehen Sie sich die vollständige Liste der Empfehlungen für Java an.Wir haben auch eine Empfehlung für einen Java-Fernkurs parat.