C++ hat mehrere Vererbung. Die Implementierung der Mehrfachvererbung auf der Assembly-Ebene kann ziemlich kompliziert sein, aber es gibt gute descriptions online wie dies normalerweise getan wird (VTables, Zeiger-Fixups, Thunks, etc.).Wie werden Java-Schnittstellen intern implementiert? (VTabellen?)
Java verfügt nicht über mehrere Implementationsvererbung, aber es hat mehrere Schnittstellenvererbung, also glaube ich nicht, dass eine einfache Implementierung mit einer einzelnen vtable pro Klasse das implementieren kann. Wie implementiert Java Schnittstellen intern?
Ich weiß, dass Java im Gegensatz zu C++ Jit kompiliert wird, so dass verschiedene Teile des Codes möglicherweise anders optimiert werden, und verschiedene JVMs könnten die Dinge anders machen. Gibt es also eine allgemeine Strategie, der viele JVMs folgen, oder kennt jemand die Implementierung in einer bestimmten JVM?
Auch JVMs oft Devirtualize und Inline-Methodenaufrufe in diesem Fall gibt es überhaupt keine Vtables oder gleichwertige beteiligt, so dass es nicht sinnvoll ist, nach tatsächlichen Assembly-Sequenzen zu fragen, die virtuelle/Interface-Methodenaufrufe implementieren, aber ich nehme das am meisten an JVMs behalten immer noch eine Art allgemeine Repräsentation von Klassen, um sie zu benutzen, wenn sie nicht in der Lage waren, alles zu devirtualisieren. Ist diese Annahme falsch? Ist diese Darstellung in etwa wie eine C++ vtable? Wenn ja, haben Interfaces separate VTables und wie sind diese mit Klassenvtabellen verbunden? Wenn dies der Fall ist, können Objektinstanzen mehrere vtable-Zeiger (auf Klassen-/Schnittstellen-Vtabellen) wie Objekt-Instanzen in C++ haben? Haben Verweise eines Klassentyps und eines Schnittstellentyps auf dasselbe Objekt immer den gleichen binären Wert oder können sich diese wie in C++ unterscheiden, wo sie Zeigerkorrekturen benötigen?
(Referenz: this question fragt etwas Ähnliches über die CLR, und es erscheint in this msdn article eine gute Erklärung zu sein, obwohl das inzwischen veraltet sein kann ich nicht in der Lage für Java etwas Ähnliches zu finden..)
Edit:
- I ‚Geräte‘ im Sinne bedeuten, nicht im Sinne von „Java-Klasse Arraylist implementiert die Liste Schnittstelle„Wie funktioniert der GCC-Compiler integer-Addition/Funktionsaufrufe/etc implementieren“ ".
- Ich weiß, wie das auf der JVM-Bytecodeebene funktioniert, was ich wissen möchte ist, welche Art von Code und Datenstrukturen die JVM generiert, nachdem sie die Klassendateien geladen und den Bytecode kompiliert hat.
Sie erwähnen Schnittstellenvererbung und Implementierungsvererbung. Implementierungsvererbung ist schwierig, da Sie eine definierte Suchreihenfolge haben müssen. Die Schnittstellenvererbung ist viel einfacher. Sie haben nur eine Karte mit allen Methodensignaturen, die implementiert werden müssen. Es ist keine Suchreihenfolge erforderlich (da keine Implementierung angehängt ist). Dort ist keine Reihenfolge. – extraneon