java_na_veia, sim, eu não tenho um link para te passar, mas pelo que sei, compiladores geralmente substituem o valor das constantes onde ela é usada no programa, isso evita carregar uma variavel na pilha de processamento e verificar o valor dela, pois ele ja sabe qual eh o valor.
Ex:
final int x = 9
Sysout(x)
Quando o compilador compilar isso, ele vai fazer algo como
Sysout(9)
dentro do codigo compilado, isso eh de certa forma mais rapido que se ele fizer
Sysout(x)
No caso de objetos, imagino que ele substitui pela referencia direta que ele vai ter na memoria, ja que variaveis (de objetos) nada mais guardam que uma referencia para uma posicao de memoria, esse valor (referencia) sera substituido ja direto onde a variavel final eh usada ao inves de carregar e verificar qual eh o valor (referencia) que ela esta guardando.
Bem, falei tudo isso não porque ja li muito sobre as variaveis final do java ehehe mais por ja ter estudando compiladores (faz tempo), e a maioria dos compiladores fazem essa otimização, java não seria diferente acho
. Com certeza alguem que conhece a linguagem java mais que eu pode te dizer melhor o que ele faz e como ele otimiza 
valeu!