10 Stimmen

Warum kann eine Java-Klasse nicht sowohl abstrakt als auch final sein?

Angenommen, ich habe eine Hilfsklasse, die nur statische Methoden und Variablen enthält. z.B.:

public abstract final class StringUtils
{
    public static final String NEW_LINE = System.getProperty("line.separator");

    public static boolean isNotNullOrSpace(final String string)
    {
        return !(string == null || string.length() < 1 || string.trim().length() < 1);
    }
}

In diesem Szenario macht es Sinn, die Klasse sowohl abstrakt als auch final zu machen. Abstrakt, weil es keinen Nutzen macht, ein Objekt dieser Klasse zu erstellen, da alle Methoden statisch zugänglich sind. Final, weil die abgeleitete Klasse nichts von dieser Klasse erben kann, da sie kein nicht-statiges Element hat.

C# erlaubt den static Modifizierer für solche Klassen. Warum unterstützt Java das nicht?

-1voto

Sreedhar GS Punkte 2530

Eine Methode kann niemals als sowohl abstrakt als auch final oder als sowohl abstrakt als auch privat gekennzeichnet werden. Denken Sie darüber nach - abstrakte Methoden müssen implementiert werden (was im Wesentlichen bedeutet, dass sie von einer Unterklasse überschrieben werden), während final und private Methoden niemals von einer Unterklasse überschrieben werden können. Oder anders ausgedrückt, eine abstrakte Kennzeichnung bedeutet, dass die Superklasse nichts darüber weiß, wie sich die Unterklasse in dieser Methode verhalten soll, während eine finale Kennzeichnung bedeutet, dass die Superklasse alles darüber weiß, wie sich alle Unterklassen (egal wie weit sie sich im Vererbungsbaum befinden) in dieser Methode verhalten sollen. Die abstrakten und finalen Modifier sind praktisch Gegensätze. Da private Methoden nicht einmal von einer Unterklasse gesehen werden können (geschweige denn geerbt werden können), können sie auch nicht überschrieben werden, daher können sie auch nicht als abstrakt gekennzeichnet werden.

-1voto

Ankur08 Punkte 11

In Java kann keine Instanz einer abstrakten Klasse erstellt werden, wir können nur Referenzen vom Typ abstrakte Klasse haben. Wenn wir also eine abstrakte Klasse final machen, können wir sie nicht erweitern. Abstrakt und final sind konzeptionell gegensätzliche Konzepte. Deshalb wirft der Java-Compiler einen Kompilierungsfehler, wenn Sie versuchen, eine abstrakte Klasse in Java als final zu kennzeichnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X