создание последних переменных в цикле

Ваш код рисует много отдельных точек, поэтому, если вы быстро переместите мышь, у вас будут пробелы. В точке, где вы рисуете заполненный овал, вам нужно добавить что-то, чтобы соединить текущую точку с предыдущей.

48
задан Jens Jansson 4 March 2009 в 07:48
поделиться

3 ответа

Да, это позволяется. final ключевое слово означает, что Вы не можете изменить значение переменной в ее объеме . Для Вашего примера цикла можно думать о переменной, выходящей из объема у основания цикла, затем возвращаясь в объем с новым значением наверху цикла. Присвоение переменной в цикле не будет работать.

83
ответ дан Greg Hewgill 7 November 2019 в 22:21
поделиться

Вы правы для каждого повторения в цикле, Вы создаете новую переменную. Переменные действительно совместно используют то же имя, но это прекрасно, потому что они не находятся в том же объеме. Следующий пример был бы не работа:

final int myFinalVariable = 0;
for(int i=0;i<5;i++){
  myFinalVariable = i;
}
12
ответ дан tehvan 7 November 2019 в 22:21
поделиться

Переменная является просто местоположением на стеке. Попытайтесь сохранить свои переменные с максимально небольшим объемом и попытаться сделать их окончательными. Однако объемом и финалом являются просто вещи исходного кода... от генерации кода/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

}
9
ответ дан TofuBeer 7 November 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: