The difference between the loops is that j is being reset each time in the top example but in the second example it is keeping its value.
In the top example, each time the inner for loop starts j is being reinitalized to 1 so it will go through the 1,2,3 values. When j gets to 3 it will exit the loop which is why you see the j value as 1 then 2. This is run each time the outer loop runs giving you the 0, 1 and 2 for your i values.
In the bottom example j is never reset so it will only increase. The first time through the loop it goes through the 1, 2, 3 values and exits the loop giving you the 01, 02 values you have seen. Since it does not get reset it stays as 3 so as i increases the inner loop will always exit without printing, giving you the output you are seeing.
To get the same output for the bottom example you need to reset the value to 1, which is basically what the first element of the for loop is doing.
int j = 1;
for(int i = 0; i < 3; i++) {
j = 1; //reset the value each time through the outer loop
for(; j < 3; j++) {
System.out.println(i + "" + j);
}
}