Это на самом деле не вопрос вертикального или горизонтального, основанный на порядке выполнения строк кода. Например:
for(int n=0;n<10;n++)
{
System.out.println(n);
}
будет печатать 0 1 2 3 4 5 6 7 8 9
Но если вы поместите в него еще один l oop, он выполнит его перед передачей в следующий l oop из n.
for(int n=0;n<10;n++)
{
for(int m=10;m<15;m++)
{
System.out.println(n + "." + m);
}
}
Это напечатало бы 0,10 0,11 0,12 0,13 0,14 0,15
Все это, прежде чем перейти к 1,10, 1,11, et c ...
Поэтому, когда вы печатаете «*», вы просто зацикливаетесь в этой логике c, и всякий раз, когда вы завершаете внутреннее для вас, вы используете println (который печатает следующую строку)
I предложил бы возиться с переменными, посмотрите, что программа выводит, когда вы переключаете i с помощью j или когда вы меняете условия.
Удачи!