s08 – Klassen und Objekte 1 – Grundlagen und Konstruktoren

 

Eine Klasse in Java ist ein Schema oder eine Verallgemeinerung für eine Gruppe von Dingen.
Eine derartige Gruppe könnte zum Beispiel die Menge aller Autos sein.

Alle Autos haben Gemeinsamkeiten, wie etwa die Fähigkeit zu Fahren.
Andere Eigenschaften sind zwar auch bei allen Autos vorhanden, allerdings in unterschiedlichen Ausprägungen, zum Beispiel das Kennzeichen, das Baujahr oder den Kilometerstand.

In Java können Klassen wie folgt definiert werden:

public class Auto
{
	int iBaujahr;
	int iKilometerstand;
	String Kennzeichen;
	String Farbe;
	String Besitzer;
	// Weitere Eigenschaften
}

Eine Klasse wie “Auto” hat natürlich sehr sehr viele Eigenschaften. Daher muss man sich für ein Programm überlegen, welche Eigenschaften wichtig (relevant) sind. Nur diese sollten in der Klassendefinition aufgeführt werden.

Wir wollen nun eine spezielle Ausprägung der Klasse “Auto” betrachten, nämlich den alten blauen Opel Agila von Tante Hilde. Wir wollen dieses spezielle Auto “Auto1″ nennen.
In Java deklarieren wir das Auto1 wie folgt:

Auto Auto1;

Dies geschieht ganz analog zu der Deklaration einer normalen Variable. Für den Datentyp schreiben wir hier “Auto”, für den Namen “Auto1″.
Genau wie eine Variable eines Grunddatentypes muss auch das Auto vor der Nutzung noch initialisiert werden.
Bei einer ganzzahligen Variable geschah das mit einer einfachen Wertzuweisung:

// Deklaration:
int i1;

// Definition:
i1 = 5;

Beim Auto ist das nicht so einfach. Wir können einem Auto nicht einfach den Wert 5 zuweisen. Wofür sollte dieser auch stehen?
Um dieses Problem zu lösen, braucht die Klasse Auto eine spezielle Methode, nämlich den Konstruktor.
Diese Methode “konstruiert” das Auto mit den als Argumenten übergebenen Angaben.

Die Klasse muss wie folgt erweitert werden:

public class Auto
{
	int iBaujahr;
	int iKilometerstand;
	String sKennzeichen;
	String sFarbe;
	String sBesitzer;
	// weitere Eigenschaften

	// Konstruktor:
	public Auto(int iBJ, int iKM, String sKZ, String sFB, String sBes)
	{
		iBaujahr = iBJ;
		iKilometerstand = iKM;
		sKennzeichen = sKZ;
		sFarbe = sFB;
		sBesitzer = sBes;
	}
}

Das Auto von Tante Hilde hat festgelegte Eigenschaften. Diese möchten wir gleich bei der Initialisierung des Objektes “Auto1″ übergeben werden.

Der Konstruktor wird mit “new” aufgerufen. Wir schreiben also:

// Deklaration
Auto Auto1;

// Initialisierung
Auto1 = new Auto(1993, 95000, "CE-FR-395", "blau", "Tante Hilde");

Analog zu den Variablen können auch Objekte einer Klasse in einem Schritt deklariert und initialisiert werden:

Auto Auto1 = new Auto(1993, 95000, "CE-FR-395", "blau", "Tante Hilde");

Wenn wir von Tante Hildes Auto1 sprechen, wissen wir aber vielleicht gar nicht, wie viele Kilometer es schon gefahren ist oder wie genau das Kennzeichen lautet.
Wir möchten dann bei der Initialisierung zum Beispiel nur den Besitzer und die Farbe zuweisen.
Unser Konstruktor unterstützt dieses Vorhaben nicht, denn einer Funktion oder Methode kann man nicht einfach weniger Parameter übergeben, als in der Methodendefinition gefordert werden.

Die Lösung ist ein zweiter Konstruktor. Wir erweitern die Klasse Auto wie folgt:

public class Auto
{
	int iBaujahr;
	int iKilometerstand;
	String sKennzeichen;
	String sFarbe;
	String sBesitzer;
	// weitere Eigenschaften

	// alter Konstruktor:
	public Auto(int iBJ, int iKM, String sKZ, String sFB, String sBes)
	{
		iBaujahr = iBJ;
		iKilometerstand = iKM;
		sKennzeichen = sKZ;
		sFarbe = sFB;
		sBesitzer = sBes;
	}

	// neuer, vereinfachter Konstruktor:
	public Auto(String sFB, String sBes)
	{
		sFarbe = sFB;
		sBesitzer = sBes;
	}
}

Nun können wir ein “einfachereres” Auto definieren:

Auto Auto1 = new Auto("blau", "Tante Hilde");

Anhand der Anzahl der Argumente und deren Typ wählt die Klasse automatisch den richtigen Konstruktor aus. Es können beliebig viele verschiedene Konstruktoren in der Klasse definiert werden.