2015-02-15 17 views
7

Wygląda na to, że openJDK 8 umieszcza prywatne metody, które nie są final ani static w vtable. Dlaczego tak jest, gdy wiązanie dynamiczne nie jest używane w metodach prywatnych (ponieważ są one wywoływane za pomocą invokespecial) lub są używane?Dlaczego OpenJDK umieszcza prywatne metody w vtable?

+0

Co rozumiesz przez "vtable"? To nie jest C++. – Antimony

+0

Ale implementacja jest podobna do C++, różnica polega na tym, że vtables są obliczane, gdy program jest uruchamiany przez linker. –

Odpowiedz

4

Służy to rozwiązywaniu rzadkich sytuacji, gdy w nadklasie istnieje nadpisywalna metoda o tej samej nazwie i sygnaturze. Choć nie jest to z pewnością miejsce dla poprawy, może być ukierunkowane na JDK 9.

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

metody prywatne zawsze uzyskać wpis do obsługi vtable wsteczną kompatybilność z klasach - czyli można mieć takie same Nazwa prywatnej metody lokalnej dla Twojej klasy, a także odziedzicz metodę nadrzędną od , która zostanie odziedziczona po Twoim prywatnym dziecku metodą prywatną, .

+0

Tak więc, gdy metoda prywatna jest nazywana, jej wpis vtable nigdy nie jest używany? –

+0

@RadekMicek Dobrze, ten wpis nie jest używany w wywołaniach metod. – apangin

+0

Myślałem, że to w kółko i nadal nie rozumiem. Po pierwsze, nie wiem, które rzeczywiste zachowanie powinno zostać osiągnięte, a po drugie, każde możliwe zachowanie, które mogę sobie wyobrazić, może zostać zaimplementowane bez dodawania "prywatnych" metod do vTable. – Holger

Powiązane problemy