2017-06-01 5 views
29

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

+26

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 .. –

+4

@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

+3

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

Antwort

35

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. Stringist 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.

+0

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

+0

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

27

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.

19

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.

2

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.

Verwandte Themen