Telematik 1 - Labor SS2002

LB3: Interfaces, innere Klassen, wrapper Klassen

Interfaces:

Über Interfaces wird in Java die Schnittstellenvererbung umgesetzt. Eine Klasse kann beliebig viele Interfaces implementieren, jedoch nur von einer Klasse erben. Über Interfaces kann die in C++ verfügbare Mehrfachvererbung simuliert werden. Um die C++ Klasse Hausboot, aus den Klassen Haus und Boot, zu simulieren müsste man in Java diese Klaase entweder von Haus ableiten und das Interface Boot implementieren oder von Boot ableiten und das Interface Haus implementieren. In beiden Fällen würde man aber nur die Implementierung jener Klasse erben von der man abgeleitet hat und die Schnittstelle des Interfaces selbst implementieren müsste, während man in C++ die Implementation von beiden Klassen erben würde.
Als Schlüsselwort für die Implementierung von Interfaces verwendet Java implements.

  class Base {
//implementation
 {

interface viewable{
public boolean isRed();
}

class Sub extends Base implements viewable{

public boolean isRed(){
//implementation
}
// some inherited implementations
// some new implementations
}

Da Interfaces nur die Schnittstelle von Objekten definieren und nicht deren Implementierung eignen sich Interfaces sehr gut dazu Funktionalitäten festzuschreiben. Jedes Objekt welches ein Interface implementiert "verpflichtet" sich dazu, den "Kontrakt" des Interfaces zu erfüllen. Die Implementierung kann jedoch von beliebigen Objekten erfolgen. Daher sind Interfaces in der Kommunikation zwischen beliebigen Objekten sehr wichtig und deren genaue Dokumentation wesentlich.
Ebenso wie Objekte können Interfaces voneinander erben. Dies ist möglich, da Interfaces keine Implementationen enthalten und so bei gleich lautenden Methoden in den super-Interfaces keine Konflikte mit verschiedenen Implementationen auftreten können.

Hinweis:

Alle Methoden in einem Interface sind per Definition public . Die Definition von static Methoden in Interfaces ist nicht erlaubt, da Interfaces keine Informationen über die implementierenden Klassen besitzt. Es können ausschließlich public static final Variablen in Interfaces definiert werden.

Abstrakte Klassen:

Abstrakte Klassen werden in Java gleich behandelt wie in C++. Sobald eine Methode in einer Klasse als abstract markiert ist, kann keine Instanz dieser Klasse angelegt werden. Wenn man von einer abstrakten Klasse ableitet, so muß man alle absrakten Methoden der super-Klasse implementieren oder die Klaase erneut als abstract deklarieren.
  abstract class Base {
//implementation
public abstract void someMethod();
 {

class Sub extends Base {
public void someMethod(){
// Implementation
}
 // some overwritten implementations
// some new implementations
}

Innere Klassen

Java erlaubt die Definition von inneren Klassen. Diese können public , protected oder private definiert sein. Die Sichtbarkeit ist gleich wie bei Membervariablen geregelt. Auch die deklaration als static ist zulässig. Verwendung finden innere Klassen vor allem bei der GUI-Programmierung. Nicht statische innere Klassen haben vollen Zugriff auf die Membervariablen der "umgebenden" Instanz.
  abstract class Base {
//implementation
public abstract void someMethod(){
InnerBase iBase = new InnerBase();
//some implementation
}

protected class InnerBase {
//implementation

 }

Wrapper Klassen

Java definiert für alle primitiven Datentypen(byte, short, char, int, long, float, double, boolean) entsprechende wrapper Klassen( Byte , Short , Character , Integer , Long , Float , Double , Boolean ). Diese Klassen werden hauptsächlich dann verwendet, wenn die Übergabe eines Objektes erforderlich ist. Als Beispiel für einen solchen Fall kann die Klasse Vector im Package java.util angeführt werden.
In einem Vector können nur Objects abgelegt werden. Will man also daten eines primitiven Types darin ablegen so muß man eine Wrapper Klasse benutzen. Zusätzlich definieren Wrapper Klassen auch nützliche Methoden zur Manipulation des darunterliegenden primitiven Wertes (z.B. Integer.valueOf(String s)).

 import java.util.Vector;
...
int i = 1;
Vector integerList = new Vector();
integerList.add(new Integer(i));
...
int j = ((Integer)integerList.elementAt(0)).intValue();

Aufgabenstellung:

Ziel dieser Übung ist es, den Umgang mit Interfaces in Java anhand eines Beispiel zu üben.

  • Implementierung des Interfaces Moveable in der Klasse ComicCharacter aus Übung 2 (achten Sie auf die Packages).
  • Implementierung einer Klasse tmk1.Car (Hersteller, Model und Baujahr) implements Moveable .
    • Methode  getInto(Moveable moveableObject)und implementierung der Methode, daß beim Zusteigen des moveableObject die Position auf der des Autos gesetzt wir.
    • Implemtation des Moveable Interfaces in der Art und Weise, daß alle moveableObject die sich im Auto befinden mitbewegt werden.
    • Überschreiben der toString() Methode sodass diese Hersteller.Model.Baujahr und alle Insassen mit deren Position ausgibt.
  • Die Implementierung soll die sinnvolle Anwendung der oben genannten Konzepte beinhalten.
  • Die Klassen sollen dem vorgegebenen Testprogram genügen.
Dieses Beispiel zeigt:
  • Verschiedene Implementationen für ein und das selbe Interface
  • Übergabe verschiedener Klassen an eine Methode(über das moveable Intervace)
  • dynamisches Binden der toString() Methode bei den Insassen des Wagens
Fragen:
  • Was passiert, wenn man car2 in car1 einsteigen lässt und welche Probleme ergeben sich daraus? - Wie können sie umgangen werden.