Инициализировать статическое конечное поле в конструкторе

public class A 
{    
    private static final int x;

    public A() 
    {
        x = 5;
    }
}
  • final означает, что переменная может быть назначена только один раз (в конструкторе).
  • static означает экземпляр класса.

Я не понимаю, почему это запрещено. Где эти ключевые слова мешают друг другу?

Ответ 1

Конструктор будет вызываться каждый раз, когда создается экземпляр класса. Таким образом, приведенный выше код означает, что значение x будет повторно инициализировано каждый раз, когда создается экземпляр. Но поскольку переменная объявлена ​​окончательной (и статической), вы можете сделать это только

class A {    
    private static final int x;

    static {
        x = 5;
    }
}

Но если вы удалите статику, вам будет разрешено сделать это:

class A {    
    private final int x;

    public A() {
        x = 5;
    }
}

ИЛИ это:

class A {    
    private final int x;

    {
        x = 5;
    }
}

Ответ 2

статические конечные переменные инициализируются при загрузке класса. Конструктор может быть назван гораздо позже или совсем не нужен. Кроме того, конструктор будет вызываться несколько раз (с каждым новым объектом), поэтому поле больше не может быть окончательным.

Если вам нужна настраиваемая логика для инициализации статического конечного поля, поместите это в статический блок

Ответ 3

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

Вы должны установить значение при его объявлении

private static final x=5;

Если вам нужна дополнительная логика или более сложное инстанцирование, это можно сделать в статическом блоке инициализации.

Ответ 4

static означает, что переменная уникальна в приложении. final означает, что он должен быть установлен только один раз.

Если вы установите его в своем конструкторе, вы можете установить эту переменную более одного раза.

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

Ответ 5

Финал не означает, что он должен быть инициализирован в конструкторе. Как правило, это делается:

 private static final int x = 5;

static вместо этого означает, что переменная будет использоваться несколькими экземплярами класса. Например:

public class Car {
   static String name;
   public Car(String name) {
      this.name = name;
   }
}

...

Car a = new Car("Volkswagen);
System.out.println(a.name); // Produces Volkswagen

Car b = new Car("Mercedes");
System.out.println(b.name); // Produces Mercedes
System.out.println(a.name); // Produces Mercedes

Есть?

Ответ 6

Подумайте об этом. Вы можете сделать это с помощью своего кода:

A a = new A();
A b = new A(); // Wrong... x is already initialised

Правильные способы инициализации x:

public class A 
{    
    private static final int x = 5;
}

или

public class A 
{    
    private static final int x;

    static
    {
        x = 5;
    }
}