# Abstrakte Klassen, finale Klassen und Interfaces



## Inkognito (28. Dez 2012)

Derzeit lerne ich in der Uni den Einstieg in die Programmiersprache 
	
	
	
	





```
Java
```
, jedoch haben sich beim Lesen des Skripts und beim Anhören der Vorlesung im Bezug auf obiges Thema noch einige Unklarheiten ergeben. Deshalb habe ich zu mehreren Folien ein paar Fragen. Mein Professor hat auch besseres zu tun, als andauernd meinen Wissensdurst zu stillen und das Forum der Studenten ist nicht sehr aktiv, ganz im Gegensatz zu diesem Forum hier.

*Zur Folie 506:*

Müssen *alle* abstrakten Objekt-Methoden einer abstrakten Klasse in *allen* Unterklassen implementiert werden?
Variablen werden in Interfaces zu Konstanten. Für was ist das nützlich und wie sinnvoll ist es? Kann man beispielsweise sagen, dass, wenn irgendeine bestimmte fixe Zahl, die man immer wieder braucht, wie beispielsweise Pi, nicht in 
	
	
	
	





```
Java
```
 vordefiniert wäre, man diese dann in einem Interface definieren könnte und man immer darauf zugreifen könnte?
In einem Interface darf es keine Klassen-Methoden geben. Warum nicht? (Ich denke die Antwort auf diese Frage müsste eigentlich ganz einfach sein, nur stehe ich gerade leider etwas auf dem Schlauch. )
*Zur Folie 507:*

Wo sollen und müssen Interfaces geschrieben werden? Für (abstrakte) Klassen, das haben wir bisher auch in der Hausaufgabe geübt, muss jeweils eine neue Klasse eröffnet werden, in die dann geschrieben wird.
Wie sollen bei der Implementierung von Interfaces Exceptions ausgegeben werden? Oder anders gefragt: Wie könnte der auf der Folie beschriebene Punkt, umgesetzt in einem einfachen Beispiel, aussehen?
Für was braucht man überhaupt Interfaces (und somit auch abstrakte Klassen), wenn die Methoden eines Interface eh abstrakt sind? Könnte man nicht jedes Mal wieder neu eine bestimmte Methode in einer jeweiligen Klasse deklarieren? Oder sind Interfaces bzw. abstrakte Klassen Hüter der Ordnung, ohne die man aber auch auskommen könnte, wenn man streng ordentlich programmiert?
*Zur Folie 510:*

Wie Interfaces erweitert werden, wird hier klar ersichtlich. Doch wie können mehrere Interfaces zusammengefasst werden, die in Java schon vorimplementiert sind? Geht das überhaupt? Oder gilt das nur für eigens kreierte Interfaces, die dann durch andere Interfaces erweitert werden?

Vielen Dank schon einmal für eure Antworten.


----------



## Marcinek (28. Dez 2012)

Inkognito hat gesagt.:


> Müssen alle abstrakten Objekt-Methoden einer abstrakten Klasse in allen Unterklassen implementiert werden?



Also zunächst einmal kann man kien Objekt einer Abstrakten Klasse erstellen, dahe gibt es keine abstrakten Objekt-Methoden.

Eine abstrakte Methode muss innerhalb der gleichen Vererbungshierarchie nur einmal implementiert werden.



Inkognito hat gesagt.:


> Variablen werden in Interfaces zu Konstanten. Für was ist das nützlich und wie sinnvoll ist es? Kann man beispielsweise sagen, dass, wenn irgendeine bestimmte fixe Zahl, die man immer wieder braucht, wie beispielsweise Pi, nicht in Java vordefiniert wäre, man diese dann in einem Interface definieren könnte und man immer darauf zugreifen könnte?



Ja das und vieles andere.



Inkognito hat gesagt.:


> In einem Interface darf es keine Klassen-Methoden geben. Warum nicht? (Ich denke die Antwort auf diese Frage müsste eigentlich ganz einfach sein, nur stehe ich gerade leider etwas auf dem Schlauch. )



Sonst würde es Interface - Methode heißen ;D



Inkognito hat gesagt.:


> Für was braucht man überhaupt Interfaces (und somit auch abstrakte Klassen), wenn die Methoden eines Interface eh abstrakt sind? Könnte man nicht jedes Mal wieder neu eine bestimmte Methode in einer jeweiligen Klasse deklarieren? Oder sind Interfaces bzw. abstrakte Klassen Hüter der Ordnung, ohne die man aber auch auskommen könnte, wenn man streng ordentlich programmiert?



Wenn du mal ein mittleres / größeres Projekt hast, dann hast du eben Schnittstellen, die mit Interfaces definiert werden. 

Beispiel: List. Hier hat man viele Implementierungen, aber wenn es darauf nicht ankommt, implementiert man es eben gegen ein Interface.

Siehe auch google: Wofür braucht man Interfaces.



Inkognito hat gesagt.:


> Wie Interfaces erweitert werden, wird hier klar ersichtlich. Doch wie können mehrere Interfaces zusammengefasst werden, die in Java schon vorimplementiert sind? Geht das überhaupt? Oder gilt das nur für eigens kreierte Interfaces, die dann durch andere Interfaces erweitert werden?



Mehrfachvererbung gibt es nicht in Java. Eine abstrakte Klasse kann viele Interfaces implementieren und sie so "zusammenfügen". Aber wofür soll das gut sein?

[TIPP]Ein Student sollte in der Lage sein diese Informationen mittels Literatur / Internetrecherche selbstsändig erarbeiten zu können. Ein Forenposting gehört aber eher nicht zum Bereich "Selbstsändig"[/TIPP]


----------



## fjord (28. Dez 2012)

> Müssen *alle* abstrakten Objekt-Methoden einer abstrakten Klasse in *allen* Unterklassen implementiert werden?


In allen konkreten Unterklassen, nicht in abstrakten.





> Variablen werden in Interfaces zu Konstanten. Für was ist das nützlich und wie sinnvoll ist es? Kann man beispielsweise sagen, dass, wenn irgendeine bestimmte fixe Zahl, die man immer wieder braucht, wie beispielsweise Pi, nicht in
> 
> 
> 
> ...


Ja das könnte man. Wenn du allerdings ein Interface implementierst um an Konstanten ranzukommen, dringen damit Implementierungsdetails nach drausen. Besser ist es nicht instanziierbare Klassen anzulegen und diese dann mit import static einzubinden.





> In einem Interface darf es keine Klassen-Methoden geben. Warum nicht? (Ich denke die Antwort auf diese Frage müsste eigentlich ganz einfach sein, nur stehe ich gerade leider etwas auf dem Schlauch. )


Man kann mehrere Interfaces implementieren. Wenn man Klassenmethoden in Interfaces hätte, wäre es nicht eindeutig welche Implementierung genommen wird.



> Wo sollen und müssen Interfaces geschrieben werden? Für (abstrakte) Klassen, das haben wir bisher auch in der Hausaufgabe geübt, muss jeweils eine neue Klasse eröffnet werden, in die dann geschrieben wird.


Die Frage verstehe ich nicht. Falls du meinst, ob man eine neue Datei anlegen sollte für jedes Interface, dann ja.





> Wie sollen bei der Implementierung von Interfaces Exceptions ausgegeben werden? Oder anders gefragt: Wie könnte der auf der Folie beschriebene Punkt, umgesetzt in einem einfachen Beispiel, aussehen?


Wenn du zwei Implementierungen eines Interfaces hast und in einer Implementierung die Exception A geworfen werden kann und in der anderen die Exception B, dann muss im Interface eine Exception angegeben sein, die Oberklasse von A und B ist.





> Für was braucht man überhaupt Interfaces (und somit auch abstrakte Klassen), wenn die Methoden eines Interface eh abstrakt sind? Könnte man nicht jedes Mal wieder neu eine bestimmte Methode in einer jeweiligen Klasse deklarieren? Oder sind Interfaces bzw. abstrakte Klassen Hüter der Ordnung, ohne die man aber auch auskommen könnte, wenn man streng ordentlich programmiert?


Ein gutes Beispiel für den Nutzen von Interfaces ist das Comparable-Interace. Jede Klasse in einer Collection (z.B. einer List) kann mit sortiert werden, wenn es das Interface implementiert. Du brauchst das Interface, damit der Compiler überprüfen kann, ob die Klasse wirklich die Methode implementiert die benötigt wird.



> Wie Interfaces erweitert werden, wird hier klar ersichtlich. Doch wie können mehrere Interfaces zusammengefasst werden, die in Java schon vorimplementiert sind? Geht das überhaupt? Oder gilt das nur für eigens kreierte Interfaces, die dann durch andere Interfaces erweitert werden?


Guck dir mal das Beispiel unten auf der Seite an. Comparable und Cloneable (beides Interfaces aus der Standard-API) werden zu Countable zusammengefasst.


----------



## Timothy Truckle (28. Dez 2012)

Inkognito hat gesagt.:


> Für was ist das nützlich und wie sinnvoll ist es? Kann man beispielsweise sagen, dass, wenn irgendeine bestimmte fixe Zahl, die man immer wieder braucht, wie beispielsweise Pi, nicht in
> 
> 
> 
> ...


Ehr nicht.
Es geht bei Interfaces darum einen "Kontrakt" festzulegen in dem der Ersteller des Interfaces definiert, wass er beim Aufruf einer der Interface-Methoden als Reaktion erwartet, bzw. unter welchen Bedingungen der Aufruf einer bestimmten Interface-Methode erfolgen wird. In diesem Zusammenhang können in einem Interface Konstanten definiert sein, die in den Methoden des Interfaces als Parameter und/oder Rückgabewerte verwendet werden sollen bzw. müssen.



Inkognito hat gesagt.:


> [*]In einem Interface darf es keine Klassen-Methoden geben. Warum nicht? (Ich denke die Antwort auf diese Frage müsste eigentlich ganz einfach sein, nur stehe ich gerade leider etwas auf dem Schlauch. )


weil sie nur eine Vereinbarung sind, dass Klassen, die ein Interface implementieren bestimmte Methoden bereitstellen. 



Inkognito hat gesagt.:


> [*]Für was braucht man überhaupt Interfaces (und somit auch abstrakte Klassen), wenn die Methoden eines Interface eh abstrakt sind?


Die profane Antwort ist: weil eine Klasse immer nur eine abstrakte Klasse erweitern aber mehrere Interfaces implementieren kann.

Die Lange Antwort ist: abstrakte Klassen stellen bereits Implementierungen bereit, die für alle auf ihr basierenden Spezialisierungen gleich sind. Es kann aber vor kommen, dass eine solche allgemeingültige Methode mit Daten aus der Spezialisierung arbeiten soll. In diesem Fall ruft man in der abstrakten Klasse eine abstrakte Methode auf, die dann in der Spezialisierung "mit Leben" gefüllt werden muss.



Inkognito hat gesagt.:


> Könnte man nicht jedes Mal wieder neu eine bestimmte Methode in einer jeweiligen Klasse deklarieren? Oder sind Interfaces bzw. abstrakte Klassen Hüter der Ordnung, ohne die man aber auch auskommen könnte, wenn man streng ordentlich programmiert?


Nein.
Insbesondere Interfaces sind nüzlich für Polymorphie. Wenn ich zum Beispiel ein Wettrennen fahren will habe ich eine Sammlung von Autos. Wenn es kein Interface "Auto" gibt muss ich bei jedem einzelen Auto nachsehen, ob es die Methode 
	
	
	
	





```
beschleunige()
```
 gibt, weil es ja nur eine Empfehlung ist, diese Methode zu haben und sie auch so zu nennen. Wenn es ein gemeinsames Interface "Auto" gibt dass die Methode 
	
	
	
	





```
beschleunige()
```
 deklariert muss jede Klasse, die ein Auto sein will diese Methode haben und entsprechend dem Kontrakt implementieren (die Geschwindigkeit erhöhen). Das coole dabei ist, dass es der jeweiligen Klasse überlassen ist was tatsächlich passiert, also zB. wie stark die einzelnen Autos beschleunigen. 



Inkognito hat gesagt.:


> [*]Wie Interfaces erweitert werden, wird hier klar ersichtlich. Doch wie können mehrere Interfaces zusammengefasst werden, die in Java schon vorimplementiert sind? Geht das überhaupt? Oder gilt das nur für eigens kreierte Interfaces, die dann durch andere Interfaces erweitert werden?


Spielt keine Rolle. Eigene und fremde Interfaces können wild gemischt werden. Aber wie bereits die Anderen schrieben ist das nicht sinnvoll. Üblicher Weise hat man eine abstrakte Oberklasse, die die Implementierung mehrerer Interfaces für seine Nachfahren deklariert, falls das nötig ist.

bye
TT


----------



## Inkognito (29. Dez 2012)

Ok, danke. Jetzt ist mir einiges klarer und ich hoffe, dass ich es auch verstanden habe.

Also: Interface = *Pflichtenheft* zur Implementierung von Methoden
Richtig? Kann man das so einfach zusammenfassen?

[TIPP]Zum selbstständigen Arbeiten als Student kann ich nur sagen, dass ich versuche möglichst alles immer selbst zu machen. Hinzu kommt, dass ich viele Lehrbücher oftmals sehr umständlich formuliert finde – und leider auch sehr vieles, was auf Webseiten steht. Hier kann man wenigstens noch einmal nachfragen. Aber ich suche schon auch vieles selbst. Ich würde dieses Forum hier nur noch zuspammen, wenn ich das nicht täte. Insofern versuche ich meine Arbeit immer selbst zu machen, doch manchmal braucht eben jeder etwas Hilfe. [/TIPP]


----------



## Timothy Truckle (29. Dez 2012)

Inkognito hat gesagt.:


> Ok, danke. Jetzt ist mir einiges klarer und ich hoffe, dass ich es auch verstanden habe.
> 
> Also: Interface = *Pflichtenheft* zur Implementierung von Methoden
> Richtig? Kann man das so einfach zusammenfassen?


Ja, das würde ich so unterschreiben.

bye
TT


----------

