Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Das stimmt beides nicht. Ein Objekt "von einem Interface" erstellst du genau dann, wenn du ein neues Objekt einer Klasse erstellst, die dieses Interface implementiert. Dann ist das Objekt vom Typ her der Typ der speziellen Klasse, aber halt auch vom Typ des Interfaces, weil die Klasse es implementiert.
Bei abstrakten Klassen ist es das gleiche: Du kannst zwar kein Objekt von einer abstrakten Klasse direkt erzeugen, aber eins von jeder beliebigen Unterklasse, die von dieser abstrakten Klasse erbt. Auch hier ist der Typ dieses Objekts dann auch der Typ der abstrakten Klasse.
Merk dir einfach:
Überall dort, wo ein Objekt vom Typ X erwartet wird, kannst du in Java auch jedes Objekt Y angeben, wenn:
- Y von X erbt (egal ob X abstrakt ist oder nicht)
- für denn Fall dass X keine Klasse ist sondern ein Interface: Y das Interface X implementiert
Nein du kannst nur auf die Methoden vom Interface zugreifen, nicht auf die von MeineKlasse
(ausser durch explizites casten, aber das ist ne andere Geschichte)
Der Vorteil ist, dass du abstrahieren kannst.
Bsp eine Klasse, die eine Liste von irgendwas enthält, und damit etwas machen kann.
zB eine Bestellung im McDonald's aufnehmen.
Wenn nun die einzelnen Klassen BigMac, Cheeseburger, McSundae, McSalad, ... alle ein
Interface "Angebot" implementieren, welches eine Methode abrechnen() anbietet, könnte die oben
erwähnte Klasse folgendes tun:
Code:
List<Angebot> items; // <- da kann man BigMacs reintun, oder Cheeseburger, oder Salate, usw..
int zuZahlen = 0;
for ( Angebot a : items ){
zuZahlen += a.abrechnen();
}
Weil jeder einzelne Burger o.ä. dieses Interface implementiert und die abrechnen Methode überschreibt,
sodass sie die Kosten von diesem Burger zurückgibt.
Versuch das mal zu machen, ohne ein Interface. Da müsstest du in jeder Schleife erstmal
überprüfen, ob das nun ein Cheeseburger oder ein BidMac ist, und per if-else Schachtelungen
den Betrag erhöhen.
Und das musst du hier nicht, weil du es abstrahierst: Alles was die Klasse interessiert, ist dass
sie eine Liste von Dingen hat, die man gekauft hat und deren Kosten zusammenrechnetn. Es ist
ihr total egal was du jetz genau kaufst, sie will nur das Geld sehen
Ist dir jetz der Sinn von Interfaces klar?
ps: Jegliche Namens-Übereinstimmung einer bekannten Fastfood-Kette ist unbeabsichtigt, außerdem würd ich nie dafür Werbung machen weil McDonalds suckt und die Pommes beim Burger King viel knuspriger sind.
Überall dort, wo ein Objekt vom Typ X erwartet wird, kannst du in Java auch jedes Objekt Y angeben, wenn:
- Y von X erbt (egal ob X abstrakt ist oder nicht)
- für denn Fall dass X keine Klasse ist sondern ein Interface: Y das Interface X implementiert
? Entweder verdreh ich es grad wieder oder du. :bae:
Y von X erbt:
Code:
class X
{}
class Y extends
{}
Code:
X x = new Y(); // korrekt Y erwartet aber X angegeben
Y y = new X(); // X erwartet aber Y angegebn
Also sollte es doch heissen:
Überall dort, wo ein Objekt vom Typ X erwartet wird, kannst du in Java auch jedes Objekt Y angeben, wenn:
- X von Y erbt (egal ob Y abstrakt ist oder nicht)
- für denn Fall dass Y keine Klasse ist sondern ein Interface: X das Interface Y implementiert