In einem Interface werden halt eben nur static Methoden erstellt.
Siehe: http://stackoverflow.com/a/18778228/1803294An interface is a description of the behaviour an implementing class will have. The implementing class ensures, that it will have these methods that can be used on it. It is basically a contract or a promise the class has to make.
An abstract class is a basis for different subclasses that share behaviour which does not need to be repeatedly be created. Subclasses must complete the behaviour and have the option to override predefine behaviour (as long as it is not defined as final or private).
Es gibt ganz viele Unterschiede, die ich nicht bereit bin, alle aufzuzählen, aber Ja, teilweise Logikimplementierung gehört in eine abstrakte Klasse, Interfaces sollten keine Implementierung enthalten, von ihnen darf "normalerweise" keine Instanz erstellt werden, und Mehrfachvererbung gibt es viel Pro und Contra.
Wie wäre es, wenn Du Dich mal ein wenig mäßigen würdest ??Das ist kein Blödsinn, sondern nüchterne Tatsachenbeschreibung. Auf deinem Kindergartenniveau brauchen wir gar nicht weiterdiskutieren
Nicht richtig, abstrakte Methoden, wenn schon, keine Implementierungen, das auch der wesentliche Unterschied.
Ja, in Java 8 ist das möglich, das wurde etwas vermischt. (Fragt sich, wie lange noch) Ich sollte mal die Links lesen, die ich gib.
Aber es bleibt dabei, dass eine Teilweise Logikimplementierung in eine abstrakte Klasse zugehörig ist
Von abstrakten Klassen aber genauso wenig. Aber Gemeinsamkeit und Unterschied verwechselt man ja schnell mal...- da von Interfaces normalerweise keine Instanz erstellt werden darf.
Bisher hast du zumindest noch keinen einzigen genannt^^Es gibt ganz viele Unterschiede, die ich nicht bereit bin, alle aufzuzählen,
aber Ja, teilweise Logikimplementierung gehört in eine abstrakte Klasse, Interfaces sollten keine Implementierung enthalten,
...und das hattest du auch schon mal, auch immer noch falsch.von ihnen darf "normalerweise" keine Instanz erstellt werden,
Pro und Contra = In Java nicht möglich, also am Thema vorbei.und Mehrfachvererbung gibt es viel Pro und Contra.
Auch, wenn in Java8 default-Implementierungen in Interfaces hinzugekommen sind, so bleibt dennoch der wesentliche Unterschied, dass abstrakte Klasse einen eigenen inneren Zustand besitzen, mit dem man arbeiten kann, Interfaces hingegen nicht.
Geschweige davon, dass man nur von einer abstrakten Klasse "erben" kann und von vielen Interfaces.
In diesem Thread werden aber weder Vor- noch Nachteile von irgendwas erwähntEine Sache kann gleichzeitig Vor- und Nachteile haben.
Nein, in Neuland.Wo bin ich hier gelandet? Ponnyhof?
Das was ich oben beschrieben habe, ist nur ein Grund von vielen, wann was verwendet wird. Bei Schnittstellen kennst du die implementierung ja noch nicht. Du kennst das WAS, aber das WIE kennst du nocht nicht. Dazu kommen noch sicherlich andere Gründe dazu wie "Inversion of Control" etc. Bei einer abstrakten Klasse kennst du teilweise das WIE (auf die Klasse bezogen). Die anderen Regeln, wie, dass eine abstrakte Klasse nicht instanziiert werden kann und das man mehrere interfaces implemenieren kann ist doch klar. Das steht in jedem Buch.Wenn das wirklich die Aussage dieses C++-Programmierers war, dann zweifle ich das "gut" doch stark an.
Wenn du in dieser Aussage die beiden "noch" streichst, dann kommt man der Wahrheit näher. Der "Client", der den "Dienst" nutzt, muss und soll oft über das WIE gar nichts wissen. Das Interface stellt lediglich eine Art Vertrag nach außen über das WAS dar. Zweck ist ganz einfach das Erreichen einer möglichst geringen Kopplung. Eine solche Entscheidung sollte aber niemals davon getrieben sein, dass man die Implementierung des "Dienstes" noch nicht kennt.Bei Schnittstellen kennst du die implementierung ja noch nicht. Du kennst das WAS, aber das WIE kennst du nocht nicht.
Ich würde das so festmachen: Wenn ich eine Anwendung schreibe, in der es um den Verleih von unterschiedlichen Dingen geht, dann kann ich all diese Dinge von einer Klasse "Item" ableiten. Alle Klassen, die die Ausleihgegenstände beschreiben enthalten eine Methode "getPrice()", die die Leihgebühr berechnet. Da sich diese jedoch für jeden Gegenstand anders berechnet, würde ich die als "abstrakte Methode" in Item ablegen, was Item per definitionem zur abstrakten Klasse macht. Den Ausleihvorgang selbst würde ich so gestalten, dass die aufrufende Klasse Renting über ein Interface IItem mit den Ausleihdingen verbunden ist. In Renting und auch in den von IItem abgeleiteten Klassen müssen dann die im Interface festgelegten Methoden implementiert werden. Ich finde, wenn ich diese Methoden in der abstrakten Klasse deklarieren würde, habe ich die Schwierigkeit, wie Renting da ran kommt. Ich müsste sie duplizieren, was fehleranfällig ist.
Die abstrakte Klasse kann man sich dann erstmal sparen, man braucht nur das Interface Item, welches dann alle öffentlichen Methoden enthält.@mrBrown: genauso habe ich mir das gedacht.
Sehe ich nicht so. Aus meiner Sicht ist der abstraken Erläuterung von flown nichts hinzuzufügen:Auch wenn mein Beispiel daneben sein mag, helfen doch konkrete Beispiele eher abstrakte Erläuterungen zu veranschaulichen.
@DerWissende: Auch wenn mein Beispiel daneben sein mag, helfen doch konkrete Beispiele eher abstrakte Erläuterungen zu veranschaulichen.
interface IItem {
float getPrice();
}
abstract class AItem implements IItem {
public float getMws() {
return getPrice() * 1.19f;
}
}
interface BuchItem {
String getTitle();
String getAuthor();
}
class Buch extends AItem implements BuchItem {
String title, author;
float price;
public Buch(String title, String author, float price) {
this.title = title;
this.author = author;
this.price = price;
}
@Override
public float getPrice() {
return price;
}
@Override
public String getTitle() {
return title;
}
@Override
public String getAuthor() {
return author;
}
}
class Renting {
}