Porque idadeJoao é int, idadeMaria e idadeJose também. Portanto, somando os dois, o resultado é um int. Ao dividir usando /, o compilador decide o tipo de divisão baseado no tipo dos dados envolvidos. Como o dividendo é int (a soma das idade) e o divisor também (a constante 3), a divisão feita é inteira e o resto é desprezado. Somente depois de fazer a divisão inteira é que ocorre a atribuição para a variável idadeMedia, que é double e aceita casas decimais.
Para ver como esse comportamento ocorre, experimente trocar a linha que faz a divisão por:
double idadeMedia = (idadeJoao + idadeMaria + idadeJose) / 3.0;
Nesse caso, como o divisor será uma constante do tipo double (3.0), ocorrerá uma conversão implícita do dividendo para double e a divisão terá a parte decimal, como você espera. Experimente!