Interfaces in JAVA

Werbung
Interfaces
Interfaces in JAVA
Henrik von Coler
HAW-SS08
Henrik von Coler
Interfaces
Gliederung
1. Einleitung
2.
Deklaration einer Schnittstelle
3.
Implementierung einer Schnittstelle
4. Polymorphie mit Schnittstellen
5. (Mehrfach)Vererbung mit Schnittstellen
6.
Ableiten von Interfaces
7.
Konstanten in Interfaces
8. Instanceof ?
9. Vergleich: Abstrakte Klassen
10.
Interfaces als Funktionszeiger
11.
Spezielle Interfaces
Henrik von Coler
Interfaces
Einleitung
• Interface = Schnittstelle:
– Generell:
• „Stellt eine Verbindung her“
– In der OOP:
• Definiert Zugriffsmöglichkeiten auf Objekte
– In der Softwaretechnik seit 25 Jahren bekannt
Henrik von Coler
Interfaces
Die Schnittstelle in C++ und Smalltalk
• Klassen besitzen nur eine Schnittstelle
– Fest verbunden mit der Klasse / Objekt
– Wird immer sofort implementiert
Henrik von Coler
Interfaces
Die Schnittstelle in Java
– Schnittstellen sind Datentypen (wie Klassen,Felder)
– Schnittstellen können ohne Implementierung
definiert werden (vergl. abstrakte Klasse)
– Eine Klasse kann mehrere Schnittstellen besitzen
– Effekt:
• Wenige Schnittstellen deklarieren und
diese an vielen Stellen verwenden
• Mehrfachvererbung möglich
Henrik von Coler
Interfaces
Prinzip der Schnittstelle in Java
Schnittstelle
Schnittstelle
Schnittstelle
Klasse
Henrik von Coler
Interfaces
Prinzip der Schnittstelle in Java
Klasse
Schnittstelle
Schnittstelle
Schnittstelle
Server
client
Klasse
Henrik von Coler
Interfaces
Prinzip der Schnittstelle in Java
1:
Deklaration
der
Schnittstelle
2:
Implementierung
Der
Schnittstelle
Henrik von Coler
Interfaces
Deklaration einer Schnittstelle
Henrik von Coler
Interfaces
Deklaration einer Schnittstelle
interface KontoInfo
{
double Stand();
}
In Schnittstellen
dürfen Methoden nur
deklariert werden.
-Keine Rümpfe
-abstrakt
Henrik von Coler
Interfaces
Deklaration einer Schnittstelle
interface KontoInfo
{
double Stand();
}
Oft werden aus
Gründen der
Erkennbarkeit
Namen wie
buyableIF
Ibuyable
Verwendet.
Henrik von Coler
Interfaces
Deklaration einer Schnittstelle
Es dürfen auch
Konstanten deklariert
werden !
interface KontoInfo
{
double Stand();
public static final double DISPO = -1000;
}
Henrik von Coler
Interfaces
Deklaration einer Schnittstelle
interface KontoInfo
{
private double Stand();
}
Das geht nicht !
Dann wäre keine
Implementierung
möglich.
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
Implementieren :
Gegenteil von Abstrahieren
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
Es wird hier
Implementiert.
public class Sparbuch implements KontoInfo
{
public double kontostand ;
public double Stand()
{
return kontostand;
}
}
Das Implementieren
gleicht der Vererbung !
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
Die Klasse muss ALLE Methoden
bereitstellen, die die
implementierte Schnittestelle
Bereitstellt.
public class Sparbuch implements KontoInfo
{
public double kontostand ;
public double Stand()
{
return kontostand;
interface KontoInfo
}
{
}
double Stand();
}
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
public class Giro extends Konto implements KontoInfo
Giro
erbt von Konto
und
implementiert KontoInfo
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
• Verschiedene Klassen können ein Interface auf
verschiedene Weisen implementieren.
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
• Verschiedene Klassen können ein Interface auf
verschiedene Weisen implementieren.
interface
methode()
Klasse1
Klasse2
methode()
methode()
Attribut1
Attribut2
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
• Problem:
– Was tun, wenn Methoden eines Interfaces bei einer
Klasse nicht benötigt werden ?
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
• Problem:
– Was tun, wenn Methoden eines Interfaces bei einer
Klasse nicht benötigt werden ?
• Lösung: Leere Imlementierung
interface Interface1
{
public void fahren()
{}
public void fliegen()
{}
}
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
• Problem:
– Was tun, wenn Methoden eines Interfaces bei einer
Klasse nicht benötigt werden ?
• Lösung: Leere Imlementierung
class Auto implements Interface1
{
public void fliegen()
{ // LEER
}
public void fliegen()
{………….
}
}
Die Funktion wird ohne
Rumpf implementiert
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
• „Gegen“-Beispiel: Adapterklassen
public class Auto
{
public void
{}
public void
{}
public void
{}
public void
{}
}
VerdeckOeffnen()
AllradAntrieb()
Automatik()
AllradAntrieb()
Die Funktionen sind in
leerer Form
(nicht abstrakt)
bereitgestellt.
Henrik von Coler
Interfaces
Implementieren von Schnittstellen
• „Gegen“-Beispiel: Adapterklassen
public class SeatMarbella extends Auto
{
public void VerdeckOeffnen()
{
// FUNKTIONSRUMPF
}
public void Automatik()
{
// FUNKTIONSRUMPF
}
}
Die erbende Klasse
überschreibt nur die
benötigten Funktionen.
Henrik von Coler
Interfaces
Frage:
Welchen Sinn haben Schnittstellen ?
Frage erinnert an Pointer in C !
Henrik von Coler
Interfaces
Polymorphie mit Schnittstellen
Polymorphie = Vielgestaltigkeit
Hier: Für einen Funktionsaufruf mit VarArg !
Eclipse Beispiel: Beispiel_3.java
Henrik von Coler
Interfaces
Polymorphie mit Schnittstellen
Interface wird
interface Buyable
{
double price();
}
deklariert.
Henrik von Coler
Interfaces
Polymorphie mit Schnittstellen
public class Chocolate implements Buyable
{
public double price()
{
return 0.69;
}
}
Interface wird
implementiert.
Henrik von Coler
Interfaces
Polymorphie mit Schnittstellen
abstract class GameObject
{
abstract boolean useOn( GameObject object );
}
public class Magazine extends GameObject
implements Buyable
{
double price;
public double price()
{
return price;
}
}
Interface wird
implementiert.
In einer Anderen Klasse.
Mit einer anderen
Funktion.
Henrik von Coler
Interfaces
Polymorphie mit Schnittstellen
Buyable b1 = new Magazine();
Buyable b2 = new Chocolate();
System.out.println( b1.price() );
System.out.println( b2.price() );
2 Objekte, die buyable
implementieren werden
instanziert.
Henrik von Coler
Interfaces
Polymorphie mit Schnittstellen
Vararg
static double calculateSum( Buyable price1, Buyable...
prices )
{
double result = price1.price();
Hier tritt die Polymorphie
auf.
for ( Buyable price : prices )
result += price.price();
Vararg
return result;
}
Henrik von Coler
Interfaces
Polymorphie mit Schnittstellen
Magazine madMag = new Magazine();
madMag.price = 2.50;
Buyable schoki = new Chocolate();
Magazine maxim = new Magazine();
maxim.price = 3.00;
System.out.printf( "%.2f", PriceUtils.calculateSum
( madMag, maxim, schoki ) );
// 6,19
Polymorphie hier:
Über eine Schnittstelle werden verschiede
Argumente an eine Funktion übergeben.
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
• Bei Klassen in Java gilt:
– Es darf nur von einer direkten Objektklasse direkt
abgeleitet werden. (Ziel: mehr Übersicht)
• Eine Klasse kann aber mehrere Schnittstellen
implementieren ! („Mehrfachvererbung“)
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
Klasse
Klasse
Schnittstelle
Schnittstelle
VERERBUNG
Klasse
Klasse
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
Kollisionsgefahr
public class beine
public class nase
{
{
public void laufen()
public void laufen()
{…
{…
}
}
}
}
public class mensch extends beine, nase
{
}
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
keine Kollisionsgefahr
interface beine
interface nase
{
{
public void laufen();
}
public void laufen();
}
public class mensch implements beine , nase
{
public void laufen()
{…
}
}
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
Schnittstellen werden weitervererbt !
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
interface Fahrzeug {
public int plaetze();
public int verbrauch();
}
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
interface Fahrzeug {
public int plaetze();
public int verbrauch();
}
class Auto implements Fahrzeug {
pubic string name;
pubic int sitzplaetze;
private double spritverbrauch;
public int plaetze()
{return sitzplaetze;}
public int verbrauch()
{return spritverbrauch;}
}
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
interface Fahrzeug {
public int plaetze();
public int verbrauch();
}
interface Sammlerstueck {
public double wert();
public int jahr();
}
class Auto implements Fahrzeug {
pubic string name;
pubic int sitzplaetze;
private double spritverbrauch;
public int plaetze()
{return sitzplaetze;}
public int verbrauch()
{return spritverbrauch;}
}
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
interface Fahrzeug {
public int plaetze();
public int verbrauch();
}
class Auto implements Fahrzeug {
pubic string name;
pubic int sitzplaetze;
private double spritverbrauch;
public int plaetze()
{return sitzplaetze;}
public int verbrauch()
{return spritverbrauch;}
}
interface Sammlerstueck {
public double wert();
public int jahr();
}
class VWPolo extends Auto
implements Sammlerstück {
pubic int baujahr;
private double sammlerwert;
public int wert()
{return sammlerwert;}
public int jahr()
{return baujahr;}
}
Das Interface Fahrzeug wird automatisch
mitvererbt !
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
Oder auch direkt !
Henrik von Coler
Interfaces
Mehrfachvererbung bei Schnittstellen
interface Fahrzeug {
public int plaetze();
public int verbrauch();
}
interface Sammlerstueck {
public double wert();
public int jahr();
}
class FiatPanda implements Fahrzeug , Sammlerstück
{
// einige Funktionen
}
Henrik von Coler
Interfaces
Ableiten von Interfaces (Subinterfaces)
Henrik von Coler
Interfaces
Ableiten von Interfaces (Subinterfaces)
Interfaces können eine Vererbungshierarchie
bilden und voneinander abgeleitet werden.
Beispiel in Eclipse:
(Beispiel_1.java)
Henrik von Coler
Interfaces
Ableiten von Interfaces (Subinterfaces)
5
Ausgabe:
Text1
Text2
Henrik von Coler
Interfaces
Konstanten in Interfaces
Henrik von Coler
Interfaces
Konstanten in Interfaces
Alle Konstanten sind immer:
public final static Typ Variable = Wert;
Auch wenn sie nur so deklariert werden:
static Typ Variable = Wert;
Henrik von Coler
Interfaces
Konstanten in Interfaces
Bei Anwendungen mit vielen Konstanten werden
reine Konstanten-Interfaces angelegt:
interface Kiste
{
public static final int laenge = 100;
public static final int breite = 200;
public static final int hoehe = 120;
}
Henrik von Coler
Interfaces
Instanceof ?
Manchmal ist es nötig, zu wissen, ob ein Objekt ein
bestimmtes Interface implementiert.
(bei Mehrfachvererbung)
Mit – instanceof - kann das überprüft
werden.
Henrik von Coler
Interfaces
Instanceof ?
interface inter1
{}
class superclass implements inter1
{}
public main class23
{
public class main(String[] args)
{
superclass object1 = new superclass();
system.out.print(object instanceof inter1);
}
}
Henrik von Coler
Interfaces
Instanceof ?
interface inter1
{}
class superclass implements inter1
{}
public main class23
{
public class main(String[] args)
{
superclass object1 = new superclass();
system.out.print(object instanceof inter1);
}
}
Ausgabe : true
Henrik von Coler
Interfaces
Vergleich mit abstrakten Klassen
Henrik von Coler
Interfaces
Vergleich mit abstrakten Klassen
Teildefinition „abstrakt“:
Es fehlt die Möglichkeit, Objekte zu
erzeugen.
Henrik von Coler
Interfaces
Vergleich mit abstrakten Klassen
abstrakte Klasse
und
Interface
Sind sich sehr ähnlich.
Es gibt aber wichtige Unterschiede.
Henrik von Coler
Interfaces
Vergleich mit abstrakten Klassen
abstrakte Klasse
Interface
abstract class Konto
{
public abstract Stand();
public abstract Dispo();
}
interface Konto
{
public Stand();
public Dispo();
}
class giro extends konto
{
public Stand()
{};
public Dispo()
{};
}
class giro inplements konto
{
public Stand()
{};
public Dispo()
{};
}
Henrik von Coler
Interfaces
Vergleich mit abstrakten Klassen
abstrakte Klasse
Interface
keine Mehrfachvererbung
Mehrfachvererbung
Methoden können konkretisiert
werden
immer neue Implementierung
Henrik von Coler
Interfaces
Interfaces als Funktionszeiger
Henrik von Coler
Interfaces
Interfaces als Funktionszeiger
Funktionszeiger (C, C++) sind in Java nicht vorhanden !
- Notwendig, wenn eine Funktion als Argument mehr
als Variablen erwartet (Funktionsplotter, Callback. )
In Eclipse:Beispiel_2.java
Henrik von Coler
Interfaces
Interfaces als Funktionszeiger
Beispiel:
1
public interface DoubleMethod
{
public double compute(double value);
}
Das Interface wird deklariert
class MathExp implements DoubleMethod
{
public double compute(double value)
{
return Math.exp(value);
}
}
Das Interface wird implementiert
Henrik von Coler
Interfaces
Interfaces als Funktionszeiger
Beispiel:
class MathSqrt implements DoubleMethod
{
public double compute(double value)
{
return Math.sqrt(value);
}
}
class Times2 implements DoubleMethod
{
public double compute(double value)
{
return 2 * value;
}
}
2
Das Interface wird implementiert
Das Interface wird implementiert
Henrik von Coler
Interfaces
Interfaces als Funktionszeiger
Beispiel:
3
public class listing0914
Die Methode printTable wird bereitgestellt
{
public static void printTable(DoubleMethod meth)
{
System.out.println(„Wertetabelle“ + meth.toString());
for(double x = 0.0: x<= 5.0 : x += 1)
{
System.out.println(„ “ + x + „->“ + meth.compute(x));
}
}
}
Henrik von Coler
Interfaces
Interfaces als Funktionszeiger
Beispiel:
public static void main(String[] args)
{
printTable(new Times2());
printTable(new MathExp());
printTable(new Sqr());
printTable(new MathSqr());
}
4
Die Klassen werden instanziert
und an printTable übergeben.
Die Wertetabelle wird erzeugt.
Henrik von Coler
Interfaces
Spezielle Interfaces
Henrik von Coler
Interfaces
Spezielle Interfaces
• In Bibliotheken sind bereits einige Interfaces
enthalten – zwei Beispiele :
Henrik von Coler
Interfaces
Das Interface „Compareable“
• Ist enthalten in java.lang
• Kann von Klassen implementiert werden, deren Objekte
paarweise vergleichbar sind.
– String
– Character
• Zum Sortieren geeignet
Henrik von Coler
Interfaces
Das Interface „Serializable“
• Wird benötigt, um Objekte zu speichern
public object OB1 implements Serializable
{
. . . . .
}
Ist enthalten in java.io.*;
Henrik von Coler
Interfaces
Zusammenfassung
Zweck von Interfaces in Java
– Kompatibilitaät zwischen Objekten verschiedener
Klassen
– Erhöhte Übersichtlichkeit
– Macht Mehrfachvererbung möglich
– Nutzung als Zeiger
– Threads
Henrik von Coler
Interfaces
Quellen
•
•
•
•
„Handbuch der Java Programmierung“ [G. Krüger]
„Java ist auch eine Insel“ [C. Ullenboom]
„Programmieren in Java“ [Fritz Jobst]
„Java“ [H. Erlenkötter]
Henrik von Coler
Herunterladen