Инициализация переменных класса в конструкторе в Java

1

мы знаем это...

Переменные экземпляра инициализируются в конструкторе по умолчанию. Напр.

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, думаю, что я сделал свой вопрос ясным..

  • 2
    Переменные экземпляра инициализируются значениями по умолчанию в соответствии с их типами.
  • 0
    но эта инициализация выполняется в конструкторе по умолчанию ,, мой вопрос во втором коде ,, вызов конструктора по умолчанию никогда не произойдет ..
Показать ещё 1 комментарий
Теги:
constructor
instance-variables

5 ответов

5
Лучший ответ

В Java экземпляры экземпляров по умолчанию делятся на все биты версии своего значения автоматически (int равно 0, ссылки на объекты равны null, floats равны 0.0, логические значения - false и т.д.). Это не то, что делает конструктор по умолчанию, он выполняется до запуска конструктора.

Заказ:

  1. По умолчанию члены экземпляра имеют значение "все биты". (Оптимизатор может пропустить это, если видит # 2 ниже или, возможно, если он может доказать себе, что ничто не использует член до инициализации на # 3 ниже.)

  2. Примените любую встроенную инициализацию. Например:

    int a = 42;
    
  3. Применяйте блоки инициализации экземпляра в порядке исходного кода.

  4. Вызовите соответствующий конструктор.

Так, например:

class Example {

    int a = 42;

    // Instance initializer block:
    {
        this.a = 67;
    }

    Example() {
        System.out.println(this.a);
    }
}

new Example() 67.

Очевидно, что инициализация в обоих местах, как это было бы плохой практикой, это просто для иллюстрации.

8

По умолчанию неактивные поля инициализируются в java. По умолчанию не инициализируются только переменные внутри методов и конечных полей.

Если бы вы объявили x окончательным, тогда вы были бы правы. У вас будет ошибка компиляции кода.

3

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

2

Переменные экземпляра имеют значения по умолчанию, связанные с ними.

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

  • 0
    Они действительно инициализированы компилятором? Они не просто инициализируются jvm во время выполнения? Потому что, если вы правы, я должен увидеть явные инициализации полей в байт-кодах, сгенерированных компилятором, и я сомневаюсь, что это так.
  • 0
    хорошо этот документ говорит, что они инициализируются компилятором
Показать ещё 3 комментария
1

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

Надеюсь, это помогло.

  • 0
    Что значит «поля внутри методов»? Вы знаете, что уже есть несколько других ответов. Вы должны проработать больше мыслей и предложить примеры и различные точки зрения на ответ, прежде всего, если вы хотите больше голосов. Я бы посоветовал вам проголосовать, если вы уточните подробнее.
  • 0
    Большое спасибо за ваш отзыв. Поскольку очень хороший и иллюстрированный ответ, как уже было дано, я не буду редактировать свой, но я не буду отвечать на будущие ответы, которые я мог бы дать!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню