ADG Tag 4 – Abstrakte Klassen, Vererbung, Konstruktoren

Superklassen

Das Superklassen-Projekt in Eclipse, mit Ausgabe

Als letzten Teil vor der Entwicklung der ersten Android App werden wir heute abstrakte Klassen und Vererbung behandeln.

Abstrakte Klassen

Eine abstrakte Klasse dient dazu, mehrere Klassen mit gleichen Eigenschaften und Funktionen zu strukturieren. Die abstrakte Klasse gibt Felder und Methoden vor, welche auch in allen Kind-Klassen vorhanden sind.
Im Java-Basics Artikel haben wir als Beispielklasse ein Auto genommen. Sollen im Programm auch LKW, Roller (etc…) bereitgestellt werden, macht es Sinn, eine Superklasse für alle bereitzustellen. Alle Klassen brauchen Funktionen wie Fahren, Bremsen, Blinken, und Eigenschaften wie RadAnzahl, Maximalgeschwindigkeit usw. Die abstrakte Klasse könnte nun Kraftfahrzeug heißen, und alle diese Methoden und Felder bereitstellen. Wie das genau funktioniert, werden wir gleich sehen.
Es gibt aber auch Methoden, die bei allen Klassen vorhanden sein müssen, jedoch nicht genau gleich funktionieren. Etwas wie MotorStarten: Die Funktion braucht jedes Kraftfahrzeug, jedoch wird beim PKW etwas unterschiedliches für MotorStarten ausgeführt, als für den LKW. Dazu kann man eine abstrakte Methode MotorStarten in die abstrakte Klasse einfügen. Diese Methode muss auch jede Kind-Klasse übernehmen, jede Kind-Klasse entscheidet aber selbst, was die Methode macht.
Die Superklasse Kraftfahrzeug.java könnte so aussehen:

public abstract class Kraftfahrzeug
{
	public int RadZahl;
	public int MaxSpeed;
	public String Hersteller = "TactiCalcode";

	public abstract void MotorStarten();
}

Die Kind-Klasse PKW.java:

public class PKW extends Kraftfahrzeug
{
	@Override
	public void MotorStarten()
	{
		System.out.println("PKW von " + Hersteller + ": Motor wird gestartet...");
	}
}

Die Klasse LKW.java kann nun etwas anderes in der MotorStarten Methode tun:

public class LKW extends Kraftfahrzeug
{
	@Override
	public void MotorStarten()
	{
		System.out.println("LKW wird gestartet...");
	}
}

Die Methode MotorStarten wird nun für PKW/LKW unterschiedliche Dinge tun. Beide Klassen besitzen jedoch die Felder RadZahl, MaxSpeed und Hersteller. Nur für Hersteller ist schon ein Wert definiert, dieser kann von den Kind-Klassen aber auch geändert werden. Soll dieser unveränderlich bleiben, muss der Zugriffsmodifizierer final mit angegeben werden. final gibt an, dass das Element zur Laufzeit (also während das Programm ausgeführt wird) nicht mehr geändert werden darf.
Wir können nun PKW und LKW Objekte instanziieren, und die MotorStarten Methode aufrufen:

public class MainClass
{
	public static void main(String[] args)
	{
		LKW lkw1 = new LKW();
		PKW pkw1 = new PKW();

		lkw1.MotorStarten();
		pkw1.MotorStarten();
	}
}

Der Ausdruck zur Deklarierung eines Objektes hat die Syntax
<Typ> <Name>;
Hiermit wird nur bekannt gegeben, dass es Objekt <Name> vom Typ <Typ> existiert.
Der Typ des Objekts wird durch den Namen der Klasse festgelegt. Im Beispiel ist lkw1 ein Objekt vom Typ LKW.
Damit das Objekt auch erstellt wird, muss es instanziiert werden:
<Name> = new <Typ>();
Bei der Instanziierung wird der Konstruktor der Klasse aufgerufen. Meistens wird nach dem Deklarieren auch sofort Instanziiert:
<Typ> <Name> = new <Typ>;

Konstruktor

Der Konstruktor ist eine Methode, die bei der Instanziierung einer Klasse ausgeführt wird. Der Konstruktor muss genau so heißen, wie die Klasse. Ein Konstruktor muss nicht zwangsläufig angegeben werden, er kann auch leer bleiben, wie im Beispiel oben. Ein Beispiel für den Konstruktor der LKW Klasse:

public LKW(int AnzahlRaeder)
{
	RadZahl = AnzahlRaeder;
	System.out.println("LKW mit " + RadZahl + " Rädern wurde instanziiert.");
}

Somit muss zum Erstellen eines LKW Objektes die RadZahl festgelegt werden:

LKW lkw1 = new LKW(18);

Nun wird beim Erstellen die Nachricht ,,LKW mit 18 Rädern wurde instanziiert“ ausgegeben.
Die Variable RadZahl ist in der Superklasse vorhanden, daher ist sie auch in der Kind-Klasse vorhanden. Dieses Prinzip nennt sich einfach Vererbung. Alle Elemente der Superklasse sind auch in der Kind-Klasse vorhanden. Das Feld RadZahl muss in LKW also nicht erst deklariert werden, es ist bereits durch die Vererbung verfügbar.

Konstruktoren gibt es auch in abstrakten Klassen. Der Konstruktor der abstrakten Klasse wird automatisch aufgerufen, wenn die Kind-Klasse instanziiert wird.
Ist der Konstruktor der Superklasse parametrisiert, muss er manuell von der Kind-Klasse aus aufgerufen werden, mit super();

Im Beispielprojekt auf Github gibt es noch weitere Details, etwa mehrere Konstruktoren. Die Ausgabe des Programms:

Kraftfahrzeug Mein LKW wird instanziiert.
LKW mit 18 Rädern wurde instanziiert.
Kraftfahrzeug Zweitwagen wird instanziiert.
PKW wurde instanziiert.
LKW wird gestartet...
PKW von http://www.tacticalcode.de: Motor wird gestartet...

MfG
Damon Dransfeld

Dieser Eintrag wurde veröffentlicht in Android
Bookmarken: Permanent-Link Schreibe einen Kommentar oder hinterlasse einen Trackback: Trackback-URL.

Ein Kommentar

  1. Felix
    Erstellt am 14. Januar 2013 um 08:12 | Permalink zum Kommentar

    Hey,
    auch hier noch eine Anmerkung: Es wäre noch ganz cool, in diesem Zusammenhang Interfaces vorzustellen, da Java keine Mehrfachvererbung erlaubt, wenn man also mehrere direkte Oberklassen möchte, muss man dies (zumindest teilweise) über Interfaces realisieren.
    Gruß
    Felix

Achtung: Wordpress interpretiert bestimmte Zeichenfolgen als Markup und verändert diese. Nutzt für Programmcode lieber Gist oder PasteBin-Services und verlinkt die Code-Schnipsel.

Post a Comment

Ihre E-Mail wird niemals veröffentlicht oder verteilt. Benötigte Felder sind mit * markiert

*
*

Du kannst diese HTML Tags und Attribute verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>