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.
ich versuche gerade ein tieferes Verständnis für den Unterschied zwischen abstrakten Klassen und Interfaces zu bekommen. Mit Java 8 kann man ja default Methoden in Interfaces bestimmen. Jetzt frage ich mich, braucht man überhaupt noch abstrakte Klassen, wenn man die neuen Interfaces hat?
Nehmen wir an wir haben eine abstrakte Klasse A und eine Klasse B implementiert diese.
Das könnte man doch dadurch ersetzen dass man eine normale Klasse A hat und B diese erweitert und für die abstrakten Methoden macht man ein Interface C. Um zu verhindern, dass wir Klasse A instanziieren setzen wir den Konstruktor privat. Oder hat man dadurch Nachteile und was ist der "bessere" way to go?
ich versuche gerade ein tieferes Verständnis für den Unterschied zwischen abstrakten Klassen und Interfaces zu bekommen. Mit Java 8 kann man ja default Methoden in Interfaces bestimmen. Jetzt frage ich mich, braucht man überhaupt noch abstrakte Klassen, wenn man die neuen Interfaces hat?
Das könnte man doch dadurch ersetzen dass man eine normale Klasse A hat und B diese erweitert und für die abstrakten Methoden macht man ein Interface C. Um zu verhindern, dass wir Klasse A instanziieren setzen wir den Konstruktor privat. Oder hat man dadurch Nachteile und was ist der "bessere" way to go?
Du hast dann zwei ganz unabhängige Typen A und C, und kannst zB mit den Methoden aus C keine aus A benutzen (bzw nur über hässliche Umwege).
In B muss man dann immer dran denken, dass man A UND C extenden/implementieren muss, was das ganze auch wieder fehleranfällig und unschön macht.
Außerdem führt ein privater Konstruktor dazu, dass du A nicht extenden kannst
Naja ich meinte folgendes:
B extends A (Die konkrete klasse B implementiert abstrakte klasse A)
wird zu
B extends A implements C (A ist eine normale Klasse und C das Interface)
Außerdem führt ein privater Konstruktor dazu, dass du A nicht extenden kannst
Du hast dann eine Klasse A mit privaten Methoden und Attributen, die aber mit den öffentlichen Methoden aus C nichts zu tun haben, und ein Interface C mit öffentlichen Methoden, die mit den privaten aus A nichts zu tun haben.
Im Endeffekt also zwei Typen, die nichts miteinander zu tun haben.
Das was eine abstrakt klasse enthalten würde, muss in dem Fall also B enthalten, (A kann es nicht, A ist ja unabhängig von C), du kannst dir A also sparen.
mrBrown hat das in der ersten Antwort schon angeschnitten, aber ich möchte das nochmal betonen:
Der wesentliche Unterschied ist der, dass du in abstrakten Klassen auch Instanzvariablen vorhalten kannst. Entsprechende Objekte besitzen also einen eigenen, inneren Zustand. Ob Methoden nun privat oder öffentlich sind, ist eher zweitrangig.