Si te fijas bien en el bucle:
Código
for (int i=0; i<5; i++) { if(i==3){ return; } }
Estoy declarando i como variable local del bucle for. Esto es, que esa variable solo existirá mientras itere el bucle. La razón es simple, no necesito cargar esa variable en la memoria.
Si hiciera algo como:
Código
public class MiClase { private int i=0; // variable de clase.
La variable i existiría todo el tiempo y por lo tanto, estaría todo el tiempo en el Stack de la JVM inncesariamente. Esto no suele ser un problema con pequeños grupos de variables. Lo importante es analizar el problema, y determinar qué variables son necesarias para toda la case, y cuáles son necesarias solo para el bloque (método, bucle) para las necesitarán.