2015-02-15 9 views
7

Es scheint, dass openJDK 8 private Methoden, die nicht final noch static in Vtable sind. Warum ist es so, wenn die dynamische Bindung nicht für private Methoden verwendet wird (da sie mit invokespecial aufgerufen werden) oder wird sie verwendet?Warum platziert OpenJDK private Methoden in vtable?

+0

Was meinen Sie mit "vtable"? Das ist nicht C++. – Antimony

+0

Die Implementierung ähnelt jedoch C++, der Unterschied besteht darin, dass Vtables berechnet werden, wenn das Programm vom Linker ausgeführt wird. –

Antwort

4

Dies wird getan, um einige seltene Situationen zu behandeln, wenn eine überschreibbare Methode mit demselben Namen und derselben Signatur in einer Oberklasse existiert. Obwohl es auf jeden Fall einen Platz für Verbesserungen, kann für JDK 9.

Siehe abgezielt werden, https://bugs.openjdk.java.net/browse/JDK-8024368

Private Methoden immer einen VTable-Eintrag erhalten, um rückwärts Kompatibilität mit Klassen zu behandeln - also Sie die gleiche haben Name einer privaten Methode lokal für Ihre Klasse und erben auch eine Methode von Ihre Oberklasse, die von Ihrem Kind um die private Methode vererbt werden wird.

+0

Wenn also eine private Methode aufgerufen wird, wird ihr Vtable-Eintrag nie verwendet? –

+0

@RadekMicek Rechts, dieser Eintrag wird nicht in Methodenaufrufen verwendet. – apangin

+0

Ich dachte es immer und immer wieder und verstehe es immer noch nicht. Erstens verstehe ich nicht, welches tatsächliche Verhalten erreicht werden sollte, und zweitens könnte jedes mögliche Verhalten, das ich mir vorstellen kann, implementiert werden, ohne der vTabelle "private" Methoden hinzuzufügen. – Holger