Einige Klassen in der Standard-Java-API werden geringfügig anders behandelt als andere Klassen. Ich spreche von Klassen, die ohne spezielle Unterstützung durch den Compiler und / oder die JVM nicht implementiert werden könnten.
Diejenigen, die mir sofort einfallen, sind:
Object
(offensichtlich) wie es unter anderem keine Superklasse hat.String
da die Sprache spezielle Unterstützung für den Operator + hat.Thread
da es diese magische start () -Methode hat, obwohl es keinen Bytecode-Befehl gibt, der die Ausführung "gabelt".
Ich nehme an, dass alle Klassen wie diese auf die eine oder andere Weise in der JLS erwähnt werden. Korrigiere mich, wenn ich falsch liege.
Wie auch immer, welche anderen Klassen gibt es? Gibt es eine vollständige Liste der "verherrlichten Klassen" in der Java-Sprache?
Antworten:
Es gibt viele verschiedene Antworten, daher dachte ich, es wäre nützlich, alle zu sammeln (und einige hinzuzufügen):
Klassen
Schnittstellen
Lobende Erwähnungen gehen an:
Hinweis: Ich habe Dinge aus der Liste gestrichen, die JNI bereitstellen (z. B. E / A), da Sie jederzeit Ihren eigenen JNI-Aufruf implementieren könnten, wenn Sie dazu geneigt wären. Native Aufrufe, die auf privilegierte Weise mit der JVM interagieren, sind jedoch unterschiedlich.
Arrays sind umstritten - sie erben Object, haben eine verstandene Hierarchie (Object [] ist ein Supertyp von String []), aber sie sind ein Sprachmerkmal, keine definierte Klasse für sich.
quelle
SecurityManager
? Oder irgendetwas im Zusammenhang mit Reflexion oder Serialisierung?Class
, Na sicher. Es hat seine eigenen Literale (eine Unterscheidung, mit der es teiltString
, übrigens) und ist der Ausgangspunkt all dieser Reflexionsmagie.quelle
sun.misc.unsafe ist die Mutter aller schmutzigen Hacks, die den Geist der Sprache brechen.
quelle
quelle
Alle Number-Klassen haben ein bisschen Magie in Form von Autoboxing .
quelle
Da die wichtigen Klassen erwähnt wurden, werde ich einige Schnittstellen erwähnen:
Die
Iterable
Schnittstelle (seit 1.5) - ermöglicht es einem Objekt, an einer foreach-Schleife teilzunehmen:Die
Serializable
Schnittstelle hat eine ganz besondere Bedeutung, die sich von einer Standardschnittstelle unterscheidet. Sie können Methoden definieren, die berücksichtigt werden, obwohl sie nicht in der Schnittstelle definiert sind (wiereadResolve()
). Dastransient
Schlüsselwort ist das Sprachelement, das das Verhalten vonSerializable
Implementierern beeinflusst.quelle
transient
SchlüsselwortComparable
nimmt an nichts Internem teil. Sie könnten leicht schreibenNewComparable
und neuNewArrays.sort(..)
mit der gleichen Funktionalitätquelle
Java-Array wie in
int[].class
quelle
[I
Klasse;) es ist jedoch keine API-Klasse.java.lang.ClassLoader
, obwohl die eigentliche Drecksarbeit von einer nicht erwähnten Unterklasse erledigt wird (siehe 12.2.1 Der Ladevorgang ).quelle
Ich bin mir nicht sicher. Ich kann mir jedoch keine Möglichkeit vorstellen, E / A-Objekte manuell zu implementieren.
quelle
In der
System
Klasse steckt etwas Magie .System.arraycopy
ist ein Hook in nativen Codeaber...
quelle
Nun, da der spezielle Umgang mit Assert erwähnt wurde. Hier sind einige weitere Ausnahmetypen, die vom JVM speziell behandelt werden:
Die Ausnahmen sind nicht speziell, aber die JVM verwendet sie in besonderen Fällen, sodass Sie sie nicht selbst implementieren können, ohne Ihre eigene JVM zu schreiben. Ich bin mir sicher, dass es weitere besondere Ausnahmen gibt.
quelle
Die meisten dieser Klassen werden nicht wirklich mit 'spezieller' Hilfe des Compilers oder der JVM implementiert. Object registriert einige Eingeborene, die sich in den internen JVM-Strukturen umsehen, aber Sie können dies auch für Ihre eigenen Klassen tun. (Ich gebe zu, dass dies der Semantik unterliegt. "Aufrufe eines in der JVM definierten Native" kann als spezielle JVM-Unterstützung angesehen werden.)
Was / ist / speziell ist das Verhalten der Anweisungen 'new' und 'throw', wie sie diese internen Strukturen initialisieren.
Anmerkungen und Zahlen sind allerdings ziemlich ausgeflippt.
quelle