# extends und implements



## Thisor (1. Jun 2016)

Hey Leute,

ich kann mir nicht genau den Unterschied zwischen extends und implements, bzw. die genaue Funktion von implements erklären.
Mein Wissen:
- extends: die Klasse die ein extends verpasst bekommt, ist in der Regel eine Tochterklasse die von der Superklasse erbt.
implements: implementiert Methoden von einer Klasse.
In Interface und abstrakte Klassen werden implements akzepiert aber nicht extends. 

Wieso benutzt man implements? Ich würde jetzt aus dem ff sagen, um an Methoden von einer anderen Klasse ranzukommen. Aber ich könnte doch auch per punkt.notation die Methoden aufrufen??

mfg


----------



## Cromewell (1. Jun 2016)

Mit extends lässt du eine Klasse von einer anderen erben.
Mit implements implementierst du Interfaces.
Der große Unterschied ist, dass man nur von einer Klasse erben kann, aber mehrere Interfaces implementieren kann.
http://www.programmierenlernenhq.de/interfaces-in-java/
Hier steht noch einiges zu Interface drin.


----------



## Thisor (2. Jun 2016)

Verstehe ich das richtig:

Eine Mutterklasse beschreibt die Attribute, welches ein Objekt hat/haben kann.
Die Kinderklassen erben von der Mutterklasse die Attribute, welche definiert sind.
Ein Interface ist eine Schnittstelle, welche die Methoden/Attribute der Superklasse (ausschließlich Superklassen oder auch Kinderklassen?) animmt. Indem ich ein Interface in eine Klasse implementiere, werden (und müssen) die Methoden komplett ausimplementiert werden und diese werden dann der Klasse mitgegeben. Ist das nicht quasi das Gegenteil von erben? Ich könnte doch, statt implements, doch weiterhin extends verwenden, oder?


----------



## JStein52 (2. Jun 2016)

Thisor hat gesagt.:


> Ein Interface ist eine Schnittstelle, welche die Methoden/Attribute der Superklasse (ausschließlich Superklassen oder auch Kinderklassen?) animmt


Dieser Satz ist irgendwie vollkommen falsch. Ein Interface hat nichts mit Superklasse oder Kindklasse wie du sie nennst zu tun. Mit einem Interface sagst du eigentlich nur, jede Klasse die dieses Interface implementiert muss die Methoden die dieses Interface festlegt implementieren. Und wenn du eine vergisst meckert der Compiler. D.h. es ist sichergestellt dass diese Methoden auch tatsächlich implemeniert sind.
Du könntest so etwas auch mit einer abstrakten Klasse erreichen indem du dort abstrakte Methoden definierst die dann jede Klasse die von dieser abstrakten Klasse abgeleitet wird auch implementieren muss. 
Da es in Java aber nur möglich ist von *einer* Klasse zu erben nutzt man Vererbung aber meist nicht in diesem Sinne.


----------



## Thisor (2. Jun 2016)

Dann kann ich also von jeder beliebigen Klasse ein Interface mit der dazugehörigen Methoden erstellen?
Wozu dient das eigentlich? Als Sicherheit um Fehler und Rendundanz zu vermeiden?


----------



## JStein52 (2. Jun 2016)

Thisor hat gesagt.:


> Dann kann ich also von jeder beliebigen Klasse ein Interface mit der dazugehörigen Methoden erstellen?


Das ist immer noch der falsche Ausdruck. Du erstellst kein Interface von einer Klasse. Du erstellst ein Interface. Darin sind Methoden definiert die dieses Interface ausmachen. Und dann definierst du Klassen die dieses Interface implementieren. D.h. die vom Interface verlangten Methoden implementieren.
Aber schau mal hier: http://openbook.rheinwerk-verlag.de...tml#dodtp4cdf05f9-ab55-4791-9fa2-c6929cc1a19d

Da ist das alles gut erklärt.


----------



## Thisor (2. Jun 2016)

Dann mal eins vorweg:
Kann ich ein Interface erstellen, welches Methoden aus mehreren Klassen enthält?
(Ob es Sinn macht ist im Moment irrelevant )
Werd´s mir durchlesen, muss mal eben weg, melde mich dann wieder - und thanks schonmal !


----------



## JStein52 (2. Jun 2016)

Du betrachtest es immer von der falschen Seite. Ein Interface enthält nicht Methoden aus einer Klasse.
Ein Interface sagt nur: Jede Klasse die dieses Interface implementiert muss die folgenden Methoden implementieren ..... Schau dir mal die Beispiele in der Java-Insel an !


----------



## Saheeda (2. Jun 2016)

@Thisor
Du kannst ein Interface auch als Vertrag betrachtet. Jede Klasse, die es implementiert  ("unterschreibt"), ist daran gebunden und muss sämtliche Methoden besitzen ("seine vertragl. Pflichten erfüllen"). Andernfalls ist der "Vertrag" ungültig (Compilefehler).


----------



## JStein52 (2. Jun 2016)

Du hattest vorhin gefragt:



Thisor hat gesagt.:


> Ich könnte doch, statt implements, doch weiterhin extends verwenden, oder?



Ja könntest du und das Stichwort wäre "abstrakte Klasse". Aber dabei ist folgendes zu bedenken:
Eine abstrakte Klasse und eine Schnittstelle sind sich sehr ähnlich: Beide schreiben den Unterklassen beziehungsweise den implementierenden Klassen Operationen vor, die sie implementieren müssen. Ein wichtiger Unterschied ist jedoch, dass beliebig viele Schnittstellen implementiert werden können, doch nur eine Klasse – sei sie abstrakt oder nicht – erweitert werden kann. Abstrakte Klassen können zusätzlichen Programmcode enthalten, was Schnittstellen nicht können. Auch nachträgliche Änderungen an Schnittstellen sind nicht einfach: Einer abstrakten Klasse kann eine konkrete Methode mitgegeben werden, was zu keiner Quellcodeanpassung für Unterklassen führt. Würde eine solche neue Methode in einer Schnittstelle vorgeschrieben, so müssten alle implementierenden klassen diese Implementierung neu einführen


----------



## mrBrown (2. Jun 2016)

JStein52 hat gesagt.:


> Würde eine solche neue Methode in einer Schnittstelle vorgeschrieben, so müssten alle implementierenden klassen diese Implementierung neu einführen


Mit Java 8 und `default` gilt das nur noch bedingt. Interface-Methoden müssen nur implementiert werden, wenn es keine oder mehrere default-Implementierungen gibt.


----------



## Thisor (2. Jun 2016)

@JStein52 
Hab meinen Denkfehler gefunden 
Ich habe bisher zuerst die Superklasse, dann Tochterklassen und anschließend ein Interface erstellt (so nach der Reihenfolge waren die Aufgaben zu bearbeiten).
Dadurch hatten die Methoden im Interface dieselbe Methoden (oder Methodennamen), welche sich auch in der Superklasse befanden. Denke dadurch habe ich es so aufgefasst, dass zuerst die Methoden (in einer Klasse) geschrieben werden müssen und erst dann darauf ein Interface erstellt werden kann, wobei mir die Freiheit gelassen wird, welche Methoden ich ins Interface gebe.
Grad ausprobiert - ist Quatsch. Ich kann im Interface Methoden reinschreiben welche ich mag, die Klassen die diese Implementierung bekommen, müssen diese Methoden mitbringen. Danke bis hierhin! Werde mich jetzt mal dem Link zuwidmen.  

@Saheeda 
Super Beispiel, sehr simpel und kurz gehalten! Könnten sich einige Professoren ein Beispiel nehmen


----------

