Als Java 9 werden uns erlauben, private
und private static
Methoden auch in Schnittstellen zu definieren, was würde die verbleibende Differenz in interface
und class
sein? Bewegt sich Java außerdem langsam in Richtung Mehrfachvererbung?Java 9 Schnittstelle vs Klasse
Antwort
Private-Interface-Methoden in Java 9 verhalten sich genau wie andere private Methoden: Sie müssen einen Rumpf haben (auch in abstrakten Klassen) und können weder aufgerufen noch von Unterklassen überschrieben werden. Als solche interagieren sie nicht wirklich mit der Vererbung. Sprechen, von denen (und insbesondere Mehrfachvererbung), gibt es (zumindest?) Drei Arten davon:
- Inheritance von Typen bedeutet, dass ein Typ ein anderer Typ sein kann, z.B.
String
ist einObject
. Java erlaubt die mehrfache Vererbung von Typen vom ersten Tag an (über Schnittstellen). - Vererbung des Verhaltens bedeutet, dass ein Typ das Verhalten eines anderen Typs erben kann. Vor Java 8 konnten nur Klassen Methoden implementieren, daher gab es nur eine einzige Vererbung dieser Art. Mit Java 8 kamen Standardmethoden, die es erlaubten, Schnittstellen zu implementieren, wodurch Java eine mehrfache Vererbung von Verhalten ermöglichte.
- Vererbung des Status bedeutet, dass ein Typ den internen Zustand eines anderen Typs (d. H. Felder) erbt. So wie es ist (Java 9 und alles, was derzeit für zukünftige Java-Versionen vorgeschlagen wird), können nur Klassen einen Zustand haben, so dass es nur eine einzelne Vererbung dieser Art gibt.
Wie Sie sehen können, fügen private Interface-Methoden hier nichts hinzu.
In Bezug auf Ihre Frage, wie Schnittstellen und Klassen vergleichen, gibt es zwei Hauptunterschiede: Mehrfachvererbung und Status. Schnittstellen unterstützen erstere, Klassen können letztere haben. Da der Zustand in der typischen OOP wichtig ist, bleiben die Klassen relevant.
Wenn es eine Möglichkeit für eine Schnittstelle gäbe, eine Implementierung zu zwingen, ein bestimmtes nicht-öffentliches Feld zu haben oder sich selbst zu definieren, würde sich das Spiel ändern und Schnittstellen könnten mit Klassen konkurrieren.
Es ist nicht schön, und ich will es nicht sehen Produktion, aber konnte der Staat nicht mit einer inneren Klasse gekapselt werden, um mehrfache Klassenvererbung zu simulieren? Analog dazu: https://stackoverflow.com/questions/3427073/java-interface-implementation-pair/3442218#3442218 – Terran
Da sowohl die innere Klasse als auch das Feld, auf das verwiesen wird, öffentlich sein würde, zählt dies nicht wirklich als erben privaten Staat. ;) Öffentlicher Zustand ist kein Problem, ziehe einfach die zustandsbezogenen Methoden in die Schnittstelle. – Nicolai
Private Methoden werden nicht von Unterklassen geerbt, daher hat diese Funktion keine Auswirkungen auf Implementierungsklassen. Ich glaube, dass die privaten Methoden in Schnittstellen uns erlauben, Code zwischen Standardmethoden zu teilen.
Java-Schnittstellen können immer noch nicht statische Mitglieder haben. Das ist ein großer Unterschied und nicht multiple Vererbung IMO.
Java 9-Schnittstellen können immer noch keine Felder und Konstruktoren enthalten. Dies macht einen großen Unterschied zwischen Klassen und Schnittstellen, so dass Java 9 weit entfernt von Mehrfachvererbung ist.
Java-Schnittstelle in Version 9 haben private Methoden, aber statische private. Das Feature wurde eingeführt, um modulare Methoden zu ermöglichen. Eine Funktion sollte mit einer Verantwortung arbeiten, anstatt langwierige Standardmethoden zu verwenden. Es hat nichts mit Mehrfachvererbung zu tun. Je mehr private statische Methoden, desto mehr können Sie den sauberen und wiederverwendbaren Code schreiben. Wie auch immer, statische Methoden, ob öffentlich oder geschützt, können nicht überschrieben werden.
- 1. Java-Schnittstelle vs Klasse als Rückgabetyp
- 2. Klasse vs. Schnittstelle
- 3. Spring Autowiring Klasse vs. Schnittstelle?
- 4. Schnittstelle vs 100% abstrakte Klasse
- 5. Struct vs Klasse eine Schnittstelle
- 6. Innere Klasse in Schnittstelle vs in Klasse
- 7. Mehrfachvererbung, Schnittstelle vs Zusammensetzung mit in Java
- 8. auf Abstraktion vs Schnittstelle in java doc
- 9. Java Casting Schnittstelle zur Klasse
- 10. C++/CLI-Interface-Klasse vs. Schnittstelle struct
- 11. C# vs JAVA Instanz der Schnittstelle
- 12. Null vs Marker-Schnittstelle
- 13. Java-Klasse vs C++ Klasse statische vs Instanz
- 14. Java-Klasse vs Array-Speichergröße?
- 15. (Anfänger Java) Klasse, Schnittstelle oder enum erwartet
- 16. Kotlin Daten Klasse Java Schnittstelle implementieren
- 17. Kotlin Schnittstelle eine Java-Klasse: versehentliche Überschreibung
- 18. Casting in Java (Schnittstelle und Klasse)
- 19. Schnittstelle vs Mehrfachvererbung in C#
- 20. JNA direkt vs Schnittstelle zuordnen?
- 21. Java generische Schnittstelle Leistung
- 22. Beobachter Muster abstrakt vs Schnittstelle
- 23. Java: Die untergeordnete Klasse implementiert die Schnittstelle, aber die übergeordnete Klasse überschreibt die Mitglieder der Schnittstelle.
- 24. Klocwork 9 vs Klocwork 12
- 25. Klasse vs Paket vs Modul vs Komponente vs Container vs Service vs Plattform in Java Welt
- 26. Java-Aktion Listener: implementiert vs anonyme Klasse
- 27. Java. Typ vs Objekt einer Klasse
- 28. Java Doppel vs double: Klasse Typ vs Urtyp
- 29. Object Schnittstelle in Java
- 30. Java-Schnittstelle erweitert Vergleichbar
Ich bin überrascht, das hat so viele upvotes ...Restliche Unterschiede: 'protected'-Unterstützung,' package-private'-Unterstützung, ** grundsätzlich alles außer dem Zusatz von 'private' und' static' ** .. Interfaces können keine Klassen erweitern, die reservierten Schlüsselwörter 'interface' und' class ', * die Philosophie/Zweck/Grund der Existenz * der beiden .. Könnte wahrscheinlich weitergehen .. –
@VinceEmigh Ich verstehe Ihre Bedenken. Aber jemand hat mir am Anfang meiner Karriere gesagt: "Keine Frage ist dumm". Und ich weiß, dass alle Menschen in SO, einschließlich Sie, dies verstehen würden. – Aakash
Die Antwort ist immer noch die gleiche wie in [Schnittstelle mit Standardmethoden vs Abstract Klasse in Java 8] (https://stackoverflow.com/q/19998454/2711488), außer dass es "private" Methoden in einer Schnittstelle geben kann, was natürlich keine Auswirkungen auf andere Klassen haben kann. – Holger