Java автоматически инициализирует примитивные переменные в Java 8 [duplicate]

В других словах

  • document.querySelector() выбирает только первый элемент указанного селектора. Поэтому он не выплевывает массив, это одно значение. Подобно document.getElementById(), который извлекает только ID-элементы, поскольку идентификаторы должны быть уникальными.
  • document.querySelectorAll() выбирает все элементы с указанным селектором и возвращает их в массиве. Похоже на document.getElementsByClassName() только для классов и document.getElementsByTagName().

Зачем использовать querySelector?

Используется просто для единственной цели легкость и краткость.

Зачем использовать getElement / sBy? *

Более быстрая производительность.

Почему это различие в производительности?

Оба способа выбора имеют целью создание NodeList для дальнейшего использования. querySelectors генерирует статический NodeList с селекторами, поэтому он должен быть сначала создан с нуля. getElement / sBy * немедленно адаптирует существующий живой NodeList текущего DOM.

Итак, когда использовать какой метод зависит от вас / вашего проекта / вашего устройства.

Infos

Демонстрация всех методов Документация NodeList Тест производительности

23
задан user1329572 27 June 2012 в 18:04
поделиться

5 ответов

Потому что это локальная переменная. Вот почему ему ничего не назначено:

Локальные переменные несколько отличаются; компилятор никогда не присваивает значение по умолчанию неинициализированной локальной переменной. Если вы не можете инициализировать свою локальную переменную там, где она объявлена, не забудьте присвоить ей значение, прежде чем пытаться его использовать. Доступ к неинициализированной локальной переменной приведет к ошибке времени компиляции.

Изменить: почему Java вызывает эту ошибку компиляции? Если мы посмотрим на файл класса IdentifierExpression.java , мы найдем этот блок:

...
if (field.isLocal()) {
            LocalMember local = (LocalMember)field;
            if (local.scopeNumber < ctx.frameNumber && !local.isFinal()) {
                env.error(where, "invalid.uplevel", id);
            }
            if (!vset.testVar(local.number)) {
                env.error(where, "var.not.initialized", id);
                vset.addVar(local.number);
            }
            local.readcount++;
        }
...

Как указано (if (!vset.testVar(local.number)) {), JDK проверяет (с testVar ), если переменная назначена (исходный код Vset , где мы можем найти код testVar). Если нет, он вызывает ошибку var.not.initialized из файла свойств :

...
javac.err.var.not.initialized=\
    Variable {0} may not have been initialized.
...

Источник

44
ответ дан Zakaria 23 August 2018 в 02:18
поделиться
  • 1
    О, ничего себе, сегодня полностью узнал что-то новое! : D – user1329572 23 June 2012 в 00:46
  • 2
    На самом деле это не означает explain "why", не так ли? – kryger 25 April 2016 в 10:56
  • 3
    @kryger См. редактирование. – Zakaria 4 May 2016 в 21:06

Поля классов (не final в любом случае) инициализируются значениями по умолчанию. Локальные переменные не являются.

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

Итак, поле (не final), подобное f в

class C {
  float f;
}

, будет инициализировано 0f, но локальная переменная f в

void myMethod() {
  float f;
}

не будет.

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

6
ответ дан Mike Samuel 23 August 2018 в 02:18
поделиться
  • 1
    +1, Отличная информация о не final бит! : D – user1329572 23 June 2012 в 00:47
2
ответ дан ram 23 August 2018 в 02:18
поделиться

Фактически, компилятор не присваивает значение по умолчанию вашему float f, потому что в этом случае это локальная переменная, а не поле:

Локальные переменные несколько отличаются; компилятор никогда не присваивает значение по умолчанию неинициализированной локальной переменной. Если вы не можете инициализировать свою локальную переменную там, где она объявлена, не забудьте присвоить ей значение, прежде чем пытаться его использовать. Доступ к неинициализированной локальной переменной приведет к ошибке времени компиляции.

14
ответ дан sarnold 23 August 2018 в 02:18
поделиться

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

1
ответ дан user3728743 23 August 2018 в 02:18
поделиться