Статическая переменная в анонимном блоке в java

Почему мы не можем инициализировать статическую переменную в анонимном блоке в java? Например: Почему этот код не компилируется?

public class A {
  {
      static int a = 1;
  }
}

Я получаю эту ошибку компиляции, говорящую

Недопустимый модификатор для переменной a; разрешен только финал

Почему только финал?


person Nicholas K    schedule 31.03.2016    source источник
comment
таким образом, вы пытаетесь не только инициализировать, но и декларировать, что не разрешено для статических членов.   -  person Alex Salauyou    schedule 31.03.2016
comment
Что вы ожидаете от него? Переменные, объявленные внутри инициализаторов экземпляра, являются локальными переменными, и вы не можете сделать локальную переменную статической...   -  person Jon Skeet    schedule 31.03.2016


Ответы (4)


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

public class A {
    static int a=1;
}

Блоки инициализатора экземпляра вызываются при создании экземпляров до кода в любых конструкторах экземпляров. Поэтому имеет смысл, что вы не можете объявлять там элементы (статические или иные). Это код, как будто внутри конструктора. Пример:

import java.util.Random;

public class Example {
    private String name;
    private int x;
    private int y;

    {                                     // This is the
        this.x = new Random().nextInt();  // instance
        this.y = this.x * 2;              // initializer
    }                                     // block

    public Example() {
        this.name = null;
    }

    public Example(String name) {
        this.name = name;
    }
}

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

Существуют также блоки инициализации static, которые делают то же самое для статических объектов при загрузке класса. Они начинаются с ключевого слова static, подробнее по ссылке выше.

person T.J. Crowder    schedule 31.03.2016

{
      static int a=1;
}

вы не можете иметь модификатор static в блоке кода, a здесь просто локальная переменная

person Ramanlfc    schedule 31.03.2016

Из документов

Блоки инициализации

Компилятор Java копирует блоки инициализатора в каждый конструктор. Следовательно, этот подход можно использовать для совместного использования блока кода несколькими конструкторами.

Код, который вы написали, будет перемещен в конструктор. Статический член, локальный для конструктора, не будет иметь особого смысла они должны быть объявлены на уровне класса, а не локальными для конструктора

И вы видите в сообщении об ошибке разрешается только final, потому что вы можете изменить конечные переменные в конструкторе, если вы еще не инициализировали их во время объявления.

person Suresh Atta    schedule 31.03.2016

вы можете выполнить инициализацию статического поля в статическом блоке. Но не декларация.

public class A{
  static int a;
  static
  {
    a = 1;
  }
}
person tejoe    schedule 31.03.2016