мы знаем это...
Переменные экземпляра инициализируются в конструкторе по умолчанию. Напр.
public class H{
int x;
public static void main(String... args){
System.out.print(new H().x);
}
}
O/P выше кода равен 0, потому что есть конструктор по умолчанию, который вызывается, и этот конструктор инициализировал x в 0.
Теперь, мой вопрос: если мы запустим приведенный ниже код, т.е.
public class H{
int x;
public H(){}
public static void main(String... args){
System.out.print(new H().x);
}
}
Фактический O/P также равен 0, но я думаю, что должна быть ошибка компилятора, что x не инициализируется, потому что мы переопределили конструктор по умолчанию и не инициализировали xI, думаю, что я сделал свой вопрос ясным..
В Java экземпляры экземпляров по умолчанию делятся на все биты версии своего значения автоматически (int
равно 0
, ссылки на объекты равны null
, floats
равны 0.0
, логические значения - false
и т.д.). Это не то, что делает конструктор по умолчанию, он выполняется до запуска конструктора.
Заказ:
По умолчанию члены экземпляра имеют значение "все биты". (Оптимизатор может пропустить это, если видит # 2 ниже или, возможно, если он может доказать себе, что ничто не использует член до инициализации на # 3 ниже.)
Примените любую встроенную инициализацию. Например:
int a = 42;
Применяйте блоки инициализации экземпляра в порядке исходного кода.
Вызовите соответствующий конструктор.
Так, например:
class Example {
int a = 42;
// Instance initializer block:
{
this.a = 67;
}
Example() {
System.out.println(this.a);
}
}
new Example()
67
.
Очевидно, что инициализация в обоих местах, как это было бы плохой практикой, это просто для иллюстрации.
По умолчанию неактивные поля инициализируются в java. По умолчанию не инициализируются только переменные внутри методов и конечных полей.
Если бы вы объявили x окончательным, тогда вы были бы правы. У вас будет ошибка компиляции кода.
Все переменные уровня экземпляра инициализируются значениями по умолчанию независимо от того, был ли перегружен конструктор (или добавлен конструктор без аргументов). Конструктор просто изменяет значение по умолчанию.
Переменные экземпляра имеют значения по умолчанию, связанные с ними.
Значения по умолчанию: не всегда необходимо назначать значение при объявлении поля. Поля, объявленные, но не инициализированные, будут установлены на разумный по умолчанию компилятор. Вообще говоря, это значение по умолчанию будет равно нулю или нулевому, в зависимости от типа данных
Java довольно опрятен программистам (в отличие от других, например, C), это означает, что он автоматически инициализирует поля. Исключением являются конечные поля и поля внутри методов (когда компилятор затем произведет ошибку).
Надеюсь, это помогло.