JavaRush /Java блог /Архив info.javarush /Вопрос про инициализацию переменных
MariaM
24 уровень

Вопрос про инициализацию переменных

Статья из группы Архив info.javarush
Сокурсники! Подскажите пожалуйста, наткнулась тут на интересный комментарий от автора статьи.
Вопрос: В чем особенность инициализации локальных переменных? Ответ: Локальные переменные не инициализируются автоматически пустым значением null. Локальную переменную необходимо явно инициализировать с помощью оператора new или присвоив ей пустое значение null.
Но вот тут есть такой момент:
На самом деле процесс инициализации проходит следующим образом:
  • Память, выделенная под новый объект, заполняется двоичными нулями.
  • Конструкторы базовых классов вызываются в описанном ранее порядке. В этот момент вызывается переопределенный метод draw() (да, перед вызовом конструктора класса RoundGlyph), где обнаруживается, что переменная radius равна нулю из-за первого этапа.
  • Вызываются инициализаторы членов класса в порядке их определения.
  • Исполняется тело конструктора производного класса.
У происходящего есть и положительная сторона — по крайней мере, данные инициализируются нулями (или тем, что понимается под нулевым значением для определенного типа данных), а не случайным «мусором» в памяти. Это относится и к ссылкам на объекты, внедренные в класс с помощью композиции. Они принимают особое значение null.
Проверила. Если не присваивать значение, то инициализируются действительно null-ом или значением по умолчанию для примитивных типов. Что имел ввиду автор? Или это ошибка?
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
kharkov Уровень 41
14 августа 2016
скорее всего «особенность инициализации локальных переменных» имеется в виду когда вы где-либо в коде пишите int a; к примеру. Эти строчки относятся к моменту выполнения нити программы… А во второй ссылке речь идет о создании объекта класса с инициализацией начальных значений переменных заданных как ПОЛЯ класса, то есть данные… они действительно инициализируются описанным выше способом… то есть тут отличие в функциональном месте… в первом случае в коде, во втором случае объявленные переменные в блоке данных класса…