vou tentar explicar o que acontece na public class teste acima:
O for da linha 3 inicia com a variável int i = 1, o i = 1 é levado para a linha 4 ficando: for (int j = 1; j <= 1; j++) , de seguida como neste for a condição de entrar é que j <= i, e j = 1 bem como i = 1, é efectuada a operação que esta na linha 5: System.out.print(i * j + " "); e imprimi 1 no ecra.
Feito isso, o j incrementa + 1, passando a j = 2 e o i continua i = 1, logo não pode continuar nesse for (porque j é maior que i e a condição de entrada é que sempre j tem que ser menor ou igual a i, como vem escrito na linha 4: j <=i).
Feito isso, salta para a linha 7 e nesta, simplesmente abre um parágrafo. E volta a linha 3 e o i é incrementado passando a i = 2, de novo, vamos a linha 4 com o nosso i = 2, e como estamos a entrar de novo no for o j = 1 e i = 2, efectuamos a operação da linha 5: 2 * 1 onde o 2 fica no i e o 1 fica no j, o resultado é imprimido na tela, como o ciclo não terminou, porque o nosso j ainda é menor que o nosso i, voltamos ara o linha 4 e j é incrementado passando a valer 2, e de novo efectuamos a operação, 2 * 2, onde 2 é do i e o outro 2 é do j, o resultado é imprimido na tela.
De novo passamos para linha 4 e incrementado mais 1 ao j temos que j = 3, logo nao pode entrar no for da linha 4, salta de novo para a linha 7 e deixa um novo parágrafo, e volta para a linha 3, e o i é incrementado passando a valer 3, de novo vamos a linha 4 verifica-se a condição, passa-se para linha 5 efectua-se a operação até a condição for falsa, e salta de novo para 7, depois de novo para 3, e incrementa mais 1, e i = 4 …
Esse é o ABC dos FORS ENCADEADOS