Инициализировать статическое конечное поле в конструкторе
85965 просмотра
7 ответа
public class A
{
private static final int x;
public A()
{
x = 5;
}
}
final
означает, что переменная может быть назначена только один раз (в конструкторе).static
означает, что это экземпляр класса.
Я не понимаю, почему это запрещено. Где эти ключевые слова мешают друг другу?
Автор: Yaron Levi Источник Размещён: 12.11.2019 09:04Ответы (7)
174 плюса
Конструктор будет вызываться каждый раз, когда создается экземпляр класса. Таким образом, приведенный выше код означает, что значение x будет повторно инициализироваться при каждом создании экземпляра. Но поскольку переменная объявлена как final (и static), вы можете сделать это только
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;
}
}
Автор: adarshr
Размещён: 23.02.2011 04:32
16 плюса
статические конечные переменные инициализируются при загрузке класса. Конструктор может быть вызван намного позже или не вызываться вообще. Кроме того, конструктор будет вызываться несколько раз (с каждым новым объектом), поэтому поле больше не может быть окончательным.
Если вам нужна пользовательская логика для инициализации статического поля final, поместите его в статический блок
Автор: Sean Patrick Floyd Размещён: 23.02.2011 04:316 плюса
Подумайте о том, что происходит во второй раз, когда вы создаете объект. Он пытается установить его СНОВА, что явно запрещено статическим финалом. Он может быть установлен только один раз для всего класса, а не для экземпляра.
Вы должны установить значение при его объявлении
private static final x=5;
Если вам нужна дополнительная логика или более сложная реализация, это можно сделать в статическом блоке инициализатора.
Автор: rfeak Размещён: 23.02.2011 04:325 плюса
static
означает, что переменная является уникальной в приложении.
final
означает, что он должен быть установлен только один раз.
Если вы установите его в своем конструкторе, вы позволите установить переменную более одного раза.
Следовательно, вы должны инициализировать его напрямую или предложить статический метод для его инициализации.
Автор: ap2cu Размещён: 23.02.2011 04:333 плюса
Окончательный не означает, что он должен быть инициализирован в конструкторе. Обычно это то, что сделано:
private static final int x = 5;
Статический вместо этого означает, что переменная будет совместно использоваться несколькими экземплярами класса. Например :
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
Автор: i.am.michiel
Размещён: 23.02.2011 04:38
2 плюса
Думаю об этом. Вы можете сделать это с помощью своего кода:
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;
}
}
Автор: Lukas Eder
Размещён: 23.02.2011 04:33
0 плюса
public class StaticFinalExample {
/*
* Static final fields should be initialized either in
* static blocks or at the time of declaration only
* Reason : They variables are like the utility fields which should be accessible
* before object creation only once.
*/
static final int x;
/*
* Final variables shuould be initialized either at the time of declaration or
* in initialization block or constructor only as they are not accessible in static block
*/
final int y;
/*
* Static variables can be initialized either at the time of declaration or
* in initialization or constructor or static block. Since the default value is given to the
* static variables by compiler, so it depends on when you need the value
* depending on that you can initialize the variable appropriately
* An example of this is shown below in the main method
*/
static int z;
static {
x = 20; // Correct
}
{
y = 40; // Correct
}
StaticFinalExample() {
z = 50; // Correct
}
public static void main (String args[]) {
System.out.println("Before Initialization in Constructor" + z); // It will print 0
System.out.println("After Initializtion in Constructor" + new StaticFinalExample().z); // It will print 50
}
}
Автор: Kush
Размещён: 05.04.2018 10:59
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- static Почему я не могу объявить статические методы в интерфейсе?
- static Возможны ли статические переменные класса?
- static Почему основной метод Java статичен?
- static Неразрешенный внешний символ на статических членах класса
- static What is the lifetime of a static variable in a C++ function?
- constructor В C ++ конструктор и деструктор могут быть встроенными функциями?
- constructor Сколько аргументов конструктора слишком много?
- constructor Когда для конструктора правильно выбрасывать исключение?
- constructor Что означает явное ключевое слово?
- constructor Конструктор по умолчанию с пустыми скобками
- final неизменный класс должен быть окончательным?
- final Есть ли способ реализовать алгебраические типы в Java?
- final Хорошие причины запретить наследование в Java?
- final переопределить финальные методы Java с помощью отражения или других средств?
- final `final` ключевое слово, эквивалентное для переменных в Python?