Oie Victor, tudo bem contigo?
Isso acontece porque o loop vai acontecer enquanto a variável "contador" for menor que 10, o problema é que quando o "contador = 9", o loop ocorre novamente e ai com o "contador++" ele começa a valer 10, e ai se você tiver deixado o "System.out.println(contador)" antes disso, o valor irá sair sendo 9, mas se você deixar depois, ele vai fazer a soma, e o "System.out.println(contador)" vai sair como 10.
Segue a explicação no código:
int contador = 9; // coloquei o contador já sendo igual a 9
while(contador < 10) { // pelo fato do contador ainda ser menor que 10, o loop vai acontecer
System.out.println(contador); // o contador ainda é igual a 9, então irá ser printado no console o numero 9
contador = contador + 1; // é feito a soma de +1, agora o contador vale 10
}
// o loop é interrompido já que o contador agora é = 10.
}
Agora se for desse jeito:
int contador = 9;
while(contador < 10) {
contador = contador + 1; // agora o contador vale 10
System.out.println(contador); // contador = 10, sendo assim irá aparecer no console o numero 10
}
}
Por isso, nessa situação o contador sempre vai terminar igual a 10, a questão é se você deixar o "System" antes da soma ele vai aparecer como 9, se você deixar depois vai ser como 10.
Espero que agora essa lógica tenha ficado mais clara, qualquer outra dúvida fico a disposição :)
Bons estudos!