2015-02-15 11 views
7

Sembra che lo openJDK 8 posizioni metodi privati ​​che non sono finalstatic in vtable. Perché è così quando l'associazione dinamica non viene utilizzata per i metodi privati ​​(dal momento che sono invocati con invokespecial) o viene utilizzata?Perché OpenJDK inserisce metodi privati ​​in vtable?

+0

Cosa intendi con "vtable"? Questo non è C++. – Antimony

+0

Ma l'implementazione è simile a C++, la differenza è che i vtables vengono calcolati quando il programma viene eseguito dal linker. –

risposta

4

Questo viene fatto per gestire alcune rare situazioni quando esiste un metodo sovrascrivibile con lo stesso nome e firma in una superclasse. Sebbene ci sia sicuramente un posto di miglioramento, può essere, mirato per JDK 9.

Vedi https://bugs.openjdk.java.net/browse/JDK-8024368

metodi privati ​​ottengono sempre una voce di vtable per gestire all'indietro compatibilità con le classi - vale a dire che può avere lo stesso nome di un metodo privato locale per la classe e anche ereditare un metodo da la tua superclasse, che verrà ereditata attorno al metodo privato, da tuo figlio.

+0

Quindi, quando viene chiamato un metodo privato, la sua voce vtable non viene mai utilizzata? –

+0

@RadekMicek A destra, questa voce non viene utilizzata nelle chiamate di metodo. – apangin

+0

L'ho pensato ancora e ancora e ancora non capisco. In primo luogo, non capisco quale dovrebbe essere il comportamento effettivo e in secondo luogo, ogni possibile comportamento che posso immaginare potrebbe essere implementato senza aggiungere metodi 'private' alla vTable. – Holger