Ваш код рисует много отдельных точек, поэтому, если вы быстро переместите мышь, у вас будут пробелы. В точке, где вы рисуете заполненный овал, вам нужно добавить что-то, чтобы соединить текущую точку с предыдущей.
Да, это позволяется. final
ключевое слово означает, что Вы не можете изменить значение переменной в ее объеме . Для Вашего примера цикла можно думать о переменной, выходящей из объема у основания цикла, затем возвращаясь в объем с новым значением наверху цикла. Присвоение переменной в цикле не будет работать.
Вы правы для каждого повторения в цикле, Вы создаете новую переменную. Переменные действительно совместно используют то же имя, но это прекрасно, потому что они не находятся в том же объеме. Следующий пример был бы не работа:
final int myFinalVariable = 0;
for(int i=0;i<5;i++){
myFinalVariable = i;
}
Переменная является просто местоположением на стеке. Попытайтесь сохранить свои переменные с максимально небольшим объемом и попытаться сделать их окончательными. Однако объемом и финалом являются просто вещи исходного кода... от генерации кода/VM точка зрения, они действительно не имеют значения вообще.
В Вашем определенном примере, не используя "интервал" никакой мусор не создается. Однако, если бы это были объекты, создаваемые тогда для обоих случаев количество мусора и когда мусор имел бы право на очистку, было бы идентично.
Берут следующий код:
public class X
{
public static void main(final String[] argv)
{
foo();
bar();
}
private static void foo()
{
for(int i=0;i<5;i++)
{
final int myFinalVariable = i;
}
}
private static void bar()
{
for(int i=0;i<5;i++)
{
int myFinalVariable = i;
}
}
}
компилятор производит идентичный байт-код для каждого метода:
public class X extends java.lang.Object{
public X();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: invokestatic #2; //Method foo:()V
3: invokestatic #3; //Method bar:()V
6: return
private static void foo();
Code:
0: iconst_0
1: istore_0
2: iload_0
3: iconst_5
4: if_icmpge 15
7: iload_0
8: istore_1
9: iinc 0, 1
12: goto 2
15: return
private static void bar();
Code:
0: iconst_0
1: istore_0
2: iload_0
3: iconst_5
4: if_icmpge 15
7: iload_0
8: istore_1
9: iinc 0, 1
12: goto 2
15: return
}
Добавление другого метода, который объявляет, переменная вне цикла дает Вам немного отличающийся байт-код из-за порядка, которым переменные объявляются). Обратите внимание, что эта версия переменная не может быть сделана окончательной. Эта последняя версия не является лучшим способом (последняя переменная в цикле является лучшей, если можно сделать это):
private static void car()
{
int myFinalVariable;
for(int i=0;i<5;i++)
{
myFinalVariable = i;
}
}
private static void car();
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iconst_5
4: if_icmpge 15
7: iload_1
8: istore_0
9: iinc 1, 1
12: goto 2
15: return
}